
https://dreamhack.io/wargame/challenges/266
쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin으로 로그인에 성공하면 플래그를 얻을 수 있습니다.
제시된 파이썬 코드 중
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
을 확인하여 guset로 로그인을 성공하였고, 정상적으로 세션값이 뜨는 것 또한 확인하였습니다. 이 세션값을 조작하여 admin으로 로그인을 성공할 수 있음을 유추해볼 수 있습니다.

제시된 파이썬 코드 중 login 함수에서, session_id = os.urandom(4).hex() 란 코드를 확인할 수 있습니다.
os.urandom(4).hex() 는 랜덤으로 생성된 4바이트(= 32비트)짜리 세션 ID를 8자리 16진수 문자열로 만들어 변수 session_id에 담는다는 뜻으로, 세션 아이디를 생성해 내는 로직임을 알 수 있습니다. 실제로 확인해본 guest의 세션id 또한 28e903al로, 8자리입니다다.
session_storage[os.urandom(1).hex()] = 'admin'
을 통해 admin의 세션id는 2자리임을 유추해볼수 있습니다. ( urandom(4)일땐 8자리였음.)
세션id가 만들어 지는 방법을 알게 되었으니, 이를 유추하여 admin의 세션id를 찾습니다.
브루트 포스 사용을 위해 Burp Suite를 실행합니다.
Proxy 탭에서 intercept on 상태로 설정합니다. guset로 로그인을 해줍니다. 이후 pretty 뷰에서 sessionid값을 찾습니다.

sessionid 값을 드래그 후, 우클릭 하여 send to Intruder 을 눌러줍니다. 이후 Proxy 탭 옆의 Intruder탭으로 이동합니다.

우측의 Payloads를 선택하고, Payload type 을 Brute forcer 로 바꿔줍니다.
os.urandom(1).hex() 은 16진수 문자열로 만들어진 2자리 문자열이기에, Payload configuration의 Character set은 123456789abcdef(16진수), Min/Max length는 2로 설정해주고 start attack 버튼을 실행하였습니다.

혼자만 길이가 다른 특정한 값을 찾아낼 수 있었습니다.

session_id 에 그 값을 대입해보았더니 성공적으로 admin에 로그인을 성공하였습니다.

session_storage[os.urandom(1).hex()] = 'admin' 과 같은 세션 생성 로직을 해석하고 적용하는 법을 배웠습니다.브루트 포스 또한 도움이 됨을 배웠습니다.Burp Suite를 통해 브루트 포스를 실행하는 법을 배웠습니다.session_id = os.urandom(4).hex() generates an 8-character hex session IDsession_storage[os.urandom(1).hex()] = 'admin' likely creates a 2-character hex session ID for adminadmin session ID and logged in as admin to obtain the flag