βœ’οΈ Web Hacking/Dreamhack

[Dreamhack] Session λ“œλ¦Όν•΅ μ›Œκ²Œμž„ 문제 풀이

A Lim Han 2023. 8. 12. 12:04

🎞️ Session λ“œλ¦Όν•΅ μ›Œκ²Œμž„ 문제 풀이

1. λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ…을 읽은 ν›„ 문제 파일 λ‹€μš΄λ‘œλ“œ

2. λ‹€μš΄λ°›μ€ app.py 파일 μ˜€ν”ˆ ν›„ μ½”λ“œ 뢄석

#!/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**]'

 

μ½”λ“œ μ„€λͺ…
from flask import Flask, request, render_template,
make_response, redirect, url_for
μ›Ή μ„œλ²„ 생성, μš”μ²­ 처리, ν…œν”Œλ¦Ώ λ Œλ”λ§ 등에
ν•„μš”ν•œ λͺ¨λ“ˆ κ°€μ Έμ˜€κΈ°
app = Flask(__name__) Flask μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 생성
FLAG = open('./flag.txt', 'r').read() νŒŒμΌμ„ μ—΄μ–΄ FLAG κ°’ μ½μ–΄μ˜€κΈ°
except νŒŒμΌμ„ 찾지 λͺ»ν•œ 경우 기본값인 FLAG μ‚¬μš©

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

session_storage = {
}

 

μ½”λ“œ μ„€λͺ…
users = {...} μ‚¬μš©μžλͺ…κ³Ό νŒ¨μŠ€μ›Œλ“œ 정보λ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ μ €μž₯
session_storage = {...} μ‚¬μš©μž μ„Έμ…˜ 정보λ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ μ €μž₯ν•˜κ³ , μ„Έμ…˜ ID와
μ‚¬μš©μžλͺ…을 λ§€ν•‘ν•˜μ—¬ 둜그인된 μ‚¬μš©μž 좔적

@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('/') μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ Root κ²½λ‘œμ— λŒ€ν•œ ν•Έλ“€λŸ¬ μ •μ˜
index() 인덱슀 νŽ˜μ΄μ§€ λ°˜ν™˜ ν•¨μˆ˜
(둜그인된 μ‚¬μš©μžκ°€ κ΄€λ¦¬μžμΈ 경우 FLAG ν‘œμ‹œ)

@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>'

 

μ½”λ“œ μ„€λͺ…
@app.route('/login', methods=['GET', 'POST']) 둜그인 κ²½λ‘œμ— λŒ€ν•œ ν•Έλ“€λŸ¬ μ •μ˜

A) GET 방식 μš”μ²­
  -->  Login νŽ˜μ΄μ§€ λ Œλ”λ§

B) POST 방식 μš”μ²­
-->  μ‚¬μš©μž 인증 처리
login() 둜그인 처리λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
(둜그인 성곡 μ‹œ μ„Έμ…˜ 생성 및 index νŽ˜μ΄μ§€λ‘œ μž¬μ—°κ²°)

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

 

μ½”λ“œ μ„€λͺ…
if __name__ == '__main__': μŠ€ν¬λ¦½νŠΈκ°€ 직접 μ‹€ν–‰λ˜λŠ” 경우, ν•˜λ‹¨μ˜ μ½”λ“œ μ‹€ν–‰
session_storage[os.urandom(1).hex()] = 'admin' 초기 κ΄€λ¦¬μž μ„Έμ…˜ 섀정을 μœ„ν•΄
Session μ €μž₯μ†Œμ— admin μ‚¬μš©μž μΆ”κ°€
app.run(host='0.0.0.0', port=8000) μ›Ή μ„œλ²„ μ‹€ν–‰

3. λ‹€μ‹œ 문제 νŽ˜μ΄μ§€λ‘œ λŒμ•„μ™€ μ„œλ²„ 생성

4. 버프 μŠ€μœ„νŠΈ(Burp Suite)λ₯Ό μ‹€ν–‰ν•œ ν›„, μƒμ„±λœ 링크λ₯Ό λΈŒλΌμš°μ €λ‘œ μ—΄κΈ°

 

++ Burp Suite λΈŒλΌμš°μ €λ₯Ό ν†΅ν•œ μ›Ή νŽ˜μ΄μ§€ 접속 

-->  https://alim11.tistory.com/203

 

[Burp Suite] λ²„ν”„μŠ€μœ„νŠΈμ—μ„œ ν”„λ‘μ‹œ μ„œλ²„ 쓰지 μ•Šκ³  μ›Ή νŽ˜μ΄μ§€ μ—¬λŠ” 법

# 버프 μŠ€μœ„νŠΈμ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‘°μž‘ν•˜μ§€ μ•Šκ³  μ›Ή νŽ˜μ΄μ§€μ— μ ‘μ†ν•˜λŠ” 법 1. 버프 μŠ€μœ„νŠΈλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€. 2. Proxy νƒ­ 클릭 ν›„ Optionsλž€μœΌλ‘œ 이동 3. Optionsλž€μ—μ„œ μ˜΅μ…˜ 섀정을 μ•„λž˜μ™€ 같이 μ„€μ •ν•œλ‹€. (

alim11.tistory.com

5. Login νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•œ ν›„, μ•„λž˜μ™€ 같이 μž…λ ₯ν•˜μ—¬ guest둜 둜그인

6. λ‹€μ‹œ 버프 μŠ€μœ„νŠΈ(Burp Suite)둜 λŒμ•„μ™€, μ΅œμƒλ‹¨μ˜ History 클릭

 

7. 마우슀 우츑 λ²„νŠΌμ„ λˆ„λ₯΄κ³ , Send to Intruder 클릭 

 

8. μƒλ‹¨μ˜ Intruder νƒ­μœΌλ‘œ 이동 ν›„, Positions & Payloads λ₯Ό μ•„λž˜μ™€ 같이 μ„€μ •

곡격 ν˜•μ‹μ€ Sniper

 

곡격할 Target 확인

(타깃은 이전에 μƒμ„±ν•œ 링크와 동일해야 함)

 

Payload setλŠ” 1, νƒ€μž…μ€ Brute forcer

 

Character set 은 a ~ e & 1 ~ 9

+

Min & Max lengthλŠ” λͺ¨λ‘ 2 둜 μ„€μ •

9. Start Attack 클릭 ν›„, 길이가 λ‹€λ₯Έ νŒ¨ν‚·μ΄ λ‚˜νƒ€λ‚  λ•ŒκΉŒμ§€ λŒ€κΈ°

 

10. 길이가 λ‹€λ₯Έ 97번 νŒ¨ν‚·μ˜ Sesson ID 확인

 

97번 νŒ¨ν‚·μ˜ Sesson IDλŠ” a0

11. λ‹€μ‹œ μƒμ„±ν•œ 링크둜 λŒμ•„μ™€ 개발자 도ꡬ μ˜€ν”ˆ

12. 개발자 λ„κ΅¬μ˜ Applicaton νƒ­μœΌλ‘œ 이동 ν›„ Sesson Storage 클릭

13. guest 의 Session IDλ₯Ό 10λ²ˆμ—μ„œ 찾은 ID둜 λ³€κ²½

 

14. 개발자 도ꡬλ₯Ό λ‹«κ³  νŽ˜μ΄μ§€ μƒˆλ‘œκ³ μΉ¨  -->  FLAGκ°€ 좜λ ₯됨을 확인