Aneka bug bypass OTP (One Time Password)

Berbagai website memiliki fitur two factor authentication (2FA) dalam bentuk OTP (One Time Password) alias password sekali pakai yang biasanya dikirim via SMS atau email. Sering kali ini tidak diimplementasikan dengan sempurna dan bisa dibypass. Tulisan ini tidak membahas metode baru, hanya sekedar koleksi beberapa OTP bypass yang sering saya temukan. Tujuan tulisan ini:

  • Untuk pentester supaya jadi checklist ketika mengecek OTP
  • Untuk programmer supaya jadi checklist ketika mengimplementasikan OTP

Tulisan ini juga untuk memberi pencerahan, supaya user sadar bahwa meskipun sebuah website memiliki OTP tidak berarti 100% aman. OTP biasanya diminta ketika login kali pertama, dan kadang hanya diminta ketika akan melakukan transaksi (contoh: ketika akan transfer uang). Kadang bypass OTP bisa dilakukan di login saja, transaksi saja, atau keduanya.

Sebagai catatan: OTP hanyalah salah satu bentuk dari 2FA, contoh lainnya adalah penggunaan hardware key. Implementasi OTP yang baik seharusnya tidak bisa dibypass. Jadi jika sebuah website tidak bisa dibypass OTP-nya dengan cara di sini, maka ada beberapa kemungkinan

  • Implementasi OTP website/aplikasi tersebut sudah aman dan memang tidak bisa dibypass
  • Anda kurang kreatif memikirkan bug lain yang mungkin spesifik terhadap aplikasi tersebut

OTP kosong

Kadang sebuah website membuat OTP jadi opsional, user bisa mengaktifkan OTP jika ingin lebih aman. Beberapa website mengecek ini dari ada atau tidaknya OTP yang dikirimkan dan dengan meremove field otp kadang OTP bisa dibypass.

OTP Non Numerik/Non String

Ini bypass sangat sederhana. Program backend berharap OTP adalah string, tapi bagaimana jika kita beri input berupa array atau object? Contohnya di PHP, parameter otp=123456 bisa dicoba diganti dengan otp[]=12356. Contoh lain jika backend menerima JSON: {"userid": "x123", "otp":"123456"} lalu kita ganti menjadi {"userid": "x123", "otp":[]} .

Salah satu penyebab ini bisa terjadi adalah penggunaan strcmp di PHP untuk membandingkan string dan array. Ini adalah salah satu kelemahan type juggling di PHP. Sementara di NodeJS atau teknologi javascript lain, bisa juga memiliki bug prototype pollution.

Intinya adalah: input-input non numerik/non string atau bahkan string dengan format tertentu bisa saja membuat error pada pemrosesan di backend.

SQL Injection/Akses Database

Bug SQL injection memungkinkan kita mengintip nilai OTP saat ini. Bahkan dalam kasus tertentu field OTP itu sendiri yang memiliki SQL injection. Hal ini bisa parah jika OTP yang dipakai adalah berbasis TOTP (time based OTP), dan kita memiliki seed untuk OTP tersebut. Artinya kita bisa mendapatkan OTP untuk sembarang orang kapanpun juga.

Tentunya akses database tidak harus selalu melalui SQL Injection, bisa saja melalui noSQL injection atau melalui Remote Code Execution (RCE). Jika kita bisa mendapatkan RCE kita bisa mengupload shell yang bisa mengakses database.

Bruteforce OTP

Jika tidak dibatasi waktu dan jumlah percobaan, maka OTP bisa dibypass dengan bruteforce terutama jika hanya 4 digit. Hanya dibutuhkan maksimum 10 ribu percobaan. Dalam kasus tertentu jumlah request bisa sangat sedikit. Kasus menarik yang pernah saya temui: OTP dibutuhkan untuk menambahkan email, dan format requestnya seperti ini:

actions: [{"action": "add_email",  "email": "[email protected]", "otp":"1232"}]

Menariknya di sini adalah adanya array actions, artinya kita bisa mengirimkan banyak request sekaligus, seperti ini:

actions: [
{"action": "add_email",  "email": "[email protected]", "otp":"0001"},  
{"action": "add_email",  "email": "[email protected]", "otp":"0002"},
{"action": "add_email",  "email": "[email protected]", "otp":"0003"} 
] 

Saya beruntung karena aplikasi tersebut meneruskan memproses action berikutnya jika yang pertama gagal. Karena hanya ada 10 ribu kemungkinan, kita cukup mengirimkan 100 request dengan masing-masing request mencoba 100 OTP. Atau bahkan jika sistemnya mampu menerima, kita mungkin bisa mengirimkan 1000 OTP, dan hanya butuh 10 request.

OTP dicek di client

Ini adalah bug yang sangat aneh dan seharusnya tidak terjadi. Ketika aplikasi butuh OTP, server mengembalikan nilai OTP ke client. Client di sini artinya browser atau mobile app. Jadi jika kita bisa mengintercept hasil requestnya, kita tahu apa OTPnya. Bug ini mungkin terdengar konyol, tapi setidaknya sudah ada 3 aplikasi yang saya cek yang memiliki bug sejenis ini.

Memakai OTP user lain

Ada OTP yang diimplementasikan dengan aneh: OTP tidak diasosiasikan dengan user id, tapi dengan OTP token. Atau sederhananya: OTP sesorang bisa dipakai orang lain.

Dalam bug ini, ketika user melakukan aksi yang butuh OTP, aplikasi meminta ke server (generateOTP) dan server akan mengembalikan sebuah token OTP (bukan string OTPnya, hanya sekedar ID misalnya xyz123) ke aplikasi sambil mengirimkan nilai OTP ke SMS User (misalnya 7171). Ketika user mengetikkan OTP dari SMS yang diterimanya, maka yang dikirimkan ke server adalah: aksi user saat ini (misalnya transfer uang), token OTP (xyz123) dan OTP-nya (7171).

Masalahnya token OTP ini bisa dipakai di user lain, jadi dengan mengirimkan transaksi sebagai user B, tapi memakai nilai OTP dari user A (dengan token OTP dan nilai OTP user A) kita bisa membypass OTP user B. Jadi dalam kasus ini: attacker A memiliki account juga di website target agar bisa menerima OTP di ponselnya.

OTP spamming

Terkadang SMS tidak langsung sampai, jadi user meminta OTP sampai beberapa kali. Kadang jika kita meminta OTP 3 kali, yang sampai ke HP malah hanya 2 OTP pertama (sementara OTP terakhir masih “nyangkut”). Karena ingin berbaik hati, sebagian programmer menerima tidak hanya OTP terakhir, tapi beberapa OTP sebelumnya. Kadang ini tidak berdasarkan jumlah (n OTP sebelumnya), tapi berdasarkan waktu, misalnya OTP yang dihasilkan 10 menit terakhir akan dianggap valid.

Kita bisa menspam server dengan meminta OTP sebanyak-banyaknya. Misalnya OTP hanya 4 digit dan selama 10 menit kita bisa meminta 1000 OTP, maka kemungkinan OTP kita benar adalah 1 banding 10.

Bug IDOR update profile/phone number

Biasanya kita bisa mengubah nomor telepon via aplikasi atau via web. Jika ada bug indirect object references (IDOR) sehingga kita bisa mengupdate/menimpa profil atau ponsel orang lain ketika kita melakukan aksi profile (yang seharusnya mengupdate profile kita sendiri), maka ini bisa digunakan untuk bypass OTP karena OTP akan dikirimkan ke nomor ponsel kita.

Sebagai catatan: kebanyakan bank (termasuk yang saya pakai) hanya mengijinkan perubahan nomor ponsel dengan datang langsung ke banknya. Sementara perubahan email berbeda kebijakannya (ada bank yang mengijinkan online, ada yang tidak, ada yang butuh OTP dan ada yang tidak).

Weak Random Number Generator

Ini hanya bisa ditemukan jika kita bisa mendapatkan akses ke source code melalui bug lain (atau mungkin adminnya lupa sehingga direktori .git bisa diakses). Kadang OTP dihasilkan hanya dari random number generator yang memakai waktu saat ini sebagai seed.

Logic Reset Password

Dalam banyak aplikasi, setelah kita reset password, maka kita otomatis login. Jika ada kelemahan dalam mekanisme reset password (ini mungkin akan saya bahas di kesempatan lain), maka kita bisa memanfaatkan ini untuk bypass OTP.

Cara lain (bukan bug aplikasi)

Sebagai pelengkap, saya akan menuliskan beberapa bypass OTP yang bukan bug aplikasi dan biasanya di luar scope sebuah bounty ataupun pentest.

Kebanyakan orang jahat memakai social engineering agar korban membacakan OTP. Ini menurut saya bukan bug aplikasi, terutama jika ada instruksi yang jelas di SMS: jangan berikan OTP ini pada siapapun. Jika instruksinya tidak ada atau tidak jelas, maka itu bisa disarankan kepada developernya.

