본문 바로가기

사이버보안공부

Session wargame

오늘은 드림핵 세션 워게임 실습문제를 풀이해보겠다.

먼저 소스코드를 보면

#!/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()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG
}

# this is our session storage 
session_storage = {
}

@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':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            session_id = os.urandom(32).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():
    return session_storage

if __name__ == '__main__':
    import os
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

이렇게 되는데 소스코드에서 guest, user, admin 총 3개의 계정이 존재하고,

입력한 패스워드를 검사하여 저장된 계정이 있을때 해당 계정에 대한 sessionid를 생성하여

session_storage 배열에 username을 추가하는 모습을 보인다.

 

우선 문제 사이트에 접속해보았다.

접속을 하면 위와 같은 창이 뜬다.

아까 소스 코드로 3개의 계정이 있는 것을 확인했으니 GUEST로 먼저 로그인 해보았다.

세션 관련 문제이기 때문에 개발자도구를 열어서 먼저 쿠키부분을 확인해보았다.

그랬더니 sessionid라는 이름으로 쿠키의 값이 노출되어 있는 것을 볼 수 있었다.

계정마다 주어진 sessionid가 있는 것을 확인하고,

그 다음에 admin의 sessionid 값을 어떻게 접근해야되는지 고민을 해보았는데

@app.route('/admin')
def admin():
    return session_storage

이 코드를 보고 URL 뒤에 /admin 엔드포인트를 url로 접속해보았다.

그랬더니

session_storage에 저장된 값이 다 나왔다.

저기서 admin에 해당하는 값을 복사해서 sessionid에 붙여넣기를 하면 flag가 나올거라고 생각했다.

sessionid값을 넣어주고, username은 admin으로 변경하였더니

다음과 같이 flag를 찾아 낼 수 있었다.

세션에 대한 기초적인 지식만 있다면 충분히 풀 수 있는 문제였다!

'사이버보안공부' 카테고리의 다른 글

Ping of Death?  (0) 2023.07.18
Smurf Attack?  (0) 2023.07.17
DVWA Command Injection 문제 풀이(low level)  (0) 2023.07.14
나만을 위한 포너블용 우분투 도커설치  (0) 2023.07.14
내가 만든 쿠키~~란 무엇일까?  (0) 2023.07.14