본문 바로가기

웹해킹/CTF

NahamCon CTF 2022 Personel Writeup

반응형

NahamCon CTF 2022 Personel, Flaskmetal_Alchemist Writeup

 

NahamCon CTF 2022 Web Writeups

 

1. Personel Writeup

Description

A challenge that was never discovered during the 2021 Constellations mission... now ungated :)

Personel Writeup

Personel 문제 페이지이다. 문제 페이지에서 Name을 검색할 수 있다. 이때 Name을 비워두고 검색하면 모든 사람의 내용이 출력된다.

 

먼저 문제를 풀기 위해 app.py 코드부터 확인해보자.

 

#!/usr/bin/env python

from flask import Flask, Response, abort, request, render_template
import random
from string import *
import re

app = Flask(__name__)

flag = open("flag.txt").read()
users = open("users.txt").read()

users += flag


@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("lookup.html")
    if request.method == "POST":
        name = request.form["name"]
        setting = int(request.form["setting"])
        if name:
            if name[0].isupper():
                name = name[1:]

        results = re.findall(r"[A-Z][a-z]*?" + name + r"[a-z]*?\n", users, setting)
        results = [x.strip() for x in results if x or len(x) > 1]

        return render_template("lookup.html", passed_results=True, results=results)


if __name__ == "__main__":
    app.run()

먼저 루트에서 GET, POST 메소드를 사용하는데 GET메소드로는 render template를 가져오고, POST메소드에선 name과 setting을 가져온다. 이름을 검색할 때 결과를 result 변수에 저장한다. result 변수를 보면 정규식이 있다.

 

r"[A-Z][a-z]*? : 하나의 대문자로 시작하고, 0개 이상의 소문자가 뒤에 붙는다.
name : 웹사이트에서 입력한 Name이다.
r"[a-z]*?\n" : 0개 이상의 소문자와 개행으로 끝나는 문자이다.
users : 사용자 이름이지만 user + flag 이기에 flag가 같이 붙어있다.
setting - re.findall() : 정규식과 매치되는 모든 문자열을 리스트 형식으로 리턴한다.

 

정규식에서 대문자로 시작하기 때문에 flag를 직접적으로 찾을 수가 없다. 따라서 다른 입력을 넣어서 해결해야 한다.

 

 solution

첫 번째, setting=2&a.* 전송

Windows PowerShell에서 curl -X POST -d "setting=2&name=a.*" http://challenge.nahancon.com:31369 | findstr "flag"

 

두 번째, setting=2&name={[a-z0-9]*} 전송

 

 

728x90