Simjacking atau SIM swap adalah serangan social engineering ke perusahaan telekomunikasi. Intinya penyerang mengumpulkan data orang lain, dan menghubungi perusahaan telekomunikasi: “Maaf SIM card saya hilang, tolong buatkan SIM card baru dengan nomor yang sama, berikut ini data pribadi saya”. Dengan data yang cukup lengkap, penipu bisa meyakinkan agar diberikan SIM Card baru.

Cara lain bypass OTP adalah dengan mengakses sistem telekomunikasi, baik itu bug di level SS7 maupun di sistem lain yang berhubungan dengan SMS. Sebagai catatan: serangan ini cukup kompleks dan rawan ketahuan. Jadi biasanya hanya dilakukan jika targetnya nilainya cukup besar.

Cara berikutnya adalah dengan malware: jika ada malware yang terinstall di HP korban, maka semua SMS bisa diakses oleh attacker. Dengan cara ini OTP aplikasi apapun yang berbasis SMS bisa diakses oleh attacker. Agar korban menginstall aplikasi malware ini, korban bisa ditipu dengan social engineering tertarget (“bapak perlu menginstall aplikasi kami terbaru agar dapat mengakses layanan ini”) atau sekedar membuat aplikasi palsu dan disebar ke web ( misalnya: “APK terbaru cheat Mobile Legends”).

Jika OTP dikirim via email, dan email sudah diambil alih oleh attacker, maka attacker akan bisa mengakses OTP. Berbagai serangan untuk mengakses email orang bisa dilakukan, dan mungkin akan saya bahas juga di tulisan lain.

Penutup

Mungkin masih ada bug-bug lain yang tidak tercantum di sini, jadi jangan cuma terpaku pada list yang tercantum di sini. Intinya pikirkan dari mulai OTP dibuat, dikirimkan, sampai divalidasi di sisi server.

Ketika saya mendapatkan source code sebuah aplikasi, kadang saya terpikir beberapa bug yang tidak terpikirkan sebelumnya. Misalnya ternyata programmernya memiliki backdoor OTP, yaitu OTP sakti berupa string khusus yang bisa dipakai di sembarang transaksi (mungkin digunakan ketika testing tapi tidak dihapus dalam production).

Artikel singkat ini sekedar menjadi checklist ketika pentest untuk mengetahui serangan apa saja yang bisa dilakukan untuk bypass OTP. Saya juga berharap programmer membaca ini agar membuat sistem yang aman. Saya suka sistem yang aman karena membuat pekerjaan pentest saya jadi lebih cepat, dan saya jadi bisa memikirkan bug lain yang lebih kreatif.

HITB PRO CTF 2019

Ini cerita khusus mengenai HITB CTF di Abu Dhabi, sedangkan cerita jalan-jalan saya tuliskan di posting lain. Dari websitenya acaranya, rencananya ada 20 tim tingkat dunia yang diundang, pemenang dari berbagai CTF lain di dunia tapi akhirnya hanya 19 team yang berkompetisi. Di akhir kami akhirnya peringkat 9 dari 19.

Tim PDKT yang lolos di HITB tercantum di CTF Time. Saya tidak akan bercerita detail tentang tim ini, silakan kunjungi website/sosmed/github masing-masing anggota teamnya: farisv, visat, wearemarching, zeroload. Sengaja saya link tidak ke linkedin langsung, supaya kalau di masa depan informasi profilenya ingin dianonimkan akan lebih mudah. Ada yang baru tingkat 3, dan sisanya belum lama lulus (tidak seperti saya yang sudah lebih 20 tahun lulus S1).

Ranking akhir pemenang bisa dilihat di: https://ctftime.org/event/918 . Di posting ini saya ingin bercerita mengenai teknis CTF ini, dari format lombanya sampai teknis beberapa soalnya.

Format lomba adalah attack defense murni, tidak ada soal jeopardy. Semua tim diberikan berbagai service yang sama, dan kita perlu menyerang service team lain sambil mempertahankan tim kita. Supaya lebih jelasnya, saya akan memberikan contoh sederhana (bukan soal sesungguhnya).

Misalnya kita diberi layanan image gallery. Ternyata di programnya ada bugnya: bisa mengupload selain image, jadi kita bisa menjalankan kode kita sendiri atau mungkin ada bug lain: bisa melihat image orang lain. Nah panitia akan menaruh flag (berupa string kode) ke dalam image, dan akan mengupload ke semua peserta (flagnya beda untuk tiap service dan tim tiap peserta).

Tugas kita adalah mencuri flag dari peserta lain, dan memastikan orang tidak bisa mengambil flag kita. Bagian sulitnya adalah: fungsionalitas harus tetap jalan, jadi kita tidak bisa membela diri dengan mematikan servicenya atau memblok semua iamge, atau memblok peserta. Jadi ada program dari panitia yang akan menguji bahwa fungsionalitas masih jalan. Di contoh ini galery harus bisa tetap menerima image dan tetap bisa didownload imagenya. Jadi patchnya harus cukup eksak, kalau membuat layanannya tidak berjalan, poin kita akan dikurangi.

Panitia sudah membuat repositori semua soal dengan writeup dari panitia (dengan solusi yang diharapkan panitia). Ini bisa diakses umum di:

https://github.com/HackerDom/proctf-2019

Terlihat bahwa team PDKT berhasil pertama menyelesaikan salah satu soal drone_racing (first blood untuk soal itu).

Kita bisa menjalankan tcpdump untuk memonitor layanan kita agar bisa mempelajari eksploit yang dikirimkan team lain. Tapi tcpdump ini tidak selalu ampuh karena beberapa hal:

  • Team lain mengirimkan eksploit yang obfuscated
  • Kadang data yang dikirimkan sangat besar (misalnya image), padahal disk space virtual machine yang diberikan sangat terbatas
  • Kadang layanan memakai SSL (encrypted), jadi harus diintercept dengan cara khusus (tidak bisa sekedar tcpdump)
  • Kadang layanan memakai enkripsi custom

Jika ada beberapa team yang mendapatkan skor terlalu banyak dari satu soal, soal itu akan dipensiunkan dan diganti dengan soal yang lain. Soal-soal hari pertama baik yang bisa maupun yang tidak bisa diselesaikan juga dipensiunkan di hari ketiga.

Menurut saya beberapa soal dirancang tidak bisa diselesaikan dalam waktu sehari, dan memang diharapkan peserta meneruskan pengerjaan soal di hotel. Jadi jika ada lomba semacam ini, sebaiknya persiapkan stamina dengan baik.

Ada beberapa soal yang saya benar-benar tidak kepikiran karena tidak tahu bahwa suatu hal itu mungkin. Misalnya saya tidak memperhatikan di soal rubik bahwa bisa saja terjadi use after free karena menggunakan alokasi stack manual di F#. Saya tidak tahu bahwa ini bisa dilakukan di F# dan bahwa tidak ada pengecekan yang dilakukan oleh runtime .NET.

Satu soal yang membuat menyesal adalah SepToN. Saya tahu persis harus bagaimana: melakukan attack terhadap Substitution–permutation network. Dulu saya sempat mempelajari ini khusus AES untuk melakukan fault injection attack di hardware, tapi saya tidak pernah benar-benar mempraktikkan variasi SPN yang tidak wajar (di kasus ini round-nya hanya 4).

Saya merasa soal-soal enkripsi blok ini cukup mengada-ada. Saya tidak pernah menemukan di dunia nyata orang yang membuat block cipher custom sendiri. Sedangkan untuk berbagai kasus kelemahan kriptografi yang lain, memang saya temukan. Saya merasa stuck karena saya pikir attack hanya bisa dilakukan terhadap BMP header (4 byte) saja. Setelah membaca writeupnya, ternyata komponen Alpha bisa digunakan.

Ada satu team yang berhasil menyelesaikan soal SepToN ini, dan dari satu soal ini saja, mereka mendapatkan nilai yang sangat banyak. Tidak ada defense khusus yang bisa dilakukan untuk menangkal ini, jadi semua tim lain juga pasrah.

Soal yang diberikan sangat bervariasi, dan bahkan ada soal IOT juga. Saya sendiri awalnya diundang karena akan ada materi khusus IOT, tapi ternyata bagian ini dibatalkan. Ternyata dalam lomba ini tetap ada satu soal IOT. Saya agak menyesal tidak memperhatikan bahwa diberikan kabel mini USB untuk ST-LINK, dan baru di hari kedua saya sadari kabel ini ada dan bisa dipakai mengekstrak firmwarenya. Sayangnya waktunya tidak cukup, dan soal tidak diteruskan untuk hari ketiga. Saya jarang melakukan reversing kode ARM thumb (terakhir adalah ketika melakukan RE Pokemon Go Plus), dan prosesnya agak lama.

