ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Dreamhack Wargame] session-basic 문제풀이 / write up
    정보보안/CTF write-up 2022. 7. 20. 11:48

     

     

    쿠키와 세션에 대한 강의를 보고 나니, 관련 문제가 있습니다. admin 계정으로 로그인하면 되는 문제입니다.

     

     

    문제에서 문제 사이트에 접속할 수 있게 해줘서 들어가보니, 단순한 페이지 하나에 로그인 기능 하나 있습니다. 사이트를 살펴봤지만, 크게 얻을 수 있는 정보는 없어서 아래에 첨부된 파일도 함께 다운 받았습니다.

     

     

     

    다운 받아보니 압축된 플라스크 파일 하나 있습니다.

     

    #!/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
    }
    
    
    # this is our session storage 
    session_storage = {
    }
    
    
    @app.route('/')
    def index():
        session_id = request.cookies.get('sessionid', None)
        try:
            # get username from session_storage 
            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:
                # you cannot know admin's pw 
                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(32).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('/admin')
    def admin():
        # what is it? Does this page tell you session? 
        # It is weird... TODO: the developer should add a routine for checking privilege 
        return session_storage
    
    
    if __name__ == '__main__':
        import os
        # create admin sessionid and save it to our storage
        # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
        session_storage[os.urandom(32).hex()] = 'admin'
        print(session_storage)
        app.run(host='0.0.0.0', port=8000)

     

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

     

    보면 상단에 아이디와 비밀번호가 딕셔너리 형태로 정의되어있습니다. admin 비밀번호는 FLAG 값으로 정해진 것으로 알 수 있습니다.

     

     

    우선 guest로 로그인해보겠습니다.

     

     

    이렇게 sessionid라는 쿠키값이 생기면서 로그인이 되는 것을 확인할 수 있어요.

     

    @app.route('/admin')
    def admin():
        # what is it? Does this page tell you session? 
        # It is weird... TODO: the developer should add a routine for checking privilege 
        return session_storage

     

    코드를 조금 더 살펴보니 로그인과 메인페이지 외에 admin이라는 페이지가 하나 더 있었습니다. 반환하는 값은 session_storage 값이라고 합니다. session_storage 안에 admin 로그인 세션 데이터가 있을 것이라고 생각하고 들어가봤습니다. 

     

     

    admin 세션값을 찾을 수 있었습니다.

     

     

    세션 값을 admin의 세션값으로 바꿔준 다음에 새로고침을 해보았습니다.

     

     

    admin으로 로그인 된 것을 확인할 수 있고, FLAG 값도 함께 나오는 것을 볼 수 있습니다.

     

     

    번외

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

    번외로 admin의 비밀번호는 FLAG값이라고 나와있으니, 재미삼아 한번 로그인해봤습니다.

     

     

    비밀번호에 FLAG 값을 넣고 로그인!!

     

     

    왜인지 모르겠는데, 로그인은 안 되네요..

    반응형
Designed by Tistory.