Crack JWT (Secret Key) menggunakan Hashcat

Covet Crack JWT Secret

Saat melakukan pentest, sering kali kita menemukan aplikasi web yang mengimplementasikan JSON Web Token (JWT). JWT sendiri biasanya digunakan untuk mengotentikasi dan mengotorisasi pengguna dalam aplikasi Web dan API. JWT terdiri dari tiga bagian String yang dipisahkan oleh titik (.), yaitu: header, payload, dan signature. Header berisi tipe token dan algoritma, payload berisi informasi yang ingin disampaikan, dan signature digunakan untuk memverifikasi integritas token.

Namun, satu hal yang sering dilewatkan (bahkan oleh rekan Pentester sendiri) yaitu mengapa kita tidak mencoba untuk membongkar JWT secara Offline?

Ketika Secret Key pada JWT bocor, kita dapat memanipulasi Token secara bebas untuk melakukan berbagai macam eksploitasi yang berhubungan dengan mekanisme otentikasi dan otorisasi.

Notes

Untuk mengenali Token pada Web itu menggunakan JWT atau bukan, biasanya saya membaca karakter di depannya, pada JWT sendiri biasanya diawali dengan eyJhbGciOiJ.

JSON Web Token

Ok, sebagai contoh, di sini saya sudah menyiapkan sebuah Token (JWT).

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIiLCJuYW1lIjoiaGVscGRlc2siLCJpYXQiOjE1MTYyMzkwMjJ9.QmhPnelIHL5Ocx7CnDLesXXuufBrpV1SlGmG8vJZ92w
  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 (Header)
  2. eyJpZCI6IjIiLCJuYW1lIjoiaGVscGRlc2siLCJpYXQiOjE1MTYyMzkwMjJ9 (Payload)
  3. QmhPnelIHL5Ocx7CnDLesXXuufBrpV1SlGmG8vJZ92w (Signature)

Siapa pun dapat mengubah bagian eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 dan eyJpZCI6IjIiLCJuYW1lIjoiaGVscGRlc2siLCJpYXQiOjE1MTYyMzkwMjJ9 menggunakan format Base64. Namun, di lain sisi, kita (sebagai pihak eksternal) tidak bisa mengubah bagian QmhPnelIHL5Ocx7CnDLesXXuufBrpV1SlGmG8vJZ92w, karena Signature tersebut dilindungi oleh Secret Key, yang di mana hal ini akan digunakan untuk validasi saat Token dikirim ke server.

JWT.io Show

Mungkin dari gambar di atas, kita sudah terbayang dengan skenario serangan seperti Account Takeover (dengan cara mengubah bagian ID dan Name). Namun, sayangnya ketika kita ubah Payload-nya, sudah dipastikan server tidak akan menerima Token milik kita karena Signature yang dikirim tidak valid.

Tugas selanjutnya yaitu kita perlu membongkar Secret Key yang digunakan untuk melindungi Signature tersebut.

Crack the Secret

Pertama-tama, kita perlu memasukan Token tersebut ke dalam sebuah file, kemudian kita crack token tersebut menggunakan metode Brute Force / Dictionary Attack. Di sini saya menggunakan Tool hashcat dan wordlist dari rockyou.txt.

hashcat -a 0 -m 16500 <jwt file> <password list>

Hashcat Run

Saat prosesnya sudah selesai, kalian perlu memastikan Status-nya itu Cracked, namun jika Status-nya itu Exhausted kemungkinan Token yang kalian Crack itu sudah menggunakan Secret Key yang kompleks dan kuat, sehingga implementasi JWT-nya sudah sesuai dengan Best Practice.

Hashcat Status Cracked

Jika sudah selesai, maka kita jalankan command-nya kembali namun menambahkan parameter --show.

hashcat -a 0 -m 16500 <jwt file> <password list> --show

Hashcat Show JWT

Di sini kita sudah mendapatkan bahwa Secret Key yang digunakan pada Token contoh adalah 123456.

Dari sinilah kita bisa mencoba untuk memanipulasi Payload pada Token-nya, misalnya untuk melakukan Account Takeover dengan cara mengubah parameter id (dari 2 menjadi 1) dan name (dari helpdesk menjadi admin).

Manipulated JWT

Other JWT Wordlist:

# this post has been modified at 2024-02-28