https://dreamhack.io/wargame/challenges/409
문제
쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다.admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.
플래그 형식은 DH{...} 입니다.
풀이
1. 취약점 파악
@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
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)
이전에 풀었던 cookie 문제와 코드는 비슷한데 새로 추가된 다른 가장 중요한 취약점이라고 생각되어 위 코드 부분만 설명하고 바로 exploit 하겠습니다
- cookie는 클라이언트가 인증을 하는 것이고 session은 서버에서 인증하는 것을 준다고 생각하면 쉽다
- admin의 session 생성에 대해선 os.urandom(32).hex()를 통해서 무작위 랜덤 값이 생성되고 username이 admin인 세션 정보를 session_storage에 추가된다
- 이 session_storage의 정보를 조회 할 수 있다면 무작위로 생성된 값을 계산하거나 어렵게 하지 않고, sessionid 값을 바로 획득가능하다
- @app.route('/admin') 부분을 보면 /admin 라는 엔드포인트로 접근이 가능하다는 것인데 return 값으로 session_strorage 라고 나와있다
- 원래는 admin 권한을 가지고 있는 사용자만 접속이 가능한데 주석처리가 되어있으므로 누구든지 들어갈 수 있게 되었다
- 그렇다면 주소창 끝에 /admin을 넣어 보면 뭔가 나오지 않을까!!
- 이렇게 취약점을 찾았고 이제는 exploit을 해보자
2. exploit
그리고 cookie 와 동일하게 guest라는 id도 있고, 새로 추가된 user라는 id도 있으니 참고해서 사용하면 좋을 듯 하다
우선 guest user로 로그인해서 동작 확인을 하고 sessionid를 잘 만들어 주는지 확인한다
이후 취약점에서 파악 했던 /admin을 주소창에 추가한다
빙고!! admin의 sessionid 값이 session_storage에 저장이 되어있다
저 sessionid와 username을 검사 application에서 수정 및 추가해준다
추가 해준 뒤에 새로고침을 하면 admin으로 로그인이 되고 flag를 획득 할 수 있게 된다
FLAG
DH{8f3d86d1134c26fedf7c4c3ecd563aae3da98d5c}
'Dreamhack' 카테고리의 다른 글
[Dreamhack] Carve_Party WriteUp (0) | 2024.06.11 |
---|---|
[Dreamhack] xss-1 Write-Up (0) | 2024.03.18 |
[Dreamhack] cookie Write-Up (1) | 2024.03.16 |
[Dreamhack] phpreq Write-Up (2) | 2024.03.15 |
[Dreamhack] ex-req-ex Write-Up (2) | 2024.03.15 |