๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Capture The Flag (CTF)

[PwnMe CTF 2023] Tree Viewer WriteUp

by A Lim Han 2023. 5. 7.

# 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