워게임/dreamhack

[dreamhack] session 문제풀이

  • -
[WEB] session 문제풀이

문제를 확인해보자.

 


쿠키/세션을 조작하여 admin 계정으로 로그인에 성공하면 flag를 획득할 수 있는 문제이다.

접속해보자.

 

 

login 외에 별다른 기능은 안보인다. 소스코드를 확인해보자.

 

#!/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/guest, user/user1234, admin/{flag} 가 있다.

 

/login 페이지를 살펴보자.

 

 

/login 페이지는 username과 password 값을 전달 받아 pw 변수에 해당 user의 패스워드를 저장한다.

pw에 저장된 user의 패스워드와 password 파라미터로 전달된 값이 일치하면 index 페이지로 응답을 만들어준다.

 

그리고 os.urandom(4).hex() 함수를 통해 4byte의 무작위 값을 hex로 형변환하여 session_id에 저장한다.

sessino_storage[session_id]=username 을 통해 해당 세션 id가 로그인에 성공한 user의 세션이 된다.

 

주의깊게 봐야할 부분은 가장 아랫부분에 작성된 코드이다.

 

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

 

소스코드가 작성된 app.py가 실행될 때  session_storage[os.urandom(1).hex()]='admin' 코드를 통해

admin의 세션ID를 정의해 놓는다. 여기서 admin의 세션ID는 1Byte의 hex값으로 설정되어 있다.

 

그렇다면 우리는 session_id 무작위 대입(256가지)을 통해 admin 계정으로 로그인 할 수 있다.

 

burp의 intruder 기능을 이용하여 무작위 대입 공격을 시도해보자.

/index 페이지에 접속하는 패킷을 캡처하고, sessionid에 무작위 대입 공격을 수행할 수 있도록 변수를 지정해준다.

 

 

그 다음은 무작위 대입을 수행할 방식과 페이로드를 정의해주자.

 

 

payload 타입은 brute forcer 이며, 1Byte의 Hex 값을 구하는 것이기 때문에

'abcde0123456789' 두개의 문자를 조합하는 식의 대입 공격을 수행할 것이다.

start attack을 클릭해보자.

 

 

result 패킷 중 유일하게 응답 Length가 다른 패킷이 확인되었으며, 거기에서 플래그를 확인할 수 있었다.

 

문제풀이 끗

'워게임 > dreamhack' 카테고리의 다른 글

[dreamhack] rev-basic-1 문제풀이  (0) 2021.09.12
[dreamhack] rev-basic-0 문제풀이  (1) 2021.09.12
[dreamhack] devtools-sources 문제풀이  (0) 2021.08.30
[dreamhack] csrf-2 문제풀이  (0) 2021.08.30
[dreamhack] xss-2 문제풀이  (0) 2021.08.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.