본문 바로가기

드림핵

[워게임] session-basic

session-basic | 워게임 | Dreamhack

 

session-basic

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

dreamhack.io

 

문제:

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

플래그 형식은 DH{...} 입니다.

 

문제 파일 다운로드 받아 visual studio 로 들어감

 

코드를 분석해보면

 

 

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

#  flag,txt 파일에 플래그 값이 있으면 호출하라

 

 

 

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

#  유저 3개. 아이디, 비번

 

 

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

# 쿠키에서 받은 sessionid로 username 조회

-> username이 admin이면 플래그 알 수 있다?

 

 

 

 

@app.route('/login', methods=['GET', 'POST'])

# 로그인 페이지에서 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')

# 폼으로부터 username, 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

응답을 만들고 session id를 생성해 session_storage에 저장 후 쿠키로 설정 
        return '<script>alert("wrong password");history.go(-1);</script>'

 

 

 

@app.route('/admin')

#관리자 라우트


def admin():
    # developer's note: review below commented code and uncomment it (TODO)

    #session_id = request.cookies.get('sessionid', None)
    #username = session_storage[session_id]
    #if username != 'admin':
    #    return render_template('index.html')

    return session_storage

# sessionstorage 를 리턴함. 

 


 

 

일단 VM에 접속해 로그인 창으로 들어가서

 guest로 로그인 함

 

주어진 문제 코드 마지막을 보면 

app.run(host='0.0.0.0', port=8000)

기본 포드가 8000임을 알 수 있음.

 

코드에 @app.route('/admin')가 있으므로

코드에서 정한 엔드포인트가 ' /admin' 임을 알 수 있음.

즉, 관리자 관련 정보( session_storage )를 반환하는 경로가 ' /admin'.

 

주소는

http://<실제호스트>:<실제포트>/admin  형식이므로

주소창에 http://host8.dreamhack.games:19208/admin 입력하여

으로 페이지를 열어봄

 

관리자 세션 ID는 맨 앞 키이므로 

 

523059437d73e70887a4dd20852cd98868b7dbc1ec5bd751829753eebb85ebbf

 

 

이렇게 admin 세션 ID 확인할 수 있음.

 

 

 

http://host8.dreamhack.games:19208 

다시 이 주소창에서 

F12 눌러 devtools 들어감.

그리고 상단 Applicationd 누르고,

Storage > Cookies > 해당 호스트

sessionid 값을 아까 얻은 세션 ID로 수정해봄.

마우스 오른쪽 누르고 Edit "Value" 누른 후 523059437d73e70887a4dd20852cd98868b7dbc1ec5bd751829753eebb85ebbf 로 수정한 후 enter키 누른 다음에 

F5 눌러서 새로고침 했더니

플래그가 나왔다!!

 

flag is DH{8f3d86d1134c26fedf7c4c3ecd563aae3da98d5c}