[Dreamhack Web - Lv 1] session

문제 정보

쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
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