Natas Level 25 풀이
로그인
Username: natas25
URL: http://natas25.natas.labs.overthewire.org
배드 보이 버비의 인용문이 있다.
언어를 독일어랑 영어로 설정할 수 있는데, 아래와 같이 lang 파라미터가 붙는다.
소스코드를 보면,
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차적으로 막고 있었다.
하지만 “../” 를 그냥 공백으로만 치환해버리니 “….//”와 같이 쓰면 우회할 수 있다.
시험삼아 “….//….//”를 입력했을 때, 아래와 같은 화면이 나오는 걸 볼 수 있었다.
상위 디렉토리로 잘 이동한 것 같다.
이제 이걸 이용해서 패스워드 파일을 읽어오면 되는데, natas_webpass를 직접적으로 입력값에 넣을 수는 없다.
logRequest() 함수에서 세션아이디 별 로그 파일의 위치(var/www/natas/natas25/logs/natas25_세션아이디.log) 를 알 수 있으므로 해당 파일의 경로를 입력했을 때, 로그파일을 볼 수 있다.
코드에서 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”); ?> 
입력한 쉘이 실행되면서 패스워드가 나온다.




