문제정보. 이름에서 보면 JWT (JSON Web Token)을 이용하는 문제처럼 보인다.
링크를 타고들어가면 아래와같은 페이지가 뜨는데 내용의 요점은 다른 유저를 제외한 admin은 특별한 스크래치패드를 갖고있다고 한다.
정상적으로 아무 입력값을 줘보자. 아래의 밑줄친부분을 보면 jwt토큰을 달고 원래 페이지로 다시 리다이렉션되는 것을 볼 수 있다.
$curl https://jupiter.challenges.picoctf.org/problem/61864/ -d 'user=revi1337' -L -v
jwt 토큰은 JSON Web Token의 약자이며 송/수신자 간의 정보를 JSON 객체로 안전하게 전송하기위한 토큰이다.
JWT 토큰은 . 을 기준으로 Header.Payloads.Signature 이렇게 3가지 부분으로 나뉜다.
Header부분은 JWT 토큰유형과 Signature부분에서 사용될 서명 알고리즘을 표현하여 Base64 인코딩되어있다.
Payloads는 서비스에 필요한 데이터들의 대한것과 설명을 표현하여 Base64 인코딩되어있다.
Signature 부분은 앞서 Base64로 인코딩된 Header와 Payloads를 . 과 합쳐 서명알고리즘을 사용하여 서명한다. (당연히 개인키로 서명)
CURL로 확인한 jwt토큰은 아래와 같이 생겼다.
jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoicmV2aTEzMzcifQ.SfJXe-00G1wilEgQm5xyzPKbk-DDQ2DrYVEqzLOSii0
즉. 확인한 jwt토큰을 아래의 구조를 갖는다
Header : eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Payload : eyJ1c2VyIjoicmV2aTEzMzcifQ
Signature : SfJXe-00G1wilEgQm5xyzPKbk-DDQ2DrYVEqzLOSii0
Signature를 제외한 Header, Payload 은 base64 인코딩되어있는데 이것을 base64 디코딩하면
1. Header
2. Payload
디코딩된 Header와 Payload를 보면 서명알고리즘은 HS256 (HMAC- SHA256) 이며 user : revi1337 인것을 볼 수 있다.
이것을 admin으로 바꿔준뒤, 다시 base64 인코딩하고 인코딩된 Header와 Payloads를 합친 후, 개인키로 서명을 해야 변조된 jwt 토큰이 완성된다.
우선 Payload를 admin으로 변경 후 base64로 인코딩해주자. 가끔 base64 인코딩 후에 = 가 한개 혹은 두개 붙는 경우가 있는데 이것은 Padding(여백)값이다. 이것은 지워주는것이 좋고 서버에서 base64 디코딩하는데 아무런 문제가 없다.
인코딩된 Header와 변조하여 인코딩한 Payload를 . 과 합치면 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQo
가 되는데 이것을 개인키로 서명을 해주어야한다. 하지만 서명을하려면 개인키가 필요한데 개인키에 대한 정보가 없다. 따따라서 본래의 jwt토큰에서 john the ripper의 HMAC 포맷으로 개인키를 크랙할 수 있다.
원래의 토큰을 파일로 생성한 다음..
john the ripper로 크랙해주면 개인키를 획득할 수 있다. (ilovepico)
획득한 개인키로 Header와 Payload는 합쳐 HS256 서명해주면 변조된 jwt 토큰이 완성된다.
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
이렇게 변조된 jwt토큰을 쿠키에 설정하고 페이지에 접근하면 플래그를 획득 가능하다.
$curl -b 'jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.gtqDl4jVDvNbEe_JYEZTN19Vx6X9NNZtRVbKPBkhO-s' https://jupiter.challenges.picoctf.org/problem/61864/ -s | egrep 'picoCTF\{\S*\}'
FLAG : picoCTF{jawt_was_just_what_you_thought_1ca14548}
'WebHacking > picoCTF2019' 카테고리의 다른 글
Irish-Name-Repo 3 (0) | 2022.08.26 |
---|---|
Irish-Name-Repo 2 (0) | 2022.08.26 |
Irish-Name-Repo 1 (0) | 2022.08.26 |
client-side-again (0) | 2022.08.26 |
picobrowser (0) | 2022.08.26 |