Ada juga satu soal berhubungan dengan AI (adversarial attack). Saya merasa sedikit kesal dengan diri sendiri karena tidak pernah benar-benar mencoba attack terhadap AI meskipun tahu teorinya. Saya tahu dengan tepat bagaimana neural networknya bekerja, dan saya mencoba-coba mengimplementasikan neural network sederhana dengan layer deconvolutional tapi akurasinya masih terlalu rendah.

Kesulitan utama dalam mengerjakan CTF seperti ini adalah: memilih soal untuk dikerjakan. Ada beberapa soal yang dari awal sepertinya sudah terlihat sangat sulit, tapi ternyata mudah (misalnya soal ca), dan karena sudah merasa akan ribet, kami jadinya tidak menyelesaikannya. Beberapa soal lain terlihat sulit dan memang sangat sulit (misalnya convolutional) dan saya merasa ini hampir mustahil selesai sehari (dan memang semua tim gagal menyelesaikan ini).

Di sisi lain: kadang soal sulit bisa memiliki solusi sederhana yang tidak diharapkan pembuat soal. Team PDKT berhasil menyelesaikan soal Drone Racing yang mestinya sangat rumit (overflow file .class) dengan hanya menggunakan trik database.

Saya kagum dengan dedikasi team PDKT yang selagi lomba juga sambil mengurus final Cyber Jawara, jadi waktunya agak tersita karena sambil lomba juga mengurusi lomba di Indonesia. Semoga berikutnya akan ada lebih banya lagi yang kemampuannya setara, supaya minimal bisa membantu penyelenggaraan lomba di Indonesia.

Penutup

CTF offline seperti ini memang cocok untuk anak muda, sedangkan saya merasa agak lelah karena masalah perjalanan dan perbedaan time zone dan stamina tidak seperti waktu saya masih muda. Selain itu sudah lama juga saya tidak ikut CTF yang umum seperti ini, dua tahun terakhir saya hanya ikutan CTF Flare On saja. Mungkin kalau pekerjaan utama saya sehari-hari berhubungan dengan security, akan lebih mudah untuk update ilmu security/CTF setiap hari.

CTF seperti ini butuh tetap mengerjakan soal di hotel. Ini juga alasan saya tidak membawa Risna dan anak-anak, karena tidak akan bisa bersenang-senang di hari lomba. Sepertinya sekarang ini saya lebih cocok dengan CTF jangka panjang seperti Flare On supaya santai.

Pemain CTF juga harus belajar banyak hal baru, termasuk juga topik sulit seperti AI. Topik dasar enkripsi secara menyeluruh juga perlu dikuasai Saya sendiri jadi terinspirasi untuk akan lebih banyak menuangkan hal-hal seperti ini dalam bentuk tulisan (sudah lama tidak menulis teknis dasar).

Semoga di tahun-tahun berikutnya team Indonesia bisa lebih baik lagi.

Flare-On 2019 dan pembahasan soal no 6

Flare On ke-6 sudah selesai dan solusi dari panitia juga sudah diberikan. Ini tahun ke-5 saya menyelesaikan seluruh soal Flare On.Tidak seperti tahun-tahun sebelumnya di mana saya ingin buru-buru selesai, tahun ini saya sangat santai dan selesai di peringkat 148. Tahun ini ada 308 orang yang selesai semua dari total 5790 yang mendaftar. Kalau tidak sibuk, tahun depan saya rencana tetap ikut dalam mode santai seperti ini.

Menurut saya Flare On ini sangat berguna untuk mengasah ilmu reverse engineering dan mengenal berbagai teknik baru yang tidak/belum saya ketahui. Soal tahun ini sejak nomor satu sudah lebih sulit dari tahun-tahun sebelumnya, tapi ada 3228 yang berhasil menyelesaikan soal pertama. Menurut saya soal-soal nomor tinggi justru lebih mudah dari tahun-tahun sebelumnya tapi butuh banyak kesabaran. Sama seperti tahun-tahun sebelumnya, di akhir kita akan ditanya apakah ingin mengirimkan CV ke Fire Eye.

Tahun ini ada dua orang yang saya kenal dari Indonesia yang berhasil menyelesaikan Flare On: 0xf4c0 dan Visat (dari team PDKT), seperti biasa karena alamat pengiriman hadiah di Thailand saya dihitung dari Thailand.

Dulu saya cukup rajin untuk menuliskan solusi semuanya, sekarang karena solusi dari panitia sudah datang cepat, saya malas menuliskannya, kecuali jika ada pendekatan saya yang berbeda. Tahun lalu saya hanya menuliskan dasar ilmu apa yang dibutuhkan untuk menyelesaikan tiap soal.

BMPHIDE

Hari ini ada yang bertanya apakah saya bisa menuliskan cara saya menyelesaikan soal No 6 (BMPHIDE), karena saya punya waktu, jadi saya tuliskan saja sekarang (kebetulan juga sekarang Flare On ke-6, jadi saya bahas soal No 6 saja). Di soal ini kita diberi sebuah program dan file bitmap (BMP). Soalnya bernama bmphide, dari namanya saja sudah terpikir bahwa ini adalah soal steganografi, tapi tentunya bukan soal steganografi biasa.

Sebelum membaca solusi saya, sebaiknya baca dulu solusi resmi dari Flare On (PDF), lalu kembali ke sini. Ada beberapa hal yang tidak akan saya bahas detail, misalnya: ada anti debug sehingga program tidak bisa didebug. Dari pengalaman di Flare On tahun-tahun sebelumnya: jika ada anti debug, maka saya akan berusaha tidak memakai debugger karena biasanya anti debugnya sangat kompleks dan memakan waktu lama. Bahkan di beberapa soal di tahun sebelumnya: jika dijalankan di debugger malah tidak bisa ketemu flagnya.

Tidak ada instruksi untuk menjalankan program yang diberikan, tapi karena programnya ditulis dalam .NET kita bisa membongkarnya dengan dnspy untuk melihat kodenya. Bagian main-nya seperti ini:

Dari membaca kodenya, Program BMPHIDE.EXE dipakai untuk menyembunyikan data di dalam file bitmap. Jika dibaca sekilas bagian enkripsi (Program.h()) dan menyembunyikan data dalam bitmap (Program.i()) cukup jelas. Ini steganografi standar dengan menggunakan LSB.

Pendekatan saya tidak memakai debugger adalah dengan membuat ulang programnya di project Visual Studio. Ternyata jika kode hasil dekompilasi ini kita copy paste ke project baru di Visual Studio, hasilnya tidak seperti yang diharapkan. Jadi pasti ada sesuatu yang ajaib yang dilakukan oleh program.

Jadi akhirnya saya mulai membaca lagi lebih teliti programnya. Ada method aneh bernama VerifySignature. Dari melihat sekilas saja, sepertinya ini akan membuat agar pointer method1 jadi pointer method2. Setelah membaca-baca beberapa artikel (contohnya ini), memang itu yang dilakukan.

Mungkin ada yang heran: dari mana tahu bahwa ini kode penting? Saya tahu dasar .NET, jadi terbayang kira-kira apa yang bisa dan tidak bisa dilakukan di .NET, jadi dari dasar ilmu itu bisa mencari di Internet mengenai MethodHandle di .NET dan apa yang bisa dilakukan.

Sekarang hal pertama sudah diketahui: ada method yang ditukar implementasinya, jadi andaikan kita memanggil method X, yang dipanggil sebenarnya Y. Tapi method mana yang ditukar? tidak dengan mudahnya mereka menuliskan tukar method bernama X dengan Y, tapi mereka membuat kode seperti ini:

Intinya seluruh method dibuat checksum kodenya, lalu method yang checksumnya sekian akan ditukar dengan yang checksumnya sekian. Di project visual studio saya, saya perlu meload bmphide.exe ini agar bisa dilihat semua methodnya dan dibuat checksumnya. Ini bisa dilakukan dengan kode semacam ini (kuncinya di sini adalah Assembly.LoadFrom):

Dari sini saya bisa mengetahui method mana yang ditukar. Tapi ternyata tidak cukup di sini triknya. Ada method yang bernama IncrementMaxStack (namanya menyesatkan, tidak ada hubunganya sama sekali dengan stack), yang berisi kode untuk mem-patch alamat memori dengan isi tertentu (lihat “writeByte” dan “writeInt32”). Dari nama fieldnya (ILCode) sudah jelas bahwa yang dipatch adalah IL (Intermediate Language) code, tapi kode yang mana yang dipatch?

Kali ini method tidak dicari berdasarkan isi checksumnya tapi berdasarkan metadata tokennya. Jadi sekali lagi saya meloop semua method dan mencetak MetadataToken-nya untuk mendapatkan dua method yang dipatch. Saya bahas saja salah satu method yang dipatch yaitu program.g, hasil dekompilasi asli seperti ini:

