문제정보
flask로 작성된 image viewer 서비스 입니다.
SSRF 취약점을 이용해 플래그를 획득하세요. 플래그는 /app/flag.txt에 있습니다.
Keypoint
Hex 인코딩 && Brute Force
Python
#!/usr/bin/python3
from flask import (
Flask,
request,
render_template
)
import http.server
import threading
import requests
import os, random, base64
from urllib.parse import urlparse
app = Flask(__name__)
app.secret_key = os.urandom(32)
try:
FLAG = open("./flag.txt", "r").read() # Flag is here!!
except:
FLAG = "[**FLAG**]"
@app.route("/")
def index():
return render_template("index.html")
@app.route("/img_viewer", methods=["GET", "POST"])
def img_viewer():
if request.method == "GET":
return render_template("img_viewer.html")
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)
local_host = "127.0.0.1"
local_port = random.randint(1500, 1800)
local_server = http.server.HTTPServer(
(local_host, local_port), http.server.SimpleHTTPRequestHandler
)
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)
메인화면
코드와 비교를 해보면 url에 입력한 /static/dream.png를 입력하면 http://localhost:8000:static/dream.png 로 연결이 된다.
또한 url에 localhost 또는 127.0.0.1 을 입력하면 아래와 같이 error.png를 보여준다.
따라서 localhost를 Hex로 인코딩하여 보내고, 포트번호는 위의 코드를 통해 1500부터 1800까지의 랜덤이라는것을 알 수 있다.
위 두가지 사실을 이용하여 Burp suite에서 브루트포스를 했다.(http://0x7f000001:1500 ~ http://0x7f000001:1800)
1500 포트부터 1800포트까지 순서대로 해야하기 때문에, 페이로드 타입을 Numbers로 설정했다.
스캔 결과 1675번 포트에서 다른 결과가 나왔다.
이제 해당 이미지 주소를 base64 디코딩하면 된다.
디코딩하면 flag.txt가 있는것을 확인할 수 있고,
최종적으로 url에 http://0x7f000001:1675/flag.txt 를 입력하고 다시 디코딩하면 flag가 나온다.
'DreamHack > web' 카테고리의 다른 글
[wargame] simple_sqli_chatgpt (0) | 2023.07.15 |
---|---|
[wargame] 🌱 simple-web-request (0) | 2023.07.15 |
[wargame] ex-reg-ex (0) | 2023.07.15 |
[wargame] Flying Chars (0) | 2023.07.15 |
[wargame] phpreg (0) | 2023.07.14 |