terakhir saya melakukan pengujian web-ikepri yaitu tahun 2025, sekarang web-ikepri sudah berbenah dan sistem sudah semakin kuat untuk tidak mengijinkan ebook diunduh
berbagai lapisan sudah diterapkan, bahkan metode lama yang pernah saya tulis sudah tidak lagi relevan untuk digunakan
karena ketertarikan ini saya mencoba melakukan reverse sekali lagi, kali ini bukan mengunduh melalui bytes melainkan bongkar pasang payload yang sepenuhnya ter-enkripsi
apa saja tantangan yang saya temukan berikut akan saya bahas
Daftar Isi Artikel
Ebook yang dimuat perhalaman
saat mengecek lalu lintas jaringan, ebook yang terlihat tidak lagi diload secara keseluruhan
artinya ebook dibuat menjadi chunk (bagian) perhalaman, lalu dimuat secara satu persatu
hal ini tentu membuat pengunduhan menjadi sangat terbatas, karena akses untuk keseluruhan ebook sudah dikunci rapat
Payload Request yang dienkripsi
dilanjut dengan mengecek request yang memuat halamannya, mungkin ada celah lain yang bisa saya temukan
ternyata setelah dilihat payloadnya ter-enkripsi, jadi saya tidak tau payload apa yang dikirim
semua request payload di-enkripsi disisi client side dengan isi payload {’d’: ’enkripsi’, iv: ‘vektor’}
Cara yang masih bisa dilakukan
setelah mengetahui ebook yang dimuat secara terpisah, lalu dienkripsinya request payload, pengunduhan menjadi semakin kecil dilakukan
bukan berarti tidak bisa diunduh, hanya saja caranya akan lebih rumit untuk dilakukan
ide yang terpikirkan saat itu adalah dengan membuat monkey patching untuk menangkap data blob yang dibuat setelah data berhasil di-dekripsi
namun alih-alih menggunakan cara mudah, dan saya penasaran bagaimana cara kerja enkripsi payload request tersebut dibuat
maka saya mencoba untuk mereversenya
Mencari Script pembuat payload
langkah pertama yang saya lakukan adalah, mendebug kode javascriptnya untuk mencari script yang berfungsi untuk pembuatan payload
setelah ditelusuri dan menemukan scriptnya, ternyata enkripsi menggunakan AES-GCM
Membuat Script Enkripsi dan Dekripsi Payload
sayapun langsung menyalin script tersebut untuk dianalisa ai apakah bisa dibuatkan kebahasa pemrograman lain, ternyata bisa
pertama saya mencoba untuk membuat script decryptnya terlebih dahulu, untuk mengetahui isi payloadnya
disini saya membutuhkan key_hex untuk dapat mendekripsinya,
ternyata key_hex tersebut dimuat secara dinamis, saya menemukan key_hex tersebut berubah-ubah setiap beberapa waktu
setelah payload berhasil di dekripsi, ternyata pertahanan masih berlapis lagi
didalamnya terdapat payload dengan nama _pop yang isinya adalah data device serta perlindungan request agar tidak bisa dibajak menggunakan signature (tanda tangan yang sah)
Mencari Cara mendapatkan Private Key Signature
karena payload yang berisi pop tersebut merupakan kunci agar request terbaca sah diserver
disini saya harus mencari private key signaturenya terlebih dahulu yang nantinya digunakan untuk script enkripsi pembuatan payloadnya
dengan mendebug javascript, saya mencari script pembuat private keynya dengan awalan subtle.generateKey
setelah dilihat ternyata parameter extractable-nya diset false, artinya key tidak bisa ter-ekspos dan tidak bisa dilihat
cara mengatasinya adalah dengan monkey patching, disini saya menggunakan Tampermonkey (ektensi chrome) untuk melakukannya
dengan bantuan AI, script monkey patching berhasil dibuat.
fungsi script ini yaitu untuk mengoveride (menimpa) script window.crypto.subtle.generateKey agar extractable bisa diset menjadi true
setelah berhasil melakukan monkey patching sayapun bisa mengunduh private keynya dan memasukannya kescript enkripsi pembuat payload
Merakit Ulang Payload
setelah berhasil membuat script enkripsi, dekripsi. lalu mendapatkan private key dari signature yang akan digunakan untuk membuat payload yang valid.
saya langsung mencoba melakukan request dengan payload yang dirakit ulang dan ternyata requestnya gagal
saya mencoba mencari solusi dengan memahami lebih jauh isi payloadnya,
{
'borrow_id': '',
'device_id': '',
'_pop': {
'X-Device-Public-Key': '',
'X-Device-Signature': '',
'X-Timestamp': '',
'X-Nonce': '',
'X-Signature-JTI': '',
'X-Body-SHA256': ''
}
}
selain payload _pop ternyata ada 1 parameter lagi yang belum sinkron yaitu device_id, disini saya langsung menyamakan device_idnya dan…
request valid dan server merespon payload dengan benar
Terkena Rate Limiting
disini saya langsung merakit membuat script pengunduhan, dengan tehnik mengunduh halaman perhalaman, lalu ketika selesai diunduh semua menggabungkannya menjadi 1 file pdf
namun sayangnya ketika dipertengahan jalan saat melakukan pengunduhan ternyata ada keamanan yang tidak bisa dibantah yaitu rate-limit
belum 1 jam saya sudah mengunduh 170 halaman, rate-limiting aktif dengan keterangan dibatasi perjamnya
petualangan reverse berakhir disini, saya merasa puas karena bisa melakukan enkripsi dan dekripsi payload client side dibawa keluar dari browser
Apa saja yang saya pelajari
Request Encryption & Payload Wrapping
mengenkripsi data payload request agar tidak mudah terbaca inspektor biasa
Proof of Possession [PoP] & Request Signin
menandatangani (signature) request menggunakan kunci kriptografi (ECDSA/RSA) untuk membuktikan request benar-benar dilakukan secara sah
Device Binding
mengikat device_id agar request tidak bisa dilakukan secara sembarangan tanpa id yang valid
Dynamic key_hex Generator
kunci enkripsi dibuat secara dinamis agar setiap sesi tidak terikat pada kunci yang sama
artinya setiap payload pada sesi tersebut memiliki kunci yang berbeda dengan payload dengan sesi yang lain
Rate Limiting
jumlah request dibatasi sewajarnya, jika ada request yang terlalu cepat dalam satu waktu maka rate-limiting akan aktif
disini harus menunggu terlepas dari sesi rate-limit untuk bisa mengakses request lagi
Cara Saya Melakukan Pengunduhan
berikut bagaimana cara saya melakukan pengunduhan, semua script saya simpan didalam file zip