Tapi kode ini dipatch di offset 6 dengan angka baru dan offset 18 (atau 12 hexa) dengan angka baru.

Jika kita lihat IL code-nya, akan terlihat apa artinya offset 6 dan 12 hexa ini (lihat kolom kedua, dengan header “offset”). Di sini tidak ada offset 6, tapi ada offset 5. Di offset 5 ada instruksi ldc (load constant), yang meload bilangan -0x12477CE0. Bilangan ini yang dipatch menjadi 309030853. Hal yang sama juga dilakukan untuk offset 12 heksa.

Jadi setelah diperbaiki, fungsi g menjadi seperti ini:

Setelah mendapatkan versi benar dari semua methodnya, saya bisa mengcompile bmphide saya sendiri, dan bisa mendebugnya dan memahami algoritmanya dengan mudah. Sisanya hanya membuat dekriptor dan ekstraktornya.

Pendekatan saya sebenarnya antara pendekatan 1 dan 2: saya membrute force per byte dengan memanggil fungsi enkrip. Loopnya seperti ini:

Tidak seperti solusi di flare-on di mana hasil brute force (solusi 1) tidak jelas, hasil brute force ini akan jadi image yang bersih.

Penutup

Soal ini sebenarnya hanya “pemanasan” dalam hal enkripsi, tepatnya bagaimana sebuah enkripsi yang relatif sederhana bisa disembunyikan dengan trik sehingga sulit dibaca meskipun menggunakan decompiler. Soal berikutnya yang lebih serius ada di no 10. Di soal 10 kita diberi “ransomware” (bernama mugatu) yang memiliki kelemahan di bagian enkripsinya.

Bagi yang ingin merasakan betapa lamanya memahami enkripsi dan membuat dekriptor sebuah ransomware, silakan mencoba menyelesaikan soal no 6 dan 10. Ini soalnya masih sangat sederhana dan malware yang sebenarnya akan butuh waktu yang lebih lama lagi.

Cerita hacking dari masa lalu

Sebagian teman angkatan di Informatika ITB tahu kalau saya dan Deny dulu hampir di-DO karena “ngehack” kampus, tapi cerita detailnya belum pernah saya tuliskan. Nah kali ini dengan persetujuan dan encouragement dari Deny, Tintin, dan Okta saya akan tuliskan ceritanya. Karena ini cerita lama (lebih dari 20 tahun yang lalu), saya akan banyak memberikan latar belakang cerita.

Cerita ini sudah sangat lama, sebagian detail sangat saya ingat, tapi sebagian lagi benar-benar lupa. Ketika bertanya ke Tintin dan Deny mereka juga banyak lupa detailnya, jadi saya ceritakan saja di sini sekarang sebelum tambah lupa lagi.

Kenalan dengan Hacker

Saya awali dulu dengan cerita ketemu Deny. Sekedar background: kok bisa ketemu dengan orang lain yang suka ngehack?

Saya ketemu Deny kali pertama waktu kuliah di Informatika ITB, tahun 1998. Di ITB tingkat 1 adalah Tahap Persiapan Bersama, di tahun pertama semua jurusan pelajarannya sama yaitu ilmu-ilmu dasar dengan tujuan agar ilmunya seragam di tingkat berikutnya. Pelajaran yang diberikan misalnya: Fisika, Kimia, Matematika (Kalkulus), Bahasa Inggris, dan bahkan ada juga pelajaran Olah Raga.

ITB

Nah saya jadi ngobrol dengan Deny karena waktu itu saya membawa buku komputer. Kalau tidak salah ingat judul bukunya: Meningkatkan Dayaguna Komputer dengan Turbo Pascal karangan Busono. Buku ini mengajarkan cara mengakses hardware komputer secara low level (serial port, parallel port, dsb) dengan Turbo Pascal.

Perlu dicatat bahwa saat itu (nggak tau sekarang) banyak yang masuk Informatika ITB tapi pengetahuannya mengenai komputer sangat dasar sekali. Informatika ITB dipilih banyak orang karena passing grade-nya waktu itu adalah yang tertinggi. Jadi saya senang ketemu dengan seseorang yang bisa ngobrol programming selagi programming belum diajarkan di kelas.

Meski belum diajarkan programming, HMIF (Himpunan Mahasiswa Informatika) ITB memberikan pelatihan dasar Linux pada seluruh mahasiswa baru setelah selesai masa OSPEK. Pelajarannya sangat dasar: bagaimana mengakses Linux, mengakses email, membuat file, mengedit dengan vi, dsb.

Di pelatihan itu (Agustus 1998) kali pertama saya dan Deny belajar mengenai Linux. Sebelumnya kami cuma memakai DOS dan Windows. Setelah masa pelatihan selesai, mahasiswa (tingkat manapun, termasuk tingkat 1) boleh bebas mengakses lab ketika tidak ada praktikum. Bahkan kadang diperbolehkan juga pada jam praktikum kalau kenal dengan asistennya, selama masih ada komputer kosong di belakang dan tidak mengganggu sesi praktikum.

Lab

Di semua waktu luang tingkat 1, saya dan Deny menghabiskan sebagian besar waktu ngoprek di Lab. Waktu itu belum ada Google (tepatnya lagi baru September 1998 Google didirikan, itupun tidak langsung populer), jadi sumber utama ilmu kami adalah:

  • Majalah Phrack
  • Halaman manual (man page), bahkan saya pernah memprint banyak sekali manual page “perl” untuk dibaca di kost
  • Mailing list (misalnya bugtraq)
  • Beberapa website dan e-Zine

Entah kenapa saya dan Deny tidak tertarik sama sekali untuk join dengan berbagai “group hacker” seperti hackerlink, kecoak elektronik, dsb. Tapi saya dapat cerita dari teman kami Tintin (sekelas/seangkatan juga), bahwa group yang ada itu ya cuma bisa compile exploit dari Packet Storm, dan bahkan kadang mereka bingung kalau ketemu error waktu compile.

Waktu tahun kami masuk, kondisi mesin di lab sedang cukup parah. Baru dua tahun setelah itu ada dana baru sehingga mesinnya diupgrade secara signifikan. Dulu sudah jaman Pentium tapi mesin di lab masih 486 DX dan keyboardnya banyak yang mulai error. Mesinnya bisa dual boot: network boot ke Linux (diskless, memakai NFS) dan ke Novell Netware. Dari Netware kita bisa telnet ke salah satu server yang bisa diakses mahasiswa (Puntang/x86 dan kerinci/Sparc).

Sebagai catatan: di berbagai jurusan lain (misalnya Teknik Elektro) waktu itu yang banyak dipakai adalah BSD (biasanya FreeBSD), tapi di jurusan Informatika yang banyak dipakai adalah Linux dari awal. Dari setup yang dilakukan, bisa dilihat bahwa adminnya (mas Budi Aprianto mahasiswa yang dipandu oleh dosen, Pak Riza Satria Perdana ) sangat capable dan sudah mensetup sistemnya dengan baik:

  • Network boot dengan PXE waktu itu belum umum, harus burn EPROM di Network Card
  • Diskless boot juga tidak terlalu umum. Server NFS-nya memakai Solaris di server dengan CPU SPARC

Awalnya rasanya aneh memakai Linux, beberapa ilmu DOS seperti TSR, mengakses layar secara langsung atau memakai Library “<conio.h>” untuk mewarnai layar tidak berlaku di Linux. Tapi saya dan Deny cukup rajin belajar mengimplementasikan banyak hal, dari network programming (bikin port scanner dengan full TCP connect), sampai termasuk juga yang berhubungan dengan security.

Di tahun 1998 sebenarnya mekanisme shadow password sudah disupport di Linux, tapi entah kenapa belum diimplementasikan di distribusi yang kami pakai. Salah satu “hack” pertama yang kami lakukan adalah membuat program untuk membrute force password seseorang. Waktu itu password requirement belum diterapkan, jadi passwordnya masih relatif gampang ditebak.

Seperti yang saya jelaskan: kondisi lab waktu itu cukup parah, banyak keyboard yang error, kadang menekan 1 huruf tapi hurufnya tertekan 2 kali atau malah tidak tertekan. Ini biasanya jadi masalah ketika mengganti password (ada kelebihan/kekurangan huruf). Daripada selalu merepotkan admin, waktu itu kami membantu teman yang lupa password dengan mencoba-coba otomatis menambah dan mengurangi karakter dari password terakhir yang diingat.

Perpustakaan

Lab di Informatika ITB tutup di sore hari (lupa jam 4 atau 5), tapi ada rental Internet di perpustakaan ITB yang tutup sampai jam 7 malam. Jika saya belum ingin pulang (toh di kost nggak banyak yang bisa dikerjakan) saya akan menghabiskan uang untuk nongkrong di rental internet perpustakaan (memakai Windows 97).

Perpustakaan ITB

