-
문제에 들어가면 위와 같은 페이지가 나온다.
우선 로그인 버튼을 눌러 아래 페이지로 들어갔다.
아이디 비밀번호는 페이지 소스에서 주석으로 알려주고 있었다.
ID : AzureDiamond
PW : hunter2
알려준 아이디로 로그인을 하니 Flag 버튼이 생겼다.
Flag 버튼을 눌렀더니 "Inavalid Token: Access Denied" 라는 문구만 나오고 Flag는 나오지 않았다.
"Inavalid Token: Access Denied" 문구를 통해서 Token을 활용해 푸는 문제라는 걸 대략 짐작할 수 있었고
바로 EditThisCookie로 Token 값을 확인해보았다.
Token 값은 아주 길었다.
긴 Token 값을 [.] 기준으로 아래와 같이 세 문단으로 나누어 보았다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6IkF6dXJlRGlhbW9uZCIsInRva2VuIjoiNTU3NjJmMjAyYjIzMjI2NDQ0Y2E0Zjk5ZTczMjdiNTkiLCJpYXQiOjE2NTIxNDg1NDksImV4cCI6MTY1MjE0ODU1MX0.
K3A_hVp5cMbVmaGTvohdC3KNFnOhfePoH3N-7mS034Q
그리고 Base64로 인코딩 되어 있는 것 같아 디코딩도 시도해보았다.
첫번째 문단과 두번째 문단은 디코딩이 되었다.
하지만 세번째 문단은 디코딩이 되지 않았다.
{"alg":"HS256","typ":"JWT"}.
{"username":"AzureDiamond","token":"55762f202b23226444ca4f99e7327b59","iat":1652148549,"exp":165214855MX0.
K3A_hVp5cMbVmaGTvohdC3KNFnOhfePoH3N-7mS034Q디코딩 된 최종 값은 위와 같다.
첫번째 문단이 디코딩 된 값에 "JWT" 라 적혀 있어 구글에 검색해 보았고 JSON 웹 토큰이라는 것을 알 수 있었다.
JSON 웹 토큰이란?
- 유저를 인증하고 식별하기 위한 토큰 기반 인증이다.
- JSON 웹 토큰의 구조는 Header, Payload, Signature로 구성된다.
- Header에는 JWT(JSON Web Token)에서 사용할 타입과 Signature을 암호화 시킬 해시 알고리즘의 종류가 담겨있으며
- Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
- Signature 에는 Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인 키(Private Key)로 서명한 정자 서명이 담겨 있다.
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
jwt.io에선 JWT 웹 토큰 구조를 더 잘 파악할 수 있다.
토큰의 Payload 분석 결과 토큰 만료 시간이 2초임을 확인 할 수 있었다.
앞에서 Flag 버튼을 눌렀지만 "Inavalid Token: Access Denied"라는 문구가 뜬 것은 토큰이 만료되었기 때문이다.
로그인 후 토큰이 만료되기 전에 Flag 버튼을 눌러 들어가야 한다.
토큰이 만료 되기 전 재빠르게 Flag 버튼을 눌러 들어갔고 "d"라는 문자가 출력된 것을 보았다.
그런 다음 https://jawt.sdc.tf/s/d 로 들어갔다. 그랬더니 "c"라는 문자가 출력된 것을 볼 수 있었다.
이를 보고 디렉터리 안에 계속 디렉터리가 있다는 것을 눈치채게 되었다.
바로 문제 풀이에 필요한 파이썬 스크립트를 짜보았다.
import requests URL = 'https://jawt.sdc.tf/s' flag = 's' LOGIN_INFO = { 'username' : 'AzureDiamond', 'password' : 'hunter2' } with requests.Session() as s: s.post('https://jawt.sdc.tf/login', data = LOGIN_INFO) while True: res = s.get(URL) print(URL) if res.text == "Invalid Token: Access Denied": s.post('https://jawt.sdc.tf/login', data = LOGIN_INFO) else: path = "/" + res.text URL = URL + path flag = flag + res.text if res.text == '}': break print(flag)
이렇게 파이썬 자동화 스크립트를 통해 간편하게 문제를 풀 수 있었다.
Flag : sdctf{Th3_m0r3_t0k3ns_the_le55_pr0bl3ms_adf3d}
'CTF > San Diego CTF 2022' 카테고리의 다른 글
[SDCTF 2022] CURL Up and Read (0) 2022.05.09 [SDCTF 2022] Gullible by Dovesign (0) 2022.05.09 [SDCTF 2022] HuMongous Mistake (0) 2022.05.09 [SDCTF 2022] Lots of Logs (0) 2022.05.09 댓글