문제 정보
쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.
풀이 힌트
1. 무차별 공격
문제 풀이
문제 사이트에 들어가니, 이와 같은 페이지가 출력되었다.
기능은 Login 기능만 있는 사이트이다.
공격 백터는 POST로 서버로 넘어가는 username과 password가 있었다.
혹시 guest / guest로 로그인이 되는지 확인해봤는데, guest로 로그인이 성공하였다.
바로 세션 쿠키를 확인해본 결과 이상한 값이 있는 것을 볼 수 있었다.
일단 숫자 + 소문자 알파벳을 조합한 값이나 어떤 값을 HEX로 인코딩한 것이 세션 쿠키라는 것을 추측할 수 있었다.
일단 세션 쿠기가 hex로 이루어져있다고 생각하고, 파이썬을 이용하여 무차별 공격을 시도하겠다.
코드를 대충 짜서 시도해봤지만, 이러한 메세지가 떴다..
파이썬으로 작업하는 건 너무 시간 낭비일 거 같아서 burp suite의 Intruder을 이용하여 무차별 공격을 시도하겠다.
이와 같이 설정하여 무차별 공격을 시도하니, flag를 획득할 수 있었다.
코드 분석을 통해 어떻게 session cookie가 생성되는지 확인해봤다.
코드 분석
#!/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)
이 중 admin의 세션이 생성되는 부분은 __main__ 부분에 있다.
session_storage[os.urandom(1).hex()] = 'admin'
이와 같이 랜덤으로 뽑은 hex 값을 세션으로 사용하고 있었다.
'Wargame > Dreamhack' 카테고리의 다른 글
[Dreamhack Web - Lv 1] xss-2 (0) | 2021.11.14 |
---|---|
[Dreamhack Web - Lv 1] devtools-sources (0) | 2021.11.13 |
[Dreamhack Web - Lv 1] mongoboard (0) | 2021.11.10 |
[Dreamhack Web - Lv 1] funjs (0) | 2021.11.06 |
[Dreamhack Web - Lv 1] Carve Party (0) | 2021.11.01 |
Comment