Akses internet di perpustakaan ITB adalah per 30 menit: bayar dulu, komputer tertentu akan diaktifkan, dan jika waktu habis koneksi akan dimatikan otomatis. Tapi lama-lama kan mahal, jadi saya mempelajari bagaimana prosesnya sejak memberi uang, dapat akses internet, sampai aksesnya dimatikan lagi.

Ternyata operator akan melakukan telnet ke sebuah server dan dari situ ada skrip untuk membuka akses internet. Saya perhatikan juga bahwa ada admin yang suka memakai salah satu komputer di dalam ruangan rental.

Saya menulis sendiri keylogger yang memakai API windows. Tepatnya sebenarnya bukan keylogger karena tidak mencatat semua tombol, tapi hanya akan mencari semua single line textbox dan password textbox dan melog teks serta passwordnya ke file. Di Windows lama (95 sampai ME) ini sangat mudah, kita cukup mengenumerasi handle Window dan mengirimkan WM_GETTEXT (waktu itu tidak ada sistem permission di Windows). Dengan teknik tersebut, segala macam password yang sudah tersimpan juga bisa didapatkan passwordnya (tidak hanya yang diketik manual).

Saya hanya memasang logger di komputer yang saya tahu dipakai admin. Dengan logger itu saya bisa mendapatkan akses internet unlimited di perpustakaan. Supaya tidak mencurigakan biasanya saya akan membayar 30 menit pertama dan hanya meneruskan kalau sepi. Di semester baru, saya baru tahu dari Deny kalau dia bawa logger saya dan dia pakai di warnet di Medan.

Tempat Lain

Lab IF dan Perpustakaan sebenarnya bukan satu-satunya tempat nongkrong. Banyak tempat lain di ITB yang punya lab komputer dan jadi tempat belajar untuk banyak orang, misalnya ada PAU (Pusat Antar Universitas), unit ARC (Amateur Radio Club), berbagai lab di berbagai jurusan.

Masing-masing orang punya kisahnya di tempat mereka, dari mulai kisah teknis seperti kami, sampai ada yang ketemu pasangan di tempat-tempat tersebut. Saya sendiri dulu sempat juga main ke ARC sebentar, tapi karena merasa kurang cocok, jadi lebih sering di lab IF (sementara Deny cukup sering ke ARC).

Root

Saya tidak ingat kapan kami mulai berani mengakses root. Tapi ini terjadi kira-kira akhir tahun (sekitar 3-4 bulan sejak kami belajar Linux). Akses root pertama kami dapatkan dari backdoor di port yang kami temukan dengan port scan. Selain cara itu, waktu itu ada banyak sekali eksploit yang bisa dipakai asalkan kita mencari di Internet (atau melihat mailing list bugtraq).

Sebagai catatan: dari adanya backdoor berarti sudah ada yang lebih dulu dari kami mendapatkan root. Salah satu teman kami, Okta juga dapet root dengan eksploit sendmail.

Salah satu alasan kami mendapatkan root adalah: untuk mengakses internet dari lab IF ITB. Di semester pertama kami cuma dapat akses email. Kami berusaha mencari host yang memiliki akses internet dan/atau username/password proxy yang bisa dipakai.

Berikutnya setelah jadi root di satu host, mau ngapain? Bagian pertama adalah: jadi root di host lain. Kami bisa telnet ke mesin x86 dan Sparc. Di mesin x86 kami sudah punya root, tapi di Sparc kami nggak punya exploit apa-apa. Kami bisa mengakses home dir yang sama (via NFS). Jadi pertama adalah pivoting: mengcopy shell di Sparc ke home directory, lalu di-chmod setuid root dari server x86. Sekarang kami punya akses di kedua server utama. Dari mana dulu tahu ilmu ini? sebenarnya semuanya cuma logika dasar aja. Setelah tahu konsepnya, mengembangkan hal-hal dasar seperti itu tidak sulit.

Keisengan berikutnya muncul: Deny mendownload source code program “login”, lalu menambahkan kode logging agar password disimpan ke file. Executable baru itu dipakai untuk menggantikan program login asli di kedua server. Hasilnya: kami dapat password semua orang.

Sebagai catatan: programming itu sangat perlu untuk seorang hacker. Sekarang ini banyak yang mengaku “hacker”, tapi kalau saya berikan source code saja dan saya minta untuk menambahkan logging kebanyakan tidak bisa.

Meskipun mendapatkan akses ke semua account, kami tidak tertarik membaca email atau file-file orang lain. Segala macam yang kami lakukan waktu itu cuma karena penasaran aja. Kami juga nggak mau mencoba teknik-teknik yang kami anggap nggak butuh skill teknis, contoh yang tidak kami lakukan:

  • Denial Of Service
  • Email bombing
  • Social engineering

Bagian social engineering ini: kami nggak pengen seseorang jadi merasa bersalah jadi korban Social engineering. Tujuan hacking waktu itu adalah: belajar teknis.

Tertangkap

Saya tidak tahu tepatnya apa yang membuat kami tertangkap. Seingat saya kami sudah sangat teliti: tidak memakai home directory sendiri, tapi memakai home directory dua mahasiswa ITB yang diterima tapi pindah keluar negeri. Kalau tidak salah ingat: ada keanehan di sistem dan itu menyebabkan penelusuran yang mendalam di sistem dan malah mengarah ke kami berdua.

Saya ingat waktu itu ada kuliah di salah satu gedung di tengah ITB (lupa tepatnya, antara Oktagon atau TVST), dosennya adalab Bu Putri. Kami sadar ada yang salah, karena di akhir kuliah tiba-tiba beliau memanggil: yang namanya Yohanes Nugroho mana ya? (saya berdiri), terus “kalau Deny Saputra?” (Deny berdiri). Terus udah: “silakan duduk, cuma pengen tahu yang mana sih orangnya”. Urutan memanggilnya begitu, karena NIM saya lebih rendah dari Deny.

Selesai kuliah itu saya dan Deny sudah tahu bahwa kami tertangkap. Saya diwawancara oleh Pak Riza Satria Perdana, lalu Deny juga (wawancaranya terpisah). Setelah semuanya selesai, kami diberi tahu bahwa sebenarnya yang kami lakukan itu bisa membuat kami di DO. Tapi Pak Riza mau memberi kesempatan, bahkan akhirnya saya menjadi administrator jaringan Informatika ITB.

Saya sebutkan di atas bahwa Okta juga mendapatkan root, tapi lolos dari interogasi. Kenapa? karena waktu interogasi, saya ditanya itu setuid shell punya siapa? saya bilang “nggak tau, mungkin Deny yang taruh situ”, dan ketika Deny ditanya: “nggak tau, mungkin Yohanes yang taruh di situ”.

Supaya jelas: meskipun kami sering ngehack bareng , bukan berarti tiap hari duduk berdua dan ngobrol berdampingan. Kami hacking terpisah, dan banyak diskusi. Kadang saya dan Deny duduk di lab terpisah dan berbicara dengan software “talk“. Jadi kami nggak tahu 100% apa yang dilakukan yang lain.

Penutup

Sejak kami tertangkap, kami jadinya pelan-pelan meninggalkan dunia security dan lebih fokus ke programming. Memasuki tahun kedua, sudah ada banyak tantangan dari berbagai tugas kuliah yang diberikan, jadi sudah tidak bosan lagi. Tapi masih ada juga sedikit jejak yang saya lakukan di bidang security setelah itu (misalnya ini).

Setelah itu saya banyak terlibat berbagai kegiatan lain, misalnya mengurus TOKI, ikut jadi programmer pengolah data di ITB, ikut proyek dosen, jadi asisten di universitas swasta, memberi les, dsb). Sedangkan Deny mengambil jalan hidup lain (silakan tanya sama Deny buat yang ketemu, nggak akan diceritakan di sini). Okta sekarang jadi expat di Timur Tengah.

Baru tahun 2014 saya mulai terlibat lagi di dunia security. Kerjanya hanya part time pentesting (sampai sekarang masih part time). Part time di sini artinya: dari Senin sampai Jumat saya kerja di perusahaan di Thailand sini menjadi programmer yang tidak ada hubungannya dengan produk security dan cuma di malam hari/weekend saya melakukan pentesting.

Tahun 2016 ikutan ngajak Deny untuk ikutan Flare On dan Pentesting. Ternyata ilmu Deny di bidang RE dan pentesting masih tajam walau tidak pernah khusus pentesting. Contohnya kelakuan hardcorenya ketika mengerjakan RHME (Hardware CTF): reversing statik assembly AVR (bukan kode C hasil decompiler), pake listing HTML dari IDA, di handphone, di kereta pulang sambil berdiri (dan flagnya ketemu).

Kami minta maaf buat yang dulu merasa kesal dengan kelakuan kami. Kami juga mengucapkan terima kasih untuk Pak Riza dan para dosen lain yang masih memberi kesempatan pada kami untuk bertobat dari kenakalan kami dan bisa meneruskan di ITB.

