CTF-05

전수경·2023년 5월 25일
0

write-up

목록 보기
4/10
post-thumbnail

1.lololologfile


저번에 FTK Imakger가 잘 안 알려서 못 풀었던 문제를 다시 풀어봐야겠다.

문제 정보에서 누군가가 PDF 파일을 지웠다고 해서 처음에 recycle.bin에 들어갔는데 딱히 PDF 라고 할게 없어서 unallocated space로 들어가봤다.



unallocated space에 7개의 파일이 있는 것이 보이고 처음 파일은 확장자가 pdf인 것을 확인할 수 있었다.


HxD를 이용해서 합쳐주면 파일을 열어 flag를 확인할 수 있다.

2. ex-reg-ex(dreamhack)



문제 정보를 보니 문제에서 요구하는 형식의 문자열을 입력하라고 한다.


문제 페이지에 접속하니 입력할 수 있는 칸이 있고 그에 대한 내용이 밑에 반영해서 뜨는 것 같다.
그럼 코드를 살펴보자.

#!/usr/bin/python3
from flask import Flask, request, render_template
import re

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"

@app.route("/", methods = ["GET", "POST"])
def index():
    input_val = ""
    if request.method == "POST":
        input_val = request.form.get("input_val", "")
        m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
        if m:
            return render_template("index.html", pre_txt=input_val, flag=FLAG)
    return render_template("index.html", pre_txt=input_val, flag='?')

app.run(host="0.0.0.0", port=8000)

친절하게 flag가 여기 있다고 알려준다. flag를 얻기 위해서는 input_val이 코드에서 원하는 형식으로 적어야한다.

 m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
        if m:
            return render_template("index.html", pre_txt=input_val, flag=FLAG)
    return render_template("index.html", pre_txt=input_val, flag='?')

필요한 부분만 확인해 보면 문자는 'dr'로 시작해 5~7개의 단어+ e + 하나 이상의 숫자 + am@ + 3~7개의 소문자 + . + 하나이상의 단어
=>emial+dream이라고 되어 있는 것처럼 약간 이메일 주소 형식 같다.

따라서 조건에 맞게 'dreamhack1am@naver.com'이라고 적으니 Flag가 옳게 나왔다.

3. XSS-1(dreamhack)


문제 정보를 확인하고 접속해보면 세가지 페이지 이동 버튼이 있는 것을 확인할 수 있다.

vul(xss) page로 먼저 들어가보니 vuln?param=으로 열렸다. param에 들어간 값이 페이지에 그대로 적용이 된 것을 알 수 있고 해당 내용으로 Alert가 떴다.


그 다음은 memo로 들어가보니 memo=' '하고 해당 문자열이 밑에 반영되어 나타나는 것을 알 수 있다.

다른 것을 넣어서 페이지를 열면 그대로 반영된다.

위는 flag 창이다 vul?param=에서 넣는 부분을 조작해서 flag를 얻으면 될 거 같다.

#!/usr/bin/python3
from flask import Flask, request, render_template
from selenium import webdriver
import urllib
import os

app = Flask(__name__)
app.secret_key = os.urandom(32)

try:
    FLAG = open("./flag.txt", "r").read()
except:
    FLAG = "[**FLAG**]"


def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome("/chromedriver", options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get("http://127.0.0.1:8000/")
        driver.add_cookie(cookie)
        driver.get(url)
    except Exception as e:
        driver.quit()
        # return str(e)
        return False
    driver.quit()
    return True


def check_xss(param, cookie={"name": "name", "value": "value"}):
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)


@app.route("/")
def index():
    return render_template("index.html")


@app.route("/vuln")
def vuln():
    param = request.args.get("param", "")
    return param


@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST":
        param = request.form.get("param")
        if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'


memo_text = ""


@app.route("/memo")
def memo():
    global memo_text
    text = request.args.get("memo", "")
    memo_text += text + "\n"
    return render_template("memo.html", memo=memo_text)


app.run(host="0.0.0.0", port=8000)

read_url 함수가 실행되면 쿠키를 업데이트하는데

(1) driver.get('http://127.0.0.1:8000/'): 웹 페이지를 접속한다.
(2) driver.add_cookie(cookie): 접속한 웹 페이지에 매개변수로 받아온 cookie를 추가한다.
(3) driver.get(url) , check_xss를 통해서 매개변수로 받아온 xss 값을 이용하여 xss 페이지에 접속한다.

따라서 flag 페이지에서 xss 파라미터를 조작해 FLAG가 적힌 쿠키 값이 추가한 뒤에, 해당 쿠키값을 memo 페이지의 매개변수로 전달하고 memo 페이지에 FLAG가 나타날 것이다. (xss취약점 이용)

공격구문
location.href="/memo?momo="+document.cookie;

(script 태그를 추가하니 벨로그에 자꾸 반영이 되어 빼버렸다. 하지만 추가해서 넣어야한다.)

+location.href 전체 URL을 반환하거나, URL을 업데이트할 수 있는 속성값
documnet.cookie 해당 페이지에서 사용하는 쿠키를 읽고, 쓰는 속성값

profile
Cyber Security

0개의 댓글