βœ’οΈ Capture The Flag (CTF)

[PwnMe CTF 2023] Tree Viewer WriteUp

A Lim Han 2023. 5. 7. 20:36

# Tree Viewer WriteUp

 

1. λ¨Όμ € 문제λ₯Ό ν™•μΈν•œ ν›„, μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—΄μ–΄ μ›ΉνŽ˜μ΄μ§€λ‘œ 접속

 

 

 

 

2. 접속 ν›„ μ•„λž˜μ™€ 같은 화면을 확인

 

 

 

 

3. μ‚¬μš©μž μž…λ ₯λž€μ— '12', '/hoho/23'μ΄λΌλŠ” 값을 μž…λ ₯ν•΄λ³Έ κ²°κ³Ό μ•„λž˜μ™€ 같은 좜λ ₯을 확인할 수 μžˆμ—ˆλ‹€.

 

 

 

 

4. 메인 ν™”λ©΄μ˜ Source code 뢀뢄을 μ—΄μ–΄ μ½”λ“œλ₯Ό ν™•μΈν•˜μ˜€λ‹€.

<?php
$parsed = isset($_POST['input']) ? $_POST['input'] : "/home/";

preg_match_all('/[;|]/m', $parsed, $illegals, PREG_SET_ORDER, 0);
if($illegals){
    echo "Illegals chars found";
    $parsed = "/home/";
}

if(isset($_GET['source'])){
    highlight_file(__FILE__);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tree Viewer</title>
</head>
<body>
    <a href="/?source">Source code</a>
    <hr/>
    <form action="/" method="post">
        <label for="input">Directory to check</label>
    <input type="text" placeholder="Directory to see" id="input" name="input" value="<?= $parsed ?>">
    </form>

    <h3>Content of <?= $parsed ?>: <?= shell_exec('ls '.$parsed); ?></h3>
    
</body>
</html>

+ μ½”λ“œμ˜ 첫 λΆ€λΆ„μ—μ„œ μž…λ ₯된 폴더 경둜λ₯Ό νŒŒμ‹± 

-->  μž…λ ₯된 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜, 정상적인 λ¬Έμžκ°€ μ•„λ‹Œ ' ; ' λ˜λŠ” ' | '와 같은 λ¬Έμžκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” 경우 경둜λ₯Ό "/home/"으둜 λŒ€μ²΄

 

+ HTML 폼을 λ Œλ”λ§ν•˜μ—¬ μ‚¬μš©μžκ°€ Directory to check 라벨 ν•˜λ‹¨μ— 폴더 경둜λ₯Ό μž…λ ₯ν•  수 있게 함 

-->  μž…λ ₯ ν•„λ“œλŠ” input μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ POST μš”μ²­μ„ 톡해 전솑

 

+ h3 νƒœκ·Έ μ‚¬μ΄μ˜ 값은 ν˜„μž¬ 경둜의 파일과 폴더λ₯Ό 보여주며, shell_exec() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 경둜의 파일과 폴더 좜λ ₯

 

 

 

 

5. μ†ŒμŠ€μ½”λ“œμ˜ 취약점을 μ΄μš©ν•˜μ—¬ μ•„λž˜μ™€ 같은 μž…λ ₯κ°’λ“€λ‘œ μ‹œλ„ν•΄λ³΄μ•˜λ‹€.

λ‹€μ–‘ν•œ μž…λ ₯κ°’μœΌλ‘œ μ‹œλ„ν•΄λ³΄μ•˜μ§€λ§Œ, κ²°κ΅­ FLAGλ₯Ό 찾지 λͺ»ν–ˆλ‹€.

 

+ μ‹œλ„ν•œ μž…λ ₯κ°’λ“€

$(cat /home/flag.txt)
`cat /home/flag.txt`
system("cat /home/flag.txt")
$(cat /home/flag.txt)
$(cat /home/flag.txt >&2)
$(ls /home/; cat /home/flag.txt)
$((cat /home/flag.txt))
${cat,/home/flag.txt}
/home/flag && cat /home/flag.txt
/home/11; cat /home/flag.txt
/home/flag.txt