Setelah lama lulus, dapet cerita dari Tintin, ternyata kelakuan kami dulu sangat menginspirasi dia untuk belajar security. Bahkan Tintin sekarang sudah mengambil S2 security dari Carnegie Mellon University. Syukurlah, ternyata yang kami lakukan nggak sepenuhnya berefek negatif untuk orang lain :).

Kalau dari ingatan Tintin, ada banyak hal iseng lain yang kami lakukan, tapi karena saya nggak ingat, saya tidak ceritakan di sini. Walau mungkin dulu sengaja saya lupakan karena terlalu iseng. Seingat saya sih saya nggak pernah berniat jahat.

Tapi saya harap yang kami lakukan di atas tidak ditiru mentah-mentah. Jangan menghack kampus, sudah ada banyak cara lain yang legal untuk belajar security:

  • Ada bug bounty
  • Ada berbagai CTF
  • Ada berbagai sertifikasi yang bisa diambil

Hal yang patut ditiru adalah:

  • Semangat membaca artikel teknis
  • Semangat mencoba berbagai hal teknis secara umum
  • Semangat belajar programming

Kalau bisa ketemu orang atau kelompok yang membantu bertumbuh akan lebih baik lagi.

Happy Hacking

Mengenal Frida untuk Reverse Engineering

Salah satu tools reverse engineering yang sering saya pakai adalah Frida. Frida memungkinkan kita meng-intercept fungsi dalam C/native code (di berbagai sistem operasi), Java (di Android) dan Objective C (di macOS/iOS) dengan menggunakan JavaScript. Mungkin bagi sebagian orang deskripsi ini masih agak terlalu mengawang-awang, jadi akan saya berikan contoh nyata apa maksudnya mengintercept fungsi.

Saya berikan contoh program kecil seperti ini dalam C, yang hanya melakukan loop membuka satu file, mencetak sebaris dari file tersebut, lalu program akan sleep selama 1 detik. Program ini akan saya intercept dengan Frida.

Saya mengisi file1 dengan string “Yohanes Nugroho” dan file2 dengan string “Risnawaty”, jadi ketika dijalankan outputnya seperti ini:

Jenis intercept pertama adalah hanya sekedar memonitor pemanggilan fungsi. Dalam kasus ini saya memakai cara mudah memakai frida-trace dan meminta agar fungsi “open” ditrace. Pertama kita jalankan test-open di satu window, dan frida-trace di Window lain.

Sebagai catatan: fungsi C fopen akan memanggil fungsi “open”. Jadi kita juga bisa mengintercept “open”, dan hasilnya seperti ini:

Saya lebih suka bekerja dengan fungsi yang levelnya lebih dekat ke kernel, karena tidak perlu khawatir dengan berbagai detail implementasi di library C. Contohnya: fungsi fwrite akan membuffer penulisan ke file, sedangkan jika kita memakai write, akan langsung dituliskan. Contoh masalahnya ketika memakai fwrite kadang bingung: loh kenapa isi filenya masih sama? oh ternyata belum di-flush.

Dari contoh ini sudah bisa terlihat satu kegunaan tools ini: untuk melihat parameter sebuah fungsi. Dalam kasus tertentu ini sangat berguna, misalnya Kita bisa melihat key apa yang dipakai oleh sebuah fungsi enkripsi dengan memonitor fungsi enkripsi. Selain memonitor, kita bisa mengubah mengganti sesuatu, tidak sekedar memonitor.

Program frida-trace akan otomatis membuat file javascript sesuai nama fungsinya di direktori __handlers__. Dalam kasus ini didapati ada dua fungsi open: didalam libc dan libpthread. Dalam kasus ini yang akan terpakai adalah open di dalam libc. File Javascript yang dihasilkan oleh frida-trace seperti ini:

Intinya adalah: ketika masuk ke fungsi open, maka log/cetak parameter fungsinya. Sekarang kita bisa mengganti agar jika file1 dibuka, kita ganti dengan file2, seperti ini:

Sekarang kita bisa mencoba lagi menjalankan frida-trace. Di Window atas adalah program sebelumnya. Di bawahnya saya menjalankan frida-trace (dengan Javascript yang sudah dimodifikasi). Hasilnya di awal program akan mencetak “Yohanes Nugroho”, dan ketika frida-trace dijalankan, file yang dibuka diganti dengan file2 yang berisi “Risnawaty”. Ketika frida-trace dihentikan, fungsi dikembalikan seperti semua.

Perhatikan bahwa saya tidak mengubah sama sekali program test-open. Program tersebut dijalankan apa adanya seperti semula. Dengan kemampuan untuk mengubah parameter (dan juga kembalian fungsi, dalam onLeave), maka kita bisa membypass berbagai proteksi sederhana misalnya membuat isJailbroken() mengembalikan false, atau membuat layar administrator di aplikasi mobile bisa diakses user biasa. Dalam kasus tertentu ini bisa gawat jika ternyata checking hanya dilakukan lokal dan bukan di server.

Ketika mengintercept fungsi, Frida bisa memetakan dari calling convention menjadi objek javascript, misalnya register RDI di calling convention x86_64 menjadi isi args[0], dan ketika mengubah args[0] ini dipetakan agar mengubah RDI. Translasi calling convetion ini otomatis, jadi kita tidak perlu tahu di ARM memakai register apa untuk parameter pertama. Selain intercept fungsi, frida juga bisa mengintercept alamat tertentu (satu titik). Di mode ini, kode kita akan dipanggil tiap kali alamat tersebut dilewati (seperti breakpoint di debugger) tapi tidak ada pemetaan register atau stack ke argumen, jadi register dan memori perlu diakses manual.

Dalam banyak kasus, Frida bisa menggantikan peran debugger. Biasanya ketika melakukan RE Native Code, saya akan membaca kodenya, memahaminya, lalu biasanya perlu tahu nilai sebuah register atau isi memori tertentu. Dengan debugger, saya akan melakukan breakpoint di sebuah fungsi, lalu melihat isi registernya di titik itu atau mengubah nilai registernya. Dengan Frida, saya bisa menulis skrip untuk mengintercept alamat tertentu, dan di situ saya bisa melakukan aksi apapun dengan Javascript, misalnya:

  • Memprint isi register (atau mengubah registernya)
  • Mencetak backtrace fungsi (mengetahui fungsi mana yang memanggil fungsi ini)
  • Memprint isi memori (atau bahkan mengubahnya)

Perlu diperhatikan bahwa: kita perlu tahu dengan tepat fungsi apa yang perlu diintercept. Ini bisa dilakukan dengan static analysis (menggunakan disassembler/decompiler). Seperti contoh yang saya berikan: kita bisa melakukan intercept pada fungsi/API yang umum (open) tanpa mengetahui kodenya.

Cara kerja Frida

Ada banyak tulisan mengenai Frida, tapi kebanyakan hanya membahas satu hal kecil saja (kebanyakan untuk intercept API di Android saja). Di sini akan saya bahas sedikit lebih luas, supaya bisa memakai Frida di platform mana saja, bukan hanya untuk intercept aplikasi mobile.

Secara umum sebagian besar kode Frida ditulis dalam C dan bahasa Vala. Karena Frida memakai Javascript sebagai bahasa untuk mengontrol target, sebagian API Frida ditulis dalam Javascript. Tools command line Frida ditulis dengan Python, dan API utama Frida adalah dalam C. API Frida juga bisa diakses berbagai bahasa (Python/Java/.NET/Node dsb).

Hal pertama yang harus dipahami adalah: Frida perlu berjalan di address space proses yang menjadi target. Ada beberapa cara frida bisa masuk ke address space proses lain:

  • Kita compile source code kita dengan menginclude library Frida (dengan frida-gum-devkit, atau frida-gumjs-devkit)
  • Kita load library Frida (frida-gadget) dengan fitur OS tertentu, misalnya LD_LIBRARY_PATH di berbagai OS sejenis Unix (misalnya Linux), atau injeksi dylib di iOS/macOS. Intinya kita mengubah program atau lingkungan program agar library Frida diload sebelum program berjalan.
  • Injeksi program yang sudah berjalan menggunakan ptrace atau API sejenis. Injeksi bisa dilakukan secara langsung atau menggunakan frida-server.

Injeksi ke proses menggunakan API ptrace hanya bisa dilakukan jika kita memiliki permission untuk melakukan debugging pada proses tersebut (di iOS kita butuh jailbreak jika ingin memakai cara ini). Program frida-server berguna jika kita ingin mengakses API dari device lain, misalnya di Android yang sudah di-root, kita bisa memakai frida-server untuk melakukan injeksi dan sekaligus menjadi jembatan agar API-nya bisa diakses dari PC.

