-
[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 값을 넣고 로그인!!
왜인지 모르겠는데, 로그인은 안 되네요..
반응형'정보보안 > CTF write-up' 카테고리의 다른 글
[Dreamhack Wargame] xss-2 문제풀이 / write up (0) 2022.07.28 [Dreamhack Wargame] devtools-sources 문제풀이 / write-up (0) 2022.07.19 [webhacking.kr] old-01 문제 풀이 / write-up (0) 2022.07.19 [드림핵] shell_basic 풀이 / write up (0) 2022.02.19 [pwnable.kr] fd 문제 풀이 / write up / pwnable.kr 소개 (0) 2022.02.14