#!/usr/bin/python3
from flask import Flask, request, render_template, abort
from functools import wraps
import requests
import os, json
users = {
'0': {
'userid': 'guest',
'level': 1,
'password': 'guest'
},
'1': {
'userid': 'admin',
'level': 9999,
'password': 'admin'
}
}
def internal_api(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.remote_addr == '127.0.0.1':
return func(*args, **kwargs)
else:
abort(401)
return decorated_view
app = Flask(__name__)
app.secret_key = os.urandom(32)
API_HOST = 'http://127.0.0.1:8000'
try:
FLAG = open('./flag.txt', 'r').read() # Flag is here!!
except:
FLAG = '[**FLAG**]'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/get_info', methods=['GET', 'POST'])
def get_info():
if request.method == 'GET':
return render_template('get_info.html')
elif request.method == 'POST':
userid = request.form.get('userid', '')
info = requests.get(f'{API_HOST}/api/user/{userid}').text
return render_template('get_info.html', info=info)
@app.route('/api')
@internal_api
def api():
return '/user/<uid>, /flag'
@app.route('/api/user/<uid>')
@internal_api
def get_flag(uid):
try:
info = users[uid]
except:
info = {}
return json.dumps(info)
@app.route('/api/flag')
@internal_api
def flag():
return FLAG
application = app # app.run(host='0.0.0.0', port=8000)
# Dockerfile
# ENTRYPOINT ["uwsgi", "--socket", "0.0.0.0:8000", "--protocol=http", "--threads", "4", "--wsgi-file", "app.py"]
문제 파일에 파이썬 파일 하나 있었고, 코드는 위에 적어놨습니다.
@app.route('/get_info', methods=['GET', 'POST'])
def get_info():
if request.method == 'GET':
return render_template('get_info.html')
elif request.method == 'POST':
userid = request.form.get('userid', '')
info = requests.get(f'{API_HOST}/api/user/{userid}').text
return render_template('get_info.html', info=info)
@app.route('/api')
@internal_api
def api():
return '/user/<uid>, /flag'
@app.route('/api/user/<uid>')
@internal_api
def get_flag(uid):
try:
info = users[uid]
except:
info = {}
return json.dumps(info)
@app.route('/api/flag')
@internal_api
def flag():
return FLAG
이 부분을 보면, 최종적으로 /api/flag를 return하게 만들어서 flag를 받으면 되는 것 같습니다...
사실 모르겠어서 실행 시켜보고 오겠습니다.

처음에 들어가면 위 사진처럼 화면이 뜨구요,

get user info를 누르면 다음과 같이 뜹니다. 코드에서 guest랑 admin계정을 줘서 일단 그걸로 들어가 보겠습니다.
1) guest계정 접속(이 아니라 조회)

아, 그냥 이렇게 조회만 되네요... 진짜 info였어요..ㅎ
근데 view를 누르니까 guest써있는 부분이 짧았지만 '0'이 됐다가 결과가 나왔거든요? .. 사실 어떻게 할 지는 모르겠는데 코드에서 userid 0이 guest잖아요... 네 뭐 그렇다구요..ㅎㅎㅎ
2)admin 계정 조회

네. 그냥 똑같이 나와요.
@app.route('/get_info', methods=['GET', 'POST'])
def get_info():
if request.method == 'GET':
return render_template('get_info.html')
elif request.method == 'POST':
userid = request.form.get('userid', '')
info = requests.get(f'{API_HOST}/api/user/{userid}').text
return render_template('get_info.html', info=info)
지금 본 페이지가 이거를 바탕으로 구성된 페이지 같거든요? 여기를 보면, 요청할 때 API_HOST/api/user/userid를 보내잖아요... 그리고 제가 입력한 게 userid에 입력되는 것 같구요.
flag는 api/flag에 있다고 했으니까 guest말고 다른 걸 넣어보면 어떨까 싶습니다.

flag라고 치면 저렇게 아무것도 안 뜹니다.
아, 그냥 패킷이 어떻게 날라가는지 가로채보는 것도 좋을 것 같아요. burp suite를 켜보겠습니다.

이렇게 잡았구요, 내용을 살펴보겠습니다.

이게 내용입니다. 마지막에 있는 user id를 수정하면 바뀌지 않을까... 싶습니다.

flag로 바꿔보고 올려볼게요

쓰읍 아무것도 안 나와요.

하나 폴더 위로 올라가서 flag로 가라고 했는데 응답이 없더라구요. 밑에 보니까 서버에 접속할 수 없다는데... VM이 분명 2시간이 안 지났는데도 꺼졌어요... 이게 무슨 일이지...

다시 하니까 잘 나왔습니다!!

사실 그동안은 제미나이한테 어떤 방향으로 풀어야할지부터 물어보는 경우가 진짜 많았는데, 이번에는 스스로 방향도 잡고 풀이도 괜찮게 한 것 같아서 굉장히 뜻깊습니다!!
'SWUFORCE > 워게임' 카테고리의 다른 글
| [Dreamhack]Path Finder (0) | 2026.03.31 |
|---|---|
| [추가공부] 파이썬 request.remote_addr (0) | 2026.03.24 |
| [추가 공부]diff (0) | 2026.02.17 |
| whatsdifferent (0) | 2026.02.17 |
| [추가 공부]빅 엔디안 vs 리틀 엔디안 (0) | 2026.02.10 |