SWUFORCE/워게임

드림핵 워게임 - session-basic

hmyang444 2026. 5. 11. 16:50

https://dreamhack.io/wargame/challenges/409

 

로그인 | Dreamhack

 

dreamhack.io

 

문제: 쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 플래그 형식은 DH{...} 입니다.

 

먼저 파이썬 파일을 하나 다운로드 받음

app.py을 visual studio code로 열어줌

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()  #뭔가 flag.txt파일을 열어오는 듯
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',  #이게 해당하는 아이디랑 비번인가보다
    'user': 'user1234',  #user의 아이디, 비번도 있고
    'admin': FLAG   #중요부분 -> admin에 대한 비밀번호는 flag로 표시되어 있음
}


# this is our session storage
session_storage = {             # session_strage가 있네..
}


@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)   
    try:
        # get username from session_storage
        username = session_storage[session_id]  
    except KeyError:
        return render_template('index.html')

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':             #POST일 때 username, password를 읽어옴
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            # you cannot know admin's pw
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:          #pw가 password랑 일치하면
            resp = make_response(redirect(url_for('index')) )
            session_id = os.urandom(32).hex()     #중요!! -> session_id를 랜덤으로 hex값으로 바꾸는 것 같음
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp
        return '<script>alert("wrong password");history.go(-1);</script>'


@app.route('/admin')
def admin():
    # developer's note: review below commented code and uncomment it (TODO)

    #session_id = request.cookies.get('sessionid', None)
    #username = session_storage[session_id]
    #if username != 'admin':
    #    return render_template('index.html')

    return session_storage


if __name__ == '__main__':
    import os
    # create admin sessionid and save it to our storage
    # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

처음 파이썬 코드를 읽을 때는 너무 어려워서 꽤 오랜 시간 코드를 읽어보려고 노력했던 것 같음..

파이썬 코드를 실행시켰을 때,, 저렇게 화면이 떴는데

당시의 나는 그냥 오류인가보다 하고 별 신경을 안 씀ㅋ...............

 

 

그리고 해당 login페이지를 열어보았음

 

아직은 잘 모르겠으니까 알고 있는 guest - guest로 로그인을 해줌

그랬더니 "Hello guest, you are not admin" 이라고 내용이 뜸  --> 파이썬 코드에서 본 것!

이 문제가 session, cookie인만큼 작업자도구를 열어서 application값을 확인 안해줄 수가 없었다.

 

cookie에 들어가보니 guest로 로그인을 했을 때, sessionid(난수)가 생성되는 것을 확인할 수 있었음

지금 보이는 guest의 sessionid의 값을 admin의 sessionid로 바꿔주면 되는 것 아닐까??? 약간 알 것 같은데 모르는 것 같은 느낌인..이상한 느낌

 

아까 python코드를 다시 보면
session_id = os.urandom(32).hex()  라고 되어있는데

이를 찾아보니 session_id를 랜덤 난수로 만들어주는데, 32byte를 hex값으로(16진수) 바꿔준다고 함

그니까 이게 랜덤값이다 보니까 guest로 다시 로그인하면 새로운 session_id 값이 생기게 됨

 

 

그리고 나서 아무리 python 코드를 쳐다보고, 로그인을 해봐도 전혀.. 잘 모르겠어서  약간의 도움을 얻음....ㅠㅠ

 

>>> app.route()를 유의해서 볼 것(처음보는 거였는데)
@app.route('/admin')  # /admin으로 들어가면 되는 것이었음

# @app.route: 해당 앱의 URL을 함수에 쉽게 할당하기 위해 제공하는 파이썬 데코레이터 / 첫번째 매개변수는 URL
def admin():
    # developer's note: review below commented code and uncomment it (TODO)

    #session_id = request.cookies.get('sessionid', None)
    #username = session_storage[session_id]
    #if username != 'admin':
    #    return render_template('index.html')

    return session_storage

 

소름돋게도 admin() 함수는 session_storage를 반환한다고 함 --> sessionid가 있을 것이라고 판단

다시 보니까 경고창 밑에 들어갈 url이 있었음

 

 

 

눌러봤더니 admin이 뜸!

admin의 sessionid라고 생각해서 이것을 바꿔주기로 했음

ㅣㅇ게 진짜일 리 없어...

아무리 바꿔주고 세로고침을 해도 전혀 flag가 뜨지 않음

오류인가...이게 진짜 맞을텐데..

 

어떤 사람들은 burp suite에서 한다고 하길래 나도 따라해봤는데

근데 이건 자꾸 hhtp를 입력하면 오류가 자꾸 떠서 다시 맘을 다잡고 해당 서버에서 해보기로 했음

(서버를 알려준 이유가 있겠지;;;)

 

 

다시 login페이지에 들어가서 guest로 로그인한 후

그 해당 페이지에다가 /admin을 쳐주었더니...! 

내가 로그인한 모든 흔적들이 나오면서 admin에 대한 sessionid가 나옴!!

너무 급해서 캡쳐를 안하고 나옴ㅎ

 

admin의 sessionid를 복사하고 다시 원래 창으로 돌아와서 sessionid값을 수정하고 세로고침을 하니까 flag가 바로 나옴!!

힘들었다....

 

 

# python의 app.route 에 대한 지식 --> 따로 정리

# 페이지를 다시 띄우는 게 아니라 주어진 페이지에서 /admin만 쳐서 창을 왔다갔다가 하기....

 

 

'SWUFORCE > 워게임' 카테고리의 다른 글

워게임 - Steg-Pack  (0) 2026.05.12
Python - Flask 프레임워크/ @app.route()  (1) 2026.05.12
Window Search + edb파일  (0) 2026.05.05
워게임 - Windows Search  (0) 2026.05.05
워게임 - code & art  (0) 2026.05.01