Pada chall ritsec2019 ini, saya mencoba untuk menyelesaikan challange Our First Api.
Challange tersebut terdiri dari 2 halaman yaitu :
1. http://ctfchallenges.ritsec.club:3000
2. http://ctfchallenges.ritsec.club:4000
kemudian kita coba check http://ctfchallenges.ritsec.club:3000
backend nya mengunakan express , cmiiw.
bisa kita pastikan bahwa pada port 3000, hanya di gunakan untuk authentication.
kemudian kita coba check http://ctfchallenges.ritsec.club:4000
ternyata pada port 4000, hanya menampilkan dokumentasi list api yang bisa kita gunakan
dan terbagi menjadi 3 yaitu
1. http://ctfchallenges.ritsec.club:4000/api/admin
2. http://ctfchallenges.ritsec.club:4000/api/normal
3. http://ctfchallenges.ritsec.club:3000/auth
sebelum kita mencoba mengakes endpoint admin dan normal lebih baik kita mencoba melakukan
authentication pada halaman http://ctfchallenges.ritsec.club:3000 terlebih dahulu.
mari kita check path `/auth` pada http://ctfchallenges.ritsec.club:3000/auth
kita coba lakukan curl
setelah kita lakukan hit endpoint http://ctfchallenges.ritsec.club:3000/auth
balikan response nya adalah
{"reason" : "missing name parameter" }
oleh karena itu coba kita tambahkan 1 parameter name dengan isi kucingliar
dan coba lakukan curl
http://ctfchallenges.ritsec.club:3000/auth?name=kucingliar
balikan response nya adalah
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoia3VjaW5nbGlhciIsInR5cGUiOiJ1c2VyIiwiaWF0IjoxNTc0MDUwNDAxfQ.mxZF8jUvaUGJiNN4PBqekimT5BdmU5GEgD5t38QBJdBS2Vk1xZ96t5LjZ_TNbyYS2k9Gd-_Nibi5wFU4GRjLTnOk9lCgc5fUER8AlqvoLFR6y0Vt9Kdn9-GELAyQy0IZJs131Xgl4DGvL5ErLNsVqn7UvcKRKMirnCoi_acff7Y"}
setelah itu kita mendapatkan token, token ini bisa kita gunakan nanti untuk mengakses endpoint
seperti
1. http://ctfchallenges.ritsec.club:4000/api/admin
2. http://ctfchallenges.ritsec.club:4000/api/normal
dan bisa kita pastikan token yang digunakan mengunakan JWT(JSON Web Token)
JWT terdiri dari 3 bagian yaitu HEADER.PAYLOAD.SIGNATURE dan pada umumnya di bungkus dengan base64 encoding
bisa kita lihat header yang digunakan RS256, jadi tekniknya signature nya mengunakan RSASSA-PKCS1-v1_5 jadi kita memerlukan public key kemudian di hash oleh SHA-256, cmiiw.
dan untuk payload nya ada 3 atribute yaitu name, type dan iat
{"name":"kucingliar","type":"user","iat":1574050401}
setelah menganalisa kita coba lakukan request mengunakan token tadi dan kita set di header
ternyata berhasil namun untuk mendapatkan flag kita butuh meng akses endpoint admin.
disinilah yang menarik bagaimana kita mencoba memanipulasi type user menjadi admin.
yang pertama di benak saya adalah bagaimana jika endpoint http://ctfchallenges.ritsec.club:3000/auth
kita berikan parameter type dengan value admin.
ternyata setelah di decode type nya masih user seperti nya teknik pertama gagal.
Mau tidak mau kita perlu memanipulasi jwt nya, karena alogritma yang digunakan RS256 maka kita perlu cari tahu dulu public key nya untuk generate payload baru.
coba kita intip2 http://ctfchallenges.ritsec.club:4000 apakah menemukan sebuah clue,
ternyata kita menemukan sebuah clue yaitu kita mencoba akses robots.txt
(robots.txt merupakan file yang berfungsi untuk mengendalikan atau mengkontrol user-agent (seperti: Googlebot) dalam mengcrawling halaman website.
Jika anda ingin Google dapat menjelajahi seluruh file yang ada di website, anda tidak perlu membuat file robots.txt sama sekali)
kita coba download file nya signing.pem
isi signing.pem nya berupa
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBquzMGkZlJmZm4pYppxeDmsGd
8+9mOh5S9O7W7Gu5VByfl7i3JdCfGxRJdHscg6l321PeTXsXGZ7goHd4Xjv/FtKQ
DyoaKql4Kl692KKKN/9xA6tKdOYQbZvPqyRXUVOGdyZ12qFBOQzI7ox22YL3ul/3
nyiDR+p+JKbdVU6AWQIDAQAB
-----END PUBLIC KEY-----
untuk memanipulasi jwt nya saya memiliki referensi dari
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/JSON%20Web%20Token
sangat membantu sekali.
yang pertama kali kita lakukan adalah, kita convert kebentuk hexa public key tadi.
setelah itu kita coba modify type payload nya menjadi admin, kemudian kita encode menjadi base64
setelah itu kita coba generate lagi header.payload nya mengunakan sha256 lagi dengan mengunakan hex value yang kita dapatkan tadi dari signing.pem
dan jangan lupa RS256 kita ubah menjadi HS256
sebelum eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9 {"typ":"JWT","alg":"RS256"}
sesudah eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 {"typ":"JWT","alg":"HS256"}
setelah itu kita generate signature baru.
setelah itu kita gabungkan HEADER.PAYLOAD.SIGNATURE yang sudah kita buat
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoia3VjaW5nbGlhciIsInR5cGUiOiJhZG1pbiIsImlhdCI6MTU3NDA1MDQwMX0K.qig06OoojTj3qrxCptwT-RdS33IVgQdBR1t9mykb9NU
kita coba request lagi endpoint
1. http://ctfchallenges.ritsec.club:4000/api/admin
2. http://ctfchallenges.ritsec.club:4000/api/normal
dan akhirnya kita menemukan flag nya :D .