Sh4n3e

[웹해킹][Natas] Natas11 문제 풀이 본문

Wargame/ NATAS

[웹해킹][Natas] Natas11 문제 풀이

sh4n3e 2017. 11. 28. 13:52

문제의 URL을 접속하면 아래와 같다.

[URL : http://natas11.natas.labs.overthewire.org]



문제를 보면 쿠키값이 XOR 암호화 방식으로 보호되어 있다. 라고 써있다. 음.. 그렇군 하며 Source코드를 보러간다.



처음보는 사람은 "읭? 이게 머지....." 라고 할지도 모른다.

그냥 봤을때 복잡해 보이니까...? 하지만 간단하게 생각하면된다.

게다가 문제자체에 힌트가 주어져있다. XOR방식으로 암호화 했단다.

그럼 한번 시작해보자.


1
2
3
4
5
6
<?
if($data["showpassword"== "yes") {
    print "The password for natas12 is <censored><br>";
}
 
?>
cs


우선 해당 문제는 $data["showpassword"]가 yes면 natas12의 password를 보여주는 것이다.

그럼 $data["showpassword"]가 어디에 존재하는지 천천히 살펴보자.


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
43
44
45
<?
 
$defaultdata = array"showpassword"=>"no""bgcolor"=>"#ffffff");
 
function xor_encrypt($in) {
....
}
 
function loadData($def) {    
    global $_COOKIE;    
    $mydata = $def;
    //최초 mydata는 매개변수로 받은 $def 즉, $defaultdata 값
    if(array_key_exists("data"$_COOKIE)) { 
        //COOKIE값중에 data가 존재한다면?
        $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
        //Coocike값의 data값을 base64로 디코딩하고, xor_encryypt함수에 넣어 결과를 json형태로 인코딩된 것을 디코딩.
        //결론적으로 이 값은 애초에 json형태로 인코딩되어있었던 값이란 소리.
        if(is_array($tempdata&& array_key_exists("showpassword"$tempdata&& array_key_exists("bgcolor"$tempdata)) {
            if (preg_match('/^#(?:[a-f\d]{6})$/i'$tempdata['bgcolor'])) {
                $mydata['showpassword'= $tempdata['showpassword'];
                //$mydata의 showpassword에 tempdata의 showpassword 값을 넣어줌
                $mydata['bgcolor'= $tempdata['bgcolor'];
            }
        }
    }
    return $mydata;
}
 
function saveData($d) {
    setcookie("data"base64_encode(xor_encrypt(json_encode($d))));
    //호출된 함수는 cookie를 세팅하는데, 이 값은 매개변수로 넘거받은 $d를 가지고 한다.
    // json형태로 인코딩하고, 이것을 xor_encrypt하고, base64형태로 인코딩하여 
}
 
$data = loadData($defaultdata);
//이렇게해서 retrun된 값을 $data에 넣고
 
....
 
saveData($data);
//해당 $data를 saveData값으로 하여 함수 호출
 
 
 
?>
cs


기본적인 흐름은 위의 주석과 같다.

그럼 결론적으로 우리는 showpassword값을 yes로 가지는 값으로 cookie를 세팅해주면 된다는 말이다...

하지만 xor_encrypt()함수를 복원(?)해줘야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
function xor_encrypt($in) {
    $key = '<censored>';
    $text = $in;
    $outText = '';
 
    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }
 
    return $outText;
}
?>
cs


가장 중요한 key값이 존재하지 않는다. 하지만 우리가 xor에 대한 이해가 조금이라도 있다면 이 문제는 의외로 쉽게 풀릴 수 있을 것이다.


A^B = C 라고 했을 때, A^C는 무엇일까?

XOR의 성질에 의해 A^C=B가 된다. 그럼 우리는 이것을 이용해 문제를 풀면된다.




Cookie로 세팅되어있는 data값을 가지고,



똑같은 PHP환경에서의 코드를 가지고 Key값을 복원해 보았다.



키는 간단하게 qw8J라는 값이었다. 그럼 이것을 가지고 다시한번 세팅할 Cookie값을 만들어 내는 코드를 작성했다.



고로 아래의 결과를 도출해 낼 수 있었다.



이 결과값을 가지고 data값을 변조하여 Request해보자.



Burp Suite를 이용하여 Request한 결과는 아래와 같다.



우리는 결국엔 natas12로 갈 수 있는 암호를 얻어낼 수 있었다.


The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

Comments