Saya tidak akan membicarakan dengan detail bagaimana melakukan berbagai langkah di atas, karena tiap OS butuh penjelasan yang detail. Contoh di iOS (tanpa jailbreak) kita harus mengekstrak IPA (harus unencrypted), mengcopy library, mengedit load command di binary utama, menandatangani file IPA. Masing-masing langkah butuh penjelasan yang tidak singkat. Intinya adalah: kita harus bisa membuat Frida berjalan di aplikasi target.

Setelah bisa berjalan di address space target, Frida akan menulis ulang implementasi assembly fungsi yang kita intercept supaya melakukan jump ke library frida yang sudah ada di address space proses tersebut. Di sini ada magic yang dilakukan Frida: frida akan melakukan tracing statik untuk mengetahui di mana saja titik keluar fungsi dan membuat hook juga di situ untuk onLeave.

Frida kemudian akan bisa memanggil kode Javascript yang kita tulis. Ada dua opsi engine Javascript yang bisa dipakai: V8 dan Duktape, secara umum V8 lebih cepat, tapi butuh lebih banyak memori, dan duktape sebaliknya: lebih lambat tapi hemat memori. Ketika melakukan detach, frida akan mengembalikan kode yang diubah kembali seperti semula.

Modul Frida

Jika melihat halaman release frida, akan ada banyak sekali file yang bisa didownload. Ini mungkin akan sangat membingungkan buat pemula, jadi akan saya jelaskan secara singkat berbagai file yang bisa didownload di situ.

Frida tertarget sangat spesifik untuk sistem operasi tertentu, jadi ada banyak rilis Berdasarkan sistem operasi (android, ios, windows, dsb). Frida juga perlu dicompile spesifik untuk arsitektur CPU tertentu, jadi ada banyak arsitektur CPU: x86-64, arm, arm64, dsb. Jadi pertama kita bisa menyaring untuk OS dan CPU mana yang ingin kita pakai.

Frida dipisahkan menjadi banyak modul:

  • Kita bisa menginjeksikan kode langsung dengan memanggil API Frida dalam C. Jika ingin melakukan ini downloadlah frida-core-devkit
  • Jika kita ingin memakai frida di aplikasi yang ada source codenya, kita bisa mendownload frida-gum-devkit atau frida-gumjs-devkit
  • Jika kita ingin menginjeksi satu proses saja di iOS/Android, kita bisa memakai frida-inject
  • Jika kita ingin menginjeksi berbagai proses mengaksesnya dari device lain (misalnya injeksi Android/iOS dan akses API-nya dari PC) kita bisa memakai frida-server
  • Jika kita ingin manual memasukkan library dengan LD_LIBRARY_PATH atau dylib injection, kita bisa memakai frida-gadget

Selain kode di atas, ada beberapa API bindings untuk berbagai bahasa: Python, nodejs, Java, QML (Qt), Swift, dan .NET. Untuk pemula: sebaiknya gunakan Python saja, ada banyak contohnya, sedangkan untuk bahasa lain masih minim.

Secara praktis, berikut ini yang perlu dilakukan untuk pemula:

  • Di desktop: “pip install frida frida-tools” ini sudah cukup untuk debugging aplikasi lokal di desktop
  • Di Android: sebaiknya root HP Anda, lalu gunakan frida-server
  • Di iOS (karena Jailbreak semakin sulit): gunakan frida-gadget

Penutup

Sudah ada banyak sekali contoh penggunaan Frida di berbagai situs lain, misalnya untuk: disable certificate pinning, mendapatkan key enkripsi, bypass jailbreak check, dsb. Jadi silahkan dicari sendiri sesuai kebutuhan. Di Artikel lain saya akan membahas beberapa trik yang saya pelajari setelah cukup lama memakai Frida.

Menurut saya Frida merupakan tools yang sangat powerful yang bisa membantu banyak task reverse engineering. Tahun lalu saya banyak menyelesaikan Flare-On dengan Frida. Bahkan saya juga memakai Frida ini untuk debugging secara umum di aplikasi saya yang ditulis dalam C/C++.

Meskipun demikian Frida juga memiliki berbagai masalah: dokumentasi Frida cukup terbatas dan sering kali saya harus membaca source codenya untuk memahami berbagai hal. Selain itu Frida juga masih terus diupdate, sering kali versi baru membawa banyak fitur baru, tapi seringkali juga membuat error baru. Tadinya saya ingin membuat contoh yang lebih sederhana, tapi terkena error ini (saat artikel ini ditulis: belum ada solusinya).

Saran saya: cobalah memakai Frida. Tools ini masih terus dikembangkan secara aktif. Frida juga cross platform, jadi toolsnya akan terpakai di banyak tempat tidak seperti tools spesifik OS tertentu (misalnya WinDBG yang hanya untuk Windows).

Pinjaman Online Ilegal dan Data Anda

Beberapa waktu yang lalu sempat ada berita tentang pinjaman online (ilegal) yang servernya terbuka dan ternyata di dalamnya ada banyak data lain, termasuk data dari provider seperti Telkomsel, XL, Go-Jek dsb. Saya tidak akan membahas mengenai kasus ini secara spesifik karena informasinya sudah diserahkan ke kominfo dan OJK via Xynexis dan saat ini sedang diproses.

Saya hanya ingin membahas: dari mana pinjaman online ini mendapatkan berbagai data pribadi. Data yang saya maksud contohnya data telkomsel ( berapa sisa saldo, kapan terakhir kali mengisi), gojek ( data perjalanan yang pernah dilakukan), dan berbagai layanan lain.

Jawabannya sangat sederhana: dari user itu sendiri secara sukarela. Loh kok ada yang mau memberikan data secara sukarela? karena ada rewardnya. Dalam kasus pinjaman online: jika user bersedia login ke layanan tertentu, maka limit pinjamannya akan dinaikkan.

Perlu diketahui ada beberapa perusahaan (setahu saya semuanya dari China) yang menyediakan SDK (software development kit) untuk memudahkan mendapatkan data dari user Jadi sebuah perusahaan pinjaman tidak perlu repot-repot mempelajari bagaimana protokol Go-jek atau Telkomsel, cukup install SDK tersebut maka aplikasi bisa menerima data dari pengguna.

Contoh penggunaan SDK

Sumber data yang bisa diminta sangat banyak, ini contohnya dari satu perusahaan saja bisa menyediakan ini semua. Masih ada juga beberapa perusahaan yang menyediakan sumber data lain, misalnya BPJS.

Tentunya pihak ketiga tersebut juga bisa menyimpan data untuk tiap orang yang datanya diambil. Jadi jangan kaget kalau data yang tidak pernah diinput di satu aplikasi bisa didapatkan oleh aplikasi lain.

Dengan data ekstra ini para pemberi pinjaman online akan bisa melakukan banyak hal, misalnya:

  • melakukan profiling apakah seseorang punya risiko tinggi untuk kabur
  • mengetahui semua alamat pengiriman belanja online
  • memberi tahu debt collector untuk menunggu Anda di tempat yang biasa Anda datangi dengan Gojek

Penutup

Saya menyarankan: jangan pakai jasa peminjaman online. Alasan utamanya: bunganya sangat tinggi. Untuk yang ilegal, ada banyak masalah:

  • Mereka kadang menggunakan cara kasar untuk penagihan
  • Data pribadi Anda bisa bocor ke mana-mana (dengan sengaja oleh mereka)
  • Mereka tidak menginvestasikan uang untuk keamanan server, jadi data Anda bisa tersebar ke mana-mana karena server mereka dijebol orang lain (atau bahkan kadang terbuka di Internet)
  • Anda juga membocorkan data orang lain (data orang-orang di phonebook Anda)

Kalau bisa sih, jangan miskin supaya tidak butuh pinjaman, tapi tentunya ini sulit.

Sumber dari Video: Lessons from the longest study on human development | Helen Pearson

Biaya Reverse Engineering

Saya pernah menuliskan mengenai mahalnya membuat aplikasi mobile. Saya juga pernah menulis mengenai ransomware dan RE dan betapa sulitnya hal tersebut. Tapi sepertinya banyak yang belum paham bahwa RE juga mahal (untuk yang tidak tahu apa itu RE, silakan baca FAQ berbahasa Indonesia di sini). Ini untuk menjawab berbagai pertanyaan orang yang ini minta bantuan untuk: Reverse engineering game, reverse engineering malware/ransomware, cracking software tertentu, dan segala macam bantuan yang berhubungan dengan reverse engineering.

Jumlah orang yang bisa melakukan reverse engineering di dunia ini tidak banyak. Sesuai hukum supply dan demand: karena yang bisa melakukan RE relatif sedikit maka harga jasanya jadi mahal. Reverse engineering juga butuh waktu cukup lama. Jangan bayangkan RE ini sekedar membuka IDA Pro atau tool sejenis dan langsung bisa menemukan di mana harus patch sesuatu atau menemukan algoritma tertentu.

Coba minta seorang programmer membaca kode program di github dan minta dia memodifikasi sesuatu. Berapa banyak yang langsung bisa memahami isi sebuah program yang lumayan kompleks? Banyak programmer bahkan sudah menyerah duluan karena tidak bisa mengcompile programnya. Reverse engineering kode biner akan butuh waktu jauh lebih lama dari membaca source code yang lengkap ada komentar dan dokumentasinya.

Harga jasa RE juga akan lebih mahal jika program memiliki proteksi kompleks. Jika harga sebuah software hanya puluhan hingga ratusan USD: masih lebih murah membeli software tersebut daripada membayar orang untuk mengcracknya.

Dalam kasus malware dan ransomware : jarang sekali malware yang tidak diproteksi, jadi proses reversingnya tidak sebentar. Belum lagi ada banyak sekali varian ransomware yang masing-masing versinya sudah berbeda sama sekali. FireEye dulu menyediakan jasa decrypt ransomware, tapi kemudian terlalu banyak varian yang ada, jadi mereka sudah tidak mau lagi menghabiskan sumber daya untuk ini:

If your computer has recently been infected with ransomware, chances are that the infection has been caused by one of the many copycat attacks that use the same or similar name and method of operation. Since these new ransomware variants use different encryption keys, we have discontinued the DecryptCryptoLocker website and its associated decryption service.

https://www.fireeye.com/blog/executive-perspective/2014/08/your-locker-of-information-for-cryptolocker-decryption.html

Saat ini saya tidak tertarik untuk mereverse engineer ransomware, apalagi jika diminta tolong secara gratis. Analisis malware butuh waktu minimal beberapa jam dan bisa sampai berhari-hari. Meskipun jika sedang tidak ada proyek lain, saya lebih senang menghabiskan waktu ini bersama keluarga. Saya sudah menulis lebih banyak mengenai ransomware di posting ini.

Orang yang ahli dan terbukti bisa melakukan RE biasanya sudah punya pekerjaan. Ada banyak jalan untuk menghasilkan uang dari skill RE, baik jalan legal, ilegal, atau yang di tengah-tengah. Orang-orang yang sudah mendapatkan banyak uang dari aktivitas-aktivitas tersebut biasanya akan malas menerima pekerjaan baru.

Melakukan RE pada aplikasi tertentu secara rutin biasanya akan lebih mudah. Kode program biasanya tidak berubah drastis dari satu versi ke berikut, jadi jangan heran juga jika seseorang lebih memilih melakukan pekerjaan RE yang rutin daripada menerima proyek yang sesekali datang.

Pekerjaan RE Legal

Pekerjaan RE legal biasanya di bidang software security (walau tidak selalu). Ada beberapa pekerjaan yang berhubungan dengan RE:

  • Reversing malware. Kerjanya membongkar berbagai malware/virus baru tiap hari
  • Mencari bug di software dan membuat exploit untuk software tersebut
  • Mencari bug di hardware dan membuat eksploit untuk hardware tersebut
  • Memberikan training. Banyak perusahaan mulai memperhatikan masalah security, jadi para engineer diharapkan bisa membongkar sendiri hasil kerja mereka apakah aman atau tidak
  • Pentesting aplikasi (baik resmi ataupun untuk bug bounty)
  • Rekonstruksi program berdasarkan program lama yang source codenya hilang

Saat ini kebanyakan pekerjaan legal seperti ini didapatkan dari luar Indonesia karena belum terlalu banyak riset security tingkat lanjut di Indonesia. Negara paling dekat yang membutuhkan banyak reverse engineer adalah Singapura.

Ada juga jalan legal unik yang dilakukan oleh Jane Wong. Dia melakukan RE berbagai aplikasi mobile untuk mengetahui fitur apa yang belum dirilis. Dalam artikel tersebut dituliskan bahwa dia menghabiskan 18 jam sehari untuk melakukan reverse engineering berbagai aplikasi.

Dengan jalan legal, gaji yang didapatkan bisa cukup banyak. Semakin tinggi skillnya, makin besar yang bisa didapatkan. Gaji terendah sudah setara dengan gaji programmer level menengah. Untuk kasus yang sangat ekstreem: jika sudah sangat jago RE, maka bisa menemukan dan membuat eksploit zero day yang harga per eksploitnya puluhan ribu hingga ratusan ribu USD. Bahkan exploit untuk iOS bisa dihargai hingga 1 juta USD.

Pekerjaan RE ilegal

Bagaimana dengan yang ilegal? Ada banyak hal ilegal yang bisa dilakukan, misalnya:

  • Cracking aplikasi (menghilangkan proteksi tertentu)
  • Hacking game (modifikasi game)
  • Hacking aplikasi (mengubah/menambah fungsionalitas tertentu, misalnya aplikasi Go-Jek)

Apakah bisnis ilegal ini menghasilkan uang banyak? jawabannya: iya, banyak sekali. Baru-baru ini Niantic (pembuat Pokemon Go) menuntut group Hacker yang membuat mod IPA game Pokemon Go dan Wizards Unite. Dalam tuntutannya disebutkan bahwa para hacker ini menggunakan Patreon di mana para pengguna bisa membayar biaya bulanan untuk mendapatkan modnya. Para pengguna harus membayar minimum 5 USD, dan jumlah total pengguna sudah lebih dari 10 ribu orang. Artinya mereka mendapatkan minimum 50 ribu USD per bulan.

Pokemon Go bukan satu-satunya game yang dicurangi hacker, masih ada banyak contoh game yang lain, hanya saja yang lain lebih susah dilacak karena memakai cryptocoin dan memakai group yang tertutup. Biasanya proses mencurangi game bukan sekedar membaca kode, tapi juga menulis kode baru. Contoh game lain juga masih banyak, misalnya ada hacker yang didenda 5.1 juta dollar karena hacking PUBG dan mencuri informasi user. Bahkan tanpa RE pun, cheating di berbagai game ini imbalannya sangat menjanjikan, misalnya ada contoh kisah bagaimana seorang remaja 16 tahun mendapatkan 200 ribu USD dari hacking game.

Di dalam negeri Indonesia ada juga mereka yang memodifikasi APK Gojek dan Grab (contoh berita: Grab rugi 6 milyar dari order fiktif). Saya tidak tahu berapa jumlah pengguna yang memakai APK yang dimodifikasi ini, tapi dari pengamatan saya di berbagai forum internet, jumlahnya setidaknya ribuan orang. Saat ini ada lebih dari 2 juta driver Go-jek, jadi mungkin perkiraan saya itu terlalu rendah, mungkin ada puluhan ribu orang yang memakai APK yang dimodifikasi. Uang bulanan untuk mendapatkan APK antara puluhan sampai ratusan ribu rupiah. Jadi para hacker ini mendapatkan setidaknya puluhan juta rupiah per bulan.

Di Singapore, Aplikasi Grab dan GO-JEK juga dihack dengan tarif 200-350 SGD/bulan. Andaikan bagian RE mendapatkan 10% saja (20-35 USD per driver), dari 100 driver bisa didapatkan 2000-3500 SGD (20-35 juta rupiah per bulan). Angka tersebut merupakan perkiraan yang sangat rendah, baik dari share untuk RE (bisa 25% atau lebih), maupun jumlah usernya (bisa ribuan).

Dengan banyaknya kesempatan mendapatkan uang dari RE ilegal, jangan heran jika tidak banyak yang mau mengcrack software untuk Anda (meskipun Anda berani membayar). Kemungkinan sudah ada pekerjaan ilegal lain yang hasilnya lebih besar dan lebih teratur.

Pekerjaan RE abu-abu

Lalu bagaimana dengan yang abu-abu? contohnya adalah reverse engineering aplikasi untuk mendapatkan API-nya, reverse engineering hardware untuk membuat clonenya atau membuat aksesori tambahan. Di beberapa negara ini ilegal, di tempat lain bisa dianggap legal karena bertujuan untuk interoperabilitas.

Contoh hal lain yang abu-abu adalah membongkar skrip trading untuk mengetahui strategi apa yang dipakai seseorang. Selama strateginya tidak dicopy dan disebarkan umum, ini sulit dituntut karena tujuannya hanya untuk mempelajari sesuatu.

Penutup

Seperti saran saya di tulisan mengenai aplikasi mobile: jika Anda merasa memakai jasa orang lain terlalu mahal, cobalah belajar sendiri RE. Sering kali orang merasa sesuatu terlalu mahal, tapi tidak mau juga belajar sendiri.

Saya sendiri jarang sekali menerima pekerjaan RE ekstra dari yang sudah saya lakukan sehari-hari. Jika ditanya siapa kenalan yang bisa melakukan RE, saya juga sering bingung karena mereka masing-masing juga sudah penuh dengan pekerjaan legal/ilegal/abu-abu.