Post

Natas Level 25 풀이


로그인


Username: natas25
URL: http://natas25.natas.labs.overthewire.org


배드 보이 버비의 인용문이 있다.

언어를 독일어랑 영어로 설정할 수 있는데, 아래와 같이 lang 파라미터가 붙는다.


Desktop View


소스코드를 보면,

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
    // cheers and <3 to malvina
    // - morla

    function setLanguage(){
        /* language setup */
        if(array_key_exists("lang",$_REQUEST))
            if(safeinclude("language/" . $_REQUEST["lang"] ))
                return 1;
        safeinclude("language/en"); 
    }
    
    function safeinclude($filename){
        // check for directory traversal
        if(strstr($filename,"../")){
            logRequest("Directory traversal attempt! fixing request.");
            $filename=str_replace("../","",$filename);
        }
        // dont let ppl steal our passwords
        if(strstr($filename,"natas_webpass")){
            logRequest("Illegal file access detected! Aborting!");
            exit(-1);
        }
        // add more checks...

        if (file_exists($filename)) { 
            include($filename);
            return 1;
        }
        return 0;
    }
    
    function listFiles($path){
        $listoffiles=array();
        if ($handle = opendir($path))
            while (false !== ($file = readdir($handle)))
                if ($file != "." && $file != "..")
                    $listoffiles[]=$file;
        
        closedir($handle);
        return $listoffiles;
    } 
    
    function logRequest($message){
        $log="[". date("d.m.Y H::i:s",time()) ."]";
        $log=$log . " " . $_SERVER['HTTP_USER_AGENT'];
        $log=$log . " \"" . $message ."\"\n"; 
        $fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");
        fwrite($fd,$log);
        fclose($fd);
    }
?>

    <h1>natas25</h1>
    <div id="content">
    <div align="right">
    <form>
    <select name='lang' onchange='this.form.submit()'>
    <option>language</option>
    <?php foreach(listFiles("language/") as $f) echo "<option>$f</option>"; ?>
    </select>
    </form>
    </div>

    <?php  
        session_start();
        setLanguage();
        
        echo "<h2>$__GREETING</h2>";
        echo "<p align=\"justify\">$__MSG";
        echo "<div align=\"right\"><h6>$__FOOTER</h6><div>";
    ?>




풀이


코드를 살펴보면 언어파일을 불러오는 함수와

파일 이름에 ../ 가 있으면 공백으로 필터링하고, natas_webpass 가 있으면 이전 페이지로 돌아가는 함수가 있다.

lang 파라미터로 파일을 읽을 수 있는 걸 이용하여 디렉토리 트래버설 공격을 할 수 있는데, 이를 1차적으로 막고 있었다.

하지만 “../” 를 그냥 공백으로만 치환해버리니 “….//”와 같이 쓰면 우회할 수 있다.

시험삼아 “….//….//”를 입력했을 때, 아래와 같은 화면이 나오는 걸 볼 수 있었다.


Desktop View


상위 디렉토리로 잘 이동한 것 같다.

이제 이걸 이용해서 패스워드 파일을 읽어오면 되는데, natas_webpass를 직접적으로 입력값에 넣을 수는 없다.

logRequest() 함수에서 세션아이디 별 로그 파일의 위치(var/www/natas/natas25/logs/natas25_세션아이디.log) 를 알 수 있으므로 해당 파일의 경로를 입력했을 때, 로그파일을 볼 수 있다.


Desktop View


코드에서 HTTP User Agent 는 따로 검증하고 있지 않으므로 여기에 적절한 스크립트를 넣어 전송하면 된다.

HTTP User Agent: 웹 브라우저, 모바일 앱, 스크립트 등 클라이언트가 웹 서버에 요청(Request)을 보낼 때 자신의 정체를 알리기 위해 사용하는 문자열 정보. 클라이언트의 이름, 버전, 운영 체제, 렌더링 엔진 등을 포함한다.

User Agent의 역할

  • 클라이언트 식별 : 웹 서버는 User Agent를 사용하여 요청을 보낸 클라이언트가 어떤 종류(브라우저, 스크립트, 봇 등)인지 파악합니다.
  • 맞춤화된 콘텐츠 제공 : User Agent 정보를 기반으로 서버는 클라이언트 환경(브라우저 종류, 운영 체제 등)에 맞는 콘텐츠를 제공합니다. 예: 모바일 디바이스에는 모바일 친화적인 레이아웃 제공.
  • 트래픽 분석 : 서버는 User Agent 데이터를 로그에 기록하여 트래픽 소스를 분석하거나 클라이언트 사용 통계를 확인할 수 있습니다.
  • 보안 및 차단 : 서버는 특정 User Agent를 차단하거나 제한하여 악의적인 봇이나 스크립트의 접근을 막을 수 있습니다.


다시 로그파일을 읽어오는 파일을 요청할 때, 이를 인터셉트해서 user agent에 아래와 같은 스크립트를 써서 보낸다.

<? echo shell_exec(“cat /etc/natas_webpass/natas26”); ?>
Desktop View


입력한 쉘이 실행되면서 패스워드가 나온다.


Desktop View

This post is licensed under CC BY 4.0 by the author.