학회_공부해요/워게임

[Dreamhack(드림핵)] Write up - session

yenas0 2024. 8. 6. 22:12
반응형

https://dreamhack.io/wargame/challenges/266

 

session

쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. Reference Background: Cookie & Session

dreamhack.io


 

문제 설명보니 admin계정으로 로그인 성공하면 플래그 획득이 가능하다고 한당

로그인으로 들어가 보겠음

admin 계정이면 된다해서 아이디 비번에 둘다 admin 쳐봤는데 password가 틀렸다고 한다.

 

주어진 문제 파일을 한번 까봤다

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

 

 

코드 보니까  guest 로그인이랑 user 로그인은 아이디 비밀번호 있길래 해봄

일케 뜬다..

 

맨 아래 if __name__ == '__main__':

쪽 부분 보면 1바이트 길이의 임의의 바이트 생성해서 admin에 매핑하는걸로 보인다. 이게 admin 비번이 될 듯.

1부터 쭉 해보면 되는데 귀찮으니까 버프 스위트 써서 intruder 기능 쓰면 될거같음

 

https://yenas0.tistory.com/196

 

[SuNiNaTas(써니나타스)] Write up - 8번

일케 뜬다뭔지 모르겠으니 일단 무지성 admin 해보겠음 엥 할라했는데 pw가 4글자만 쳐짐 개발자 모드 켜봄아이디는 admin같고 password가 0부터 9999숫자인듯,, 다 대입해보면 되긴 할텐데 귀찮으니

yenas0.tistory.com

 

이 문제에서 쓴 기능이니 방법 참고하면 될거같다.

 

이거 묶어서 intruder쓰면 된다..

1바이트니 이백오십육개...

 

length 다른거 찾아서 세션id값 구하고 버프스위트나 개발자도구에서 넣으면 문제는 풀린다.

 

프록시 돌리면 인터넷 잘 안돼서 실시간으로 글쓰기 귀찮아서 중간이 많이 생략^~^ 엣큥~

8번 문제에 자세히 설명해뒀읍니다.

반응형