[문제 분석]
웹 사이트에 접속하면 다음과 같은 창이 뜬다.
Image Viewer를 클릭해서 해본 결과 밑의 결과가 뜬다.
flag는 /app/flag.txt에 있다고 한다. 이것을 잘 찾아서 봐야될 것 같다. app.py에 대한 코드 분석을 해보겠다.
#!/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
)
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)
/img_viewer에서 POST로 입력한 url을 보내고 그것을 통해 img를 여는 형식이다.
local_host가 127.0.0.1 로 되어 있기 때문에 외부에서 접근하는 것은 불가능하다.
따라서 위에 POST 부분에서도 localhost, 127.0.0.1로 접근하는 것들에 대해서는 error.png를 띄우면서 접근을 막고 있다.
/app/flag.txt 를 입력해보았다.
f12를 통해 분석해보느 base64로 인코딩된 이미지임을 볼 수 있다. 얘를 한번 디코딩해보겠다.
어림도 없었다. 역시 localhost의 접근이 막혀있는 상태여서 이것을 뚫어야 했다.
[Wirte Up]
1. 127.0.0.1을 우회해야 한다
2. port 번호를 1500에서 1800 사이의 랜덤한 number로 쓰고 있기 때문에 이것 역시 알아야 한다.
우선 IP를 우회해보겠다.
127.0.0.1을 가리키는 HEX값으로 우회할 수 있는데 HEX값은 0x70000001이다. 이를 10진수로 바꾸면 2130706433이 된다.
되는지 우선 테스트 해보겠다.
http://2130706433:8000/static/dream.png
포트 8000으로 설정한 후 접근이 가능한지 확인 결과 접근이 가능한 것을 알 수 있었다. 이제 flag을 얻기 위해선 port 번호만 1500에서 1800 사이의 랜덤한 수 중에 하나를 찾으면 됐다.
사용 tool은 Burp Suite를 썼다.
이미 알고있는 루트인 http://2130706433:8000/static/dream.png 를 통해 찾아보겠다.
이를 통해 8000번 포트와 똑같은 정보를 가지는 포트 번호를 찾으면 된다.
Length가 똑같은 Port 번호를 찾았다. Port는 1742 이다.
1번과 2번 모두 찾았기 때문에 답만 구하면 된다. 여기서 서버가 내부 /app 에서 실행되고 있기 때문에 /flag.txt만 붙이면 그게 정답이 된다.
정답
http://2130706433:1742/flag.txt
img 하나가 뜨고 그것을 f12를 통해 보니 src에 해당하는 것이 base64로 인코딩 되어있고 뒤에 인코딩 문자열이 쭉 있다.
이를 디코딩 해보면 밑의 그림과 같다.
정답을 찾았다.
'Web Hacking' 카테고리의 다른 글
[WebHacking] - Dreamhack blind-command 문제 풀이 (0) | 2024.08.19 |
---|---|
[WebHacking] - Dreamhack Carve Party 문제 풀이 (0) | 2024.08.18 |
[WebHacking] - Dreamhack : file-download-1 문제 풀이 (File Vulnerability) (0) | 2024.08.18 |
[WebHacking] - Dreamhack image-stroage 문제 풀이 (File Vulnerability) (0) | 2024.08.18 |
[WebHacking] - Dreamhack command-injection-1 문제 풀이 (command injection) (0) | 2024.08.17 |