Cheat dan Anti-Cheat pada Video Game

Salah satu tujuan banyak orang melakukan Reverse Engineering adalah mencurangi (cheating) game. Sudah banyak orang menanyakan ini ke saya, jadi akan saya bahas sekarang ini.

Cheat by Nick Youngson CC BY-SA 3.0 Alpha Stock Images
Cheat by Nick Youngson CC BY-SA 3.0 Alpha Stock Images

Tapi supaya tidak kecewa, saya tekankan dulu: cheating game modern dan populer saat ini (misalnya pubg) sangat sulit. Teknologi anti cheat selalu diupdate, dan tidak ada satu artikel di internet yang bisa membuat Anda bisa mencurangi game terbaru.

Sebagai catatan: banyak video sampah di Youtube yang mengajari cara cheat game padahal yang dijelaskan di situ tidak masuk akal sama sekali.

Cheating Game Jaman Dulu vs Sekarang

Mungkin Anda membaca beberapa artikel lama tentang cheating game dan berpikir cheating itu mudah. Sebelum membahas berbagai teknik cheat dan anti-cheat, saya tuliskan dulu tentang cheating jaman dulu dan sekarang.

Jaman dulu, terutama masa sebelum internet, cheating game relatif mudah. Berbagai perkembangan teknologi (termasuk juga kecepatan CPU, ketersediaan multi core) membuat cheating game makin sulit dilakukan.

Versi Game

Pertama adalah masalah update. Dulu Versi game tidak berubah sejak dirilis karena distribusinya sulit menggunakan CD-ROM/DVD, jadi jika ada game versi 1.0, kemungkinan tidak akan berubah sampe bertahun-tahun kemudian. Di masa awal internet, game juga masih didistribusikan via CD/DVD walau sudah bisa dimainkan online.

Dulu jika ada yang menemukan atau membuat cheat tertentu, maka pembuat game tidak bisa mengupdate kodenya. Sekarang: dalam hitungan hari sudah ada update di play store/app store/steam/dsb. Tentunya masih banyak game sederhana/tidak populer yang dibiarkan saja oleh pembuatnya..

Tulisan/Artikel tentang cheating

Dulu banyak orang dengan sukarela menuliskan ilmu tentang cheat yang dikembangkan, ini tidak apa-apa karena meskipun pembuat game membaca artikelnya, tidak ada yang bisa dilakukan sampai versi berikutnya beberapa tahun lagi atau beberapa bulan lagi.

Sekarang ini jika seseorang menemukan cheat game, mereka akan menyembunyikan atau tidak men-share tekniknya. Kalau dishare, maka pembuat game akan membaca artilel tersebut dan segera mengubah kodenya.

Resource Anti Cheat

Dulu teknik anti cheat dilakukan oleh pembuat game yang teamnya kecil. Mereka ini sering kali adalah programmer game yang bagus, tapi kurang mengerti teknologi cheating. Sekarang ini untuk game besar, sering ada team khusus yang melakukan development anti cheat.

Pekerjaan membuat anti cheat di berbagai perusahaan game yang besar gajinya mencapai puluhan/ratusan ribu USD/tahun (atau dalam rupiah 1-5 milyar/tahun). Game-game ini menghasilkan jutaan USD per bulan. Jadi mereka yang sudah dibayar mahal ini tidak tinggal diam melihat para cheater yang berpotensi mengurangi pendapatan mereka.

Sebagai pembanding: para pembuat cheat kebanyakan sukarela, karena ingin sekedar menang dalam game. Jika levelnya sudah terlalu sulit, mereka akan menyerah. Tapi ada juga group-group yang menjual cheat, motivasi mereka lebih besar dan tentunya mereka tidak mau sharing ilmu karena akan mengurangi pendapatan mereka.

Selain menyewa orang secara khusus, ada juga beberapa perusahaan yang mengembangkan teknologi anti cheat untuk dipakai oleh berbagai game lain. Contohnya adalah BattleEye. Mereka bahkan punya lowongan spesifik: membuat teknologi anti cheat.

Sebenarnya bukan cuma game yang butuh anti cheat. Contoh aplikasi non game yang sering dicurangi orang adalah Snapchat. Biasanya fitur yang diinginkan adalah bisa menyimpan/screencapture foto tanpa ketahuan. Snapchat bahkan sampai mengakuisisi sebuah perusahaan untuk meningkatkan keamanannya.

Kompleksitas Anti-Cheat

Ketika resource CPU masih sangat rendah, game harus sangat dioptimasi, jadi biasanya anti cheat hanya dijalankan sekali saja ketika game dimulai atau ketika pergantian level.

Sekarang ini dengan CPU multi core yang bahkan sudah ada di HP Android low end, bisa ada thread khusus yang melakukan pengecekan berkala. Jika satu pengecekan berhasil dibypass di awal, masih ada pengecekan lain yang dijalankan secara periodik.

Contoh aneka jenis teknik cheating

Jenis cheating untuk berbagai game beraneka ragam, tergantung jenis gamenya. Kadang-kadang cara cheating di satu game tidak berlaku sama sekali di game lain.

Untuk game jenis fighting, misalnya bisa dibuat aimbot yang otomatis mengarahkan (aim) senjata ke target, atau untuk melihat pemain lain meski terhalang dinding. Untuk game jenis puzzle bisa dibuat solver otomatis yang memberi tahu solusi gamenya.

Jadi tidak ada satu jenis cheat, dan teknik anti cheat untuk berbagai jenis cheat juga berbeda-beda. Di sini saya akan bahas contoh saja beberapa jenis cheating yang umum.

Memory/File Editing

Jaman dulu cheating game single player hanya sekedar mengubah jumlah koin di memori atau di file (untuk game yang ada savefile-nya), atau mengaktifkan sesuatu fitur yang seharusnya tidak aktif. Ini sangat mudah dilakukan dengan berbagai tool yang melakukan scanning memori, mencari value, lalu mengganti value tersebut.

Sekarang ini sebagian besar nilai sudah disimpan di server. Jadi meskipun kita mengganti nilai koin di game lokal, ketika gamenya dimulai (atau ketika akan membeli item) game akan meload lagi nilainya dari server via internet dan akan diverifikasi pembeliannya di internet.

Sebagian nilai kadang masih bisa disimpan lokal, misalnya beberapa game ada fitur agar profile kita memakai kostum tokoh tertentu dan pengecekan fitur ini dilakukan lokal/offline.

Logika cheat ini sangat sederhana: misalnya di layar tertampil koin kita 120500, kita search nilai 120500 di memori. Kemungkinan ada beberapa memori yang memiliki nilai itu, berikutnya: kita belanjakan uangnya, misalnya jadi 110000. Lalu kita search lagi nilai 110000 itu, hasilnya: akan ada daftar memori yang berkurang nilainya. Kalau masih ada kandidat lain, kita coba belanjakan koin lagi atau beli koin lagi, sampai ketemu: di memori ini tersimpan nilai koinnya.

Cheating jenis ini levelnya sangat mudah, berlaku untuk banyak game sederhana yang kurang populer. Tool yang dibutuhkan juga banyak tersedia di internet (misalnya Game Guardian untuk Android). Untuk mengedit savefile kadang hanya butuh hex editor saja. Biasanya tidak dibutuhkan coding untuk cheat jenis ini.

Function Hooking/Library Patching

Cheat level berikutnya butuh coding. Fungsi-fungsi tertentu bisa diganti implementasinya dengan milik kita sendiri. Contoh sederhana: jika ada fungsi bernama “isVisible()” yang gunanya untuk mengecek apakah sebuah objek terlihat atau tidak bisa diganti dengan fungsi yang selalu mengembalikan “true”.

Ada banyak library untuk function hooking, tergantung platform/sistem operasi yang dipakai. Contoh: di iOS ada fishhook (untuk hooking fungsi library), substrate (hooking fungsi sembarang). Di Android bisa memakai library Frida (butuh root). Di Windows ada banyak teknik hooking yang bisa dicari sendiri.

Contoh hooking yang lain adalah melakukan intercept terhadap paket jaringan. Sebelum data dikirim ke server, data bisa diubah (misalnya yang tadinya “miss” jadi “hit”). Sebaliknya: data dari server yang tidak ditampilkan oleh game, bisa ditampilkan ke user.

Di level ini cheating sudah butuh coding. Coding biasanya perlu dilakukan di level native code (biasanya C) tapi kadang sampai harus level assembly. Ini semua tergantung proteksi gamenya dan dalam bahasa apa game itu ditulis..

Banyak tutorial cheat di Youtube yang cuma sampah. Mereka memperlihatkan mengedit file .so dengan hex editor saja. Seringkali nilai yang diberikan ngawur, dan jelas tidak akan jalan di versi lain file .so tersebut. File .so isinya adalah kode mesin, untuk memahaminya diperlukan disassembler/decompiler.

Bentuknya apa function hooking ini? bisa berupa aplikasi baru yang melakukan injeksi ke aplikasi asli atau bisa berupa library (dll di Windows, .so di Linux/Android .dylib di OSX/iOS). Library ini bisa berupa library baru, atau hasil patch dari library lama.

Bot

Bentuk cheat lain yang umum adalah bot. Artinya: bukan manusia yang main gamenya, tapi program lain. Jenis bot ini bisa banyak: ada yang full bisa memainkan game dari awal, atau ada yang dipakai untuk melakukan aksi tertentu saja (mengumpulkan koin, dsb).

Bot ada yang bisa dijalankan di device, ada yang bisa dijalankan di PC. Bot ada yang butuh aplikasi gamenya, dan ada juga bahkan yang hanya berupa skrip yang langsung melakukan request ke server.

In App Purchase (IAP) Hack

Untuk game di mana pemain bisa membeli koin dengan in app purchase, maka ini bisa dicurangi untuk game yang tidak mengecek di sisi server. Semua game besar/populer punya server untuk mengecek receipt dari app store dan biasanya tidak bisa dicurangi.

Flow pembelian adalah: aplikasi meminta app store untuk meminta uang dari user. Setelah selesai, app store akan memberi tahu aplikasi bahwa pembelian selesai, dan ini tanda terima (receiptnya). Aplikasi kemudian bisa mengecek ke server app store untuk memeriksa apakah receiptnya valid. Nah masalahnya: jika aplikasi meminta langsung ke app store, fungsi ini bisa dihook dan hasilnya: “ok ini receiptnya valid”.

Anti Cheating

Setelah memberi contoh teknik cheating, saya akan menjelaskan “anti cheating” yang umum dilakukan. Saya akan mengambil contoh dari teknik cheating di atas.

Anti Memory/File Editing

Supaya savefile tidak dimodifikasi, filenya bisa dihash dengan digital signature. Jika signature tidak valid, maka game tidak mau meload savefile-nya. Jadi jika file diedit dengan hex editor, hasilnya: game tidak mau meload filenya karena signaturenya tidak valid lagi.

Bagaimana dengan nilai di memori? misalnya kita ingin menyimpan nilai score, bisa saja scorenya disamarkan, misalnya dengan minus N. Jadi jika nilai koin saat ini 100000, dengan N = 12000, maka tersimpan di memori: 88000. Ketika akan ditampilkan di layar, nilai N-nya ditambah dulu dengan 12000. Teknik anti cheating ini terlalu sederhana, dan beberapa engine cheating bisa mendeteksi seperti ini. Tentunya kita bisa juga menggunakan enkripsi yang lebih rumit seperti AES.

Sebagai programmer, tentunya banyak kreativitas yang bisa dilakukan untuk menyembunyikan nilai koin ini. Misalnya bisa saja nilainya disimpan di 10 tempat, masing-masing ditambah/dikurangi dengan nilai berbeda. Tiap kali gamenya dijalankan bisa juga dibuat nilai random untuk mengecoh fitur “value finder” dari sebuah cheat engine.

Cara paling efektif adalah: nilai koin disimpan di server, dan segala pembelian item diproses oleh server, sehingga cheat jenis ini tidak bisa dilakukan.

Anti Function Hooking/Library Patching

Jika sudah belajar teknik malware tingkat lanjut, kita akan tahu bahwa mengganti fungsi akan meninggalkan jejak. Cara termudah mengecek ini adalah: dengan melakukan checksum binary di memori, lalu nilainya dikirimkan ke server. Server bisa mengecek apakah nilai sesuai seharusnya.

Cara lain adalah dengan mengecek header tiap fungsi, apakah ada tanda-tanda bahwa fungsi tersebut sudah di-hook/intercept. Ketika melakukan patching kode, berbagai library akan mengubah header fungsi dengan instruksi assembly untuk “jump”. Jika ini terdeteksi, maka berarti fungsi sudah diubah.

Anti Bot

Ketika diluncurkan, banyak sekali orang yang membuat bot Pokemon Go. Versi pertama aplikasi ini proteksinya kurang bagus, jadi seseorang bisa mempelajari dengan mudah. Versi-versi berikutnya menjadi sangat sulit dan sekarang tidak ada lagi library yang bisa dipakai untuk melakukan koneksi ke server Pokemon Go.

Teknik anti bot yang mereka pakai adalah gabungan dari banyak hal. Mereka membuat koneksi yang dihash secara custom, versi pertama masih bisa dibongkar. Berikutnya mereka membuat versi berikutnya yang terenkripsi. Selain itu mereka mendeteksi berbagai macam perilaku (behavior) bot yang tidak masuk akal atau tidak konsisten. Ini digabung dengan berbagai cara untuk mendeteksi function hooking/library patching.

Anti IAP Hack

Jika sebuah aplikasi/game cukup sukses, developer bisa memiliki server yang bisa mengecek receipt In App Purchase dengan melakukan koneksi ke server. Jadi ketika seseorang membeli koin:

  • Transaksi dilakukan di device
  • Aplikasi mengirimkan receipt ke server pembuat aplikasi
  • Server pembuat aplikasi akan melakukan validasi ke server apple/google (koneksi langsung tidak bisa diintercept)
  • Status koin/fitur di server pembuat aplikasi akan diupdate jika valid
  • Aplikasi mendapatkan informasi dari server
  • Ketika akan menggunakan koin untuk membeli item, server memakai informasi yang ada di server, jadi tidak bisa diubah oleh aplikasi

Kadang masih ada kebocoran, terutama jika ada metode lain seseorang bisa mendapatkan koin misalnya jika pengguna aplikasi bisa mendapatkan koin/reward dari menonton iklan.

Anti-anti Cheating

Apakah para cheater segera menyerah dengan adanya berbagai teknologi anti cheat? Tentunya tidak. Tapi di level ini sudah dibutuhkan pemahaman kode yang dalam.

Anti-anti memory patching/editing

Jika sebuah nilai hanya disamarkan di memori, maka dengan melakukan reverse engineering (membaca disassembly dan hasil dekompilasi) bisa ditemukan nilai apa yang dikurangi/ditambah. Jika sudah tahu perubahannya, maka teknik pertama kembali bisa dilakukan, cukup dengan menambah/mengurangi/melakukan decrypt terhadap nilai di memori.

Jika aplikasi mendapatkan nilai dari server, mungkin nilainya bisa diintercept dengan function hooking agar bisa diubah sebelum sampai ke aplikasi.

Jika memang aplikasi butuh nilai di memori dan terlalu lambat untuk meminta nilainya dari server, apakah pembuat aplikasi akan menyerah di level ini? pembuat aplikasi bisa mengubah metodenya tiap rilis baru gamenya. Cheat yang berjalan di versi 1.0, tidak akan jalan lagi di versi minggu depan.

Anti-anti function patching

Dalam kasus anti function patching: ada kode yang memeriksa apakah fungsi ini diubah atau tidak. Kode pemeriksa ini bisa dipatch agar hasilnya selalu mengembalikan OK. Tentunya mencari kode pemeriksa ini juga tidak mudah, butuh reverse engineering lagi.

Lalu apa respond pembuat game? sekarang sebagian game memiliki kode (X) yang akan mengecek apakah ada patching. Lalu ada kode (Y) yang memeriksa apakah fungsi pengecek (X) tersebut tidak dipatch. Contoh lain: ada game yang memiliki dua fungsi yang saling mengecek satu sama lain.

Apakah para pembuat cheat menyerah? tidak juga, banyak teknik yang bisa dipakai misalnya emulasi kode menggunakan emulator tertentu (misalnya Unicorn Engine atau Qemu), merelokasi kode (misalnya dengan Gum Relocator bagian dari Frida) dan mempatch kode aslinya.

Anti-Anti IAP

Khusus untuk In App Purchase, di sini cheater memiliki keterbatasan. Untuk pengecekan di sisi server, tidak ada lagi yang bisa dilakukan, kecuali ada yang nekat menghack servernya.

Untuk game yang punya fitur voucher/kode: sering kali hacker membeli voucher dengan kartu kredit curian, lalu menjual vouchernya. Di dalam kasus lain, kadang server penjual voucher yang dihack untuk mendapatkan kode voucher gratis.

Anti Reverse Engineering

Berbagai teknik anti cheat bisa dipelajari jika kita bisa membaca kodenya. Untuk mempersulit, kebanyakan game memakai teknik Anti-RE. Biasanya yang paling dasar adalah obfuscation.

Obfuscation adalah teknik untuk membuat kode lebih sulit dibaca oleh manusia, dan tetap bisa dieksekusi langsung oleh mesin. Jangan kaget misalnya ketika melakukan reverse engineering berbagai aplikasi, bahkan IDA Pro bisa diakali agar tidak mengenali function boundary (mana awal/akhir fungsi). Decompiler juga bisa menghasilkan kode yang membuat kita pusing.

Untuk native code, standar yang dipakai saat ini adalah LLVM Obfuscator. Versi lama bisa ditangani dengan plugin khusus IDA Pro. Tapi banyak perusahaan memiliki varian khusus dari obfuscator ini sehingga tools deobfuscator sederhana tidak bisa digunakan.

Selain itu teknik RE yang lain adalah anti debugging. Dengan ini kode program tidak bisa dengan mudah dijalankan dalam debugger.

Anti-anti-anti …

Untuk setiap teknik cheat yang diciptakan, akan ada teknik anti-cheat. Dan untuk tiap teknik anti-cheat, akan ada teknik anti-anti-cheat, sampai batas tertentu.

Pembuat game bisa membuat anti cheat yang sangat hebat dan rumit, tapi jika terlalu rumit dan membuat gamenya terlalu lambat dimainkan atau butuh spec terlalu tinggi, atau membuat HP menjadi sangat panas, maka pemain akan berhenti bermain. Jadi pembuat game punya batasan pemeriksaan yang bisa dilakukan.

Tiap platform punya batasan masing-masing sehingga tidak semua teknik anti cheat bisa dipakai. Misalnya aplikasi iOS yang masuk ke app store tidak mungkin memiliki self modifying code seperti di Android

Sementara biasanya batasan pembuat cheat adalah kesabaran. Jika pembuat game mengubah anti cheatnya tiap bulan, lama-lama mereka akan lelah. Ingat: pembuat anti cheat dibayar mahal, sedangkan pembuat cheat biasanya pendapatannya tidak seberapa.

Tiap level baru membutuhkan skill baru. Untuk bisa melakukan hacking game modern, minimal perlu pengetahuan reverse engineering yang dalam, plus pengetahuan spesifik untuk platform tertentu (Android/iOS/yang lain).

Selain itu ada banyak teknologi spesifik yang perlu dipelajari, tergantung gamenya. Ada game yang dibuat menggunakan Unity, dan untuk patching gamenya kita perlu mengenai engine Unity. Game dengan Unity gampang diedit jika masih menggunakan mode .NET murni, tapi jadi sulit jika ditranslasikan ke C (dengan il2cpp) dan dilewatkan ke obfuscator. Ada game yang memakai game engine Corona yang memakai Lua jadi perlu mengenal bahasa pemrograman Lua.

Sampai di titik tertentu, ketika sudah paham berbagai hal low level, banyak hacker game yang akhirnya memilih jalan lain. Menjadi programmer atau melakukan pekerjaan security yang pendapatannya lebih besar. Di jangka panjang, menjadi pembuat cheat juga cukup membuat stress karena tiap versi bisa ada proteksi baru yang perlu dipelajari.

Resource

Saya bisa menyarankan resource-resource ini untuk mulai mengenal dunia hacking game:

Atau cari informasi spesifik mengenai teknik yang ingin Anda ketahui. Contohnya teknik anti reversing di Android ada di resource ini. Sebagai catatan: ini baru resource untuk memulai, ketika mulai berusaha cheating, akan ada banyak hal lain yang perlu dipelajari: tentang berbagai format data, tentang enkripsi, dan masih banyak lagi.

Jika ingin yang bentuknya video, sudah ada yang membuat serial belajar game hacking (ketik artikel ini ditulis, levelnya masih sampai level dasar, tidak akan bisa mencurangi game modern dengan yang diajarkan di level ini):

https://guidedhacking.com/threads/squally-cs420-game-hacking-course.14191/

Penutup

Saran saya buat yang ingin hacking game: cobalah dari game yang sederhana. Lebih bagus lagi kalau Anda mencoba membuat game sendiri supaya lebih paham mengenai struktur sebuah game.

Buat Anda yang ingin terjun sampai game yang sulit: silakan saja, tapi jika modalnya hanya ingin mengedit file dengan hex editor saja, Anda tidak akan sampai ke mana-mana. Keahlian Reverse Engineering wajib dikuasai.

Dan jangan tanya saya bagaimana memakai tools IDA Pro, Ghidra, Radare. Berbagai tools tersebut banyak tutorialnya di Internet. Tapi intinya bukan pada toolnya, tapi kemampuan membaca kode. Mengajari memakai microsoft Word bisa dilakukan dengan cepat, tapi mengajari cara membuat Novel yang indah dengan Microsoft Word akan butuh waktu sangat lama. Word di sini hanyalah sekedar tool.

Sebenarnya saya juga tidak keberatan berdiskusi mengenai berbagai teknik cheat/anti-cheat. Tapi kalau level ilmunya masih terlalu jauh, maaf saya nggak sabar, karena harus banyak sekali menjelaskan segala sesuatu. Seringkali yang bertanya:

  • Tidak menyebutkan apa gamenya, untuk platform apa (iOS/Android/PC), padahal tekniknya berbeda untuk berbagai OS
  • tidak pernah memakai IDA pro atau tool sejenis
  • tidak pernah memakai debugger
  • tidak tahu berbagai teknik cheat, hanya ingin tahu bagaimana bypass anti cheat. Padahal setiap bagian anti cheat itu dibuat karena jenis cheat tertentu

Ini seperti anak kelas 2 Sekolah Dasar yang minta dijelaskan matematika untuk pemrograman game 3D, tapi (sesuai kurikulum kelas 2 Sekolah Dasar ):

  • belum bisa mengalikan bilangan besar
  • belum tahu perpangkatan
  • belum tahu notasi matriks
  • belum tahu berbagai konsep geometri (koordinat 3D), fungsi trigonometri (sin, cos, tan), dsb.

Nah jika ada anak SD bertanya seperti itu, apakah Anda mau menjelaskan? apakah bisa punya kesabaran menjelaskan setiap bagian sampai anak SD-nya mengerti? dan andaikan bisa, kira-kira akan butuh berapa lama? bersedia menjelaskan itu semua tanpa dibayar? Atau Anda akan menyuruh anak SD itu untuk belajar dulu dasar-dasarnya?

Jika pertanyaannya sangat spesifik, maka saya bisa memberikan petunjuk, seperti misalnya bagaimana mendeteksi method swizzling di Objective C? (banyak dipakai untuk mencurangi game/aplikasi iOS) dan bagaimana membypass deteksinya?

Jangan juga meminta saya membuat cheat untuk game tertentu. Saya sudah pernah menulis biaya reverse engineering itu mahal. Kalau ingin gratis ya silakan belajar sendiri.

Jawaban di Reddit yang saya temukan ini cukup mewakili jawaban saya terhadap yang ingin bertanya tentang cara reverse engineering anti cheat pada sebuah game. Intinya adalah: “get good”.

Certificate pinning dan unpinning

Certificate pinning adalah suatu cara agar sebuah aplikasi bisa memastikan bahwa koneksi SSL/TLS dilakukan terhadap server yang seharusnya. Topik yang sering ditanyakan ke saya adalah bagaimana membypass SSL pinning agar dapat melakukan pentest terhadap sebuah aplikasi. Di sini saya akan membahas beberapa teknik unpinning, terutama untuk mobile OS (iOS dan Android).

Sebelum masuk ke topik pinning, saya review dulu sedikit mengenai komunikasi sebuah browser/ aplikasi ke sebuah server. Agar lebih singkat: browser dan aplikasi akan saya sebut sebagai aplikasi saja, karena browser juga adalah sebuah aplikasi.

DNS

Ketika kita mengunjungi blog.compactbyte.com, aplikasi akan bertanya: apa alamat IP untuk blog.compactbyte.com? pertanyaan ini ditujukan ke server DNS (domain name system). Dan setelah tahu alamat IP-nya aplikasi bisa melakukan koneksi ke server tersebut.

Dari proses awal ini saja sudah ada dua kemungkinan masalah: pertama adalah server DNS mana yang kita pakai?

Lanjutkan membaca “Certificate pinning dan unpinning”

Membongkar Ransomware

Rasanya tiap beberapa hari ada yang bertanya tentang bagaimana mengatasi ransomware tertentu di berbagai group, terutama di group reverse engineering. Jawaban saya untuk yang terkena ransomware tetap sama: buat backup, restore dari backup, atau jika beruntung mungkin sudah ada yang membuat dekriptornya.

Artikel ini untuk anda yang ingin membongkar ransomware dan ingin membuat dekriptor sendiri. Perlu saya peringatkan bahwa ini tidak mudah, dan seringkali mustahil membuat dekriptornya. Setelah membaca ini semoga Anda paham bahwa: meminta membuat dekriptor khusus untuk ransomware yang kena ke komputer Anda itu seperti minta uang semilyar dari orang di pinggir jalan.

Jumlah ransomware baru tiap hari sangat banyak. Mudah sekali membuat ransomware dari nol, atau memodifikasi dari yang sudah ada (banyak yang bisa dicari di github, saya tidak akan melink langsung). Jadi kemungkinannuya cukup besar Anda terkena ransomware yang belum pernah didengar orang lain atau tidak dibahas di Internet.

Dalam tulisan ini saya akan menggunakan contoh soal dari Flare On 2019, sebuah ransomware bernama Mugatu. Karena Mugatu hanyalah soal CTF, ini sengaja dibuat agar hanya mengenkrip file yang sangat spesifik dan memiliki kelemahan dalam enkripsinya. Ini merupakan contoh yang cukup baik untuk dipelajari karena:

  • Malwarenya memakai teknik anti analisis (seperti malware yang sesungguhnya)
  • Malwarenya tidak berbahaya untuk dianalisis oleh pemula (tidak akan menginfeksi PC lain di jaringan)
  • Memiliki contoh enkripsi yang lemah

Silakan dibaca writeup mugatu dari pembuatanya:

https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/FlareOn6_Challenge10_Solution_Mugatu.pdf

Inti dari membuat dekriptor ransomware adalah:

  • melakukan reverse engineering malware
  • memahami enkripsi dan membuat dekriptor

Sebelum membahas jauh dan memberi harapan palsu. Saya ingin menekankan dulu: tidak semua ransomware bisa dibuat dekriptornya, dan andaikan bisa dibuat dekriptornya, reverse engineering butuh waktu lama.

Tidak semua ransomware bisa dibuat dekriptornya

Kenapa sebuah ransomware bisa tidak ada dekriptornya? apakah tidak ada ahli yang mampu membuat dekriptornya? Ini bukan masalah keahlian, tapi batasan teknis.

Kalau misalnya ketemu ponsel rusak seperti gambar di bawah ini, kemungkinan tidak akan bisa diperbaiki tukang reparasi. Kalaupun bisa, waktu yang dibutuhkan untuk memperbaiki sangat besar, dan nggak sebanding dengan harga ponselnya. Tentunya di kasus seperti ini Anda tidak akan bilang: wah tukang reparasinya nggak jagoan.

Sumber https://www.flickr.com/photos/glenbowman/3511874961

Contoh masalah teknis:

  • Ada ransomware yang entah salah coding atau sengaja merusak file dan tidak bisa dikembalikan lagi (menimpa isi file dengan random)
  • Ada ransomware yang cara enkripsinya tidak memiliki kelemahan. Silakan baca artikel saya mengenai unbreakable encryption.

Kalau Anda benar-benar malas membaca berbagai tulisan dan buku mengenai dasar enkripsi, minimal bacalah artikel saya mengenai unbreakable encryption. Tulisan tersebut sudah saya usahakan sangat sederhana dan harusnya bisa dimengerti oleh orang awam sekalipun, supaya tidak ngeyel bahwa “tiap enkripsi pasti bisa dibongkar”.

Intinya begini: meskipun sudah mendapatkan source code lengkap dan penjelasan lengkap tentang bagaimana ransomwarenya bekerja, tetap saja beberapa ransomware mustahil dibuat dekriptornya (kecuali kita tahu keynya).

Reverse Engineering butuh waktu lama

Jangan kira sebuah ransomware bisa dipahami dan dibuat dekriptornya dalam hitungan jam saja. Mungkin ada ransomware sederhana yang bisa dibongkar dalam hitungan jam, tapi kebanyakan akan butuh beberapa hari sampai beberapa minggu, dan butuh beberapa orang. Saya juga pernah menulis tentang mahalnya biaya reverse engineering.

Jika membongkar ransomware bisa sangat mudah dan selesai dalam 1-2 hari oleh orang yang kemampuannya baru belajar RE, maka perusahaan security dan antivirus akan rame-rame mempekerjaan banyak pemula, dan produknya akan jadi yang paling banyak dicari orang untuk mengembalikan data dari ransomware. Kenyataannya sekarang ini kebanyakan perusahaan antivirus dan security hanya bisa membuat dekriptor untuk beberapa ransomware saja, karena butuh waktu dan keahlian yang tinggi.

Prioritas perusahaan security biasanya adalah pada malware yang populer (menyebar luas), dan biasanya mereka tidak akan menghabiskan banyak waktu untuk ransomware yang kurang populer atau menyebar di wilayah tertentu saja. Jadi jika Anda beruntung, mungkin Anda bisa mendapatkan dekriptor gratis, tapi kemungkinannya makin sedikit dengan banyaknya jumlah ransomware.

Fakta bahwa reverse engineering butuh waktu lama sangat penting, karena kebanyakan orang sudah menyerah duluan setelah beberapa jam atau beberapa hari belum bisa maju. Aplikasi yang tidak memiliki proteksi khusus saja bisa butuh waktu lama, contohnya saya butuh waktu sekitar sebulan untuk mereverse engineer Pokemon Go Plus.

Nah sekarang jika memang sudah sangat berniat, maka langkah berikutnya adalah:

  • Belajar dasar reverse engineering malware
  • Belajar dasar enkripsi

Dasar Reverse Engineering Malware

Topik reverse engineering malware sendiri sangat luas. Sudah ada banyak buku yang membahas ini misalnya:

Saya juga sudah pernah membuat tulisan mengenai pengantar reverse engineering (tapi tidak spesifik malware).

Jangan berharap bisa mengerti dari sekedar membaca jawaban singkat dari bertanya di group chat atau dari menonton satu dua video saja. Reversing malware ini butuh kesabaran dan banyak latihan.

Saran saya ketika memulai: gunakan virtual machine yang tidak terhubung ke jaringan (networking dimatikan). Jangan merasa jagoan ketika baru pertama kali berurusan dengan ransomware, jika Anda membuat kesalahan, semua PC di jaringan bisa terinfeksi (contoh kasus: WannaCry).

Ibaratnya seperti belajar kalkulus, 99.99% orang akan butuh waktu dan latihan selama beberapa semester untuk bisa memahaminya (mungkin ada 0.01% orang super jenius yang bisa belajar kalkulus sendiri dalam beberapa jam atau beberapa hari). Coba bayangkan apakah Anda bisa diminta menjelaskan kalkulus via chatting? mengajari integral dan differensial dasar bisa dilakukan relatif cepat, tapi ketika sudah masuk topik rumit, segala macam trik dasar tidak bisa dipakai lagi.

Sebuah program biasa biasanya tidak terlalu sulit dibongkar/reverse engineer. Tapi sebuah ransomware biasanya tidak mudah dibongkar, ada trik-trik yang mempersulit analisis, atau membuat analisisnya jadi salah. Di contoh CTF Mugatu ada trik supaya IAT (import address table) jadi kacau jika langsung dibuka dengan disassembler/decompiler.

The first-stage malware shouldn’t seem too difficult when looking at it in a disassembler. However, something should start to feel amiss after you’ve looked at the API calls and how they are used. While some seem legitimate, others seem completely wrong.
The malware uses a trick I designed that involves running code before WinMainCRTStartup.


This function is responsible for the C-runtime initialization. Most disassemblers will skip this
function and start in WinMain, which corresponds to the main function for the code you programmed. . By skipping WinMainCRTStartup, you may miss my insidious trick.

Writeup Mugatu

Jadi kalau baru sekedar bisa membongkar aplikasi dengan Ghidra atau IDA Pro, ketika membongkar Mugatu akan langsung bingung karena API call-nya kok semuanya salah. Perlu dicatat bahwa ini hanya satu obfuscation sederhana, masih ada puluhan teknik lain misalnya:

  • String encryption
  • Anti debugging
  • Anti disassembly
  • Anti decompilation
  • Virtual Machine based protection
  • Heaven’s Gate (hanya untuk Windows 8 ke bawah), salah satu teknik yang cukup rumit

Dasar ilmu Enkripsi

Ransomware adalah malware yang mengenkripsi file korbannya. Jadi langkah logis berikutnya adalah: memahami enkripsinya.

Pertama yang saya sarankan adalah: cobalah membuat program yang mengenkrip dan mendekrip file. Lebih bagus lagi kalau membuat enkriptor dalam satu bahasa dan dekriptor dalam bahasa lain, supaya lebih paham berbagai variasi API enkripsi dalam berbagai bahasa.

Contohnya begini: jika kita ingin mengenkrip file, maka ada banyak cara:

  • Kita mengimplementasikan sendiri algoritma AES/RSA atau bahkan algoritma custom
  • Kita menggunakan library yang sudah ada, misalnya: CryptoPP (C++), openssl (C dengan binding ke banyak bahasa), Bouncycastle (Java, .NET)
  • Kita bisa menggunakan library built in dari sistem operasi (misalnya wincrypt di Windows)

Jadi pembuat ransomware bisa memilih salah satu dari cara di atas. Bagaimana misalnya kalau dia memilih Wincrypt, dan kita sudah bisa mendekompilasi kodenya. Apakah Anda akan bisa memahami proses enkripsi dan membuat dekriptornya? jika ransomwarenya memakai CryptoAPITransform, apakah Anda bisa membuat dekriptornya?

Cobalah membaca dan memahami berbagai jenis enkripsi. Jika kita bahkan tidak tahu enkripsi apa yang dipakai oleh ransomware, bagaimana kita bisa tahu apa kelemahannya?

Kelemahan Implementasi Enkripsi

Ini adalah topik yang paling sulit saya jelaskan, karena kebanyakan yang bertanya tidak paham mengenai dasar enkripsi. Saya sebenarnya sudah menulis sebagian topik dasar ini, misalnya beberapa artikel ini, tapi belum lengkap dan menyeluruh (topik enkripsi ini sangat luas):

Beberapa contoh kelemahan dalam implementasi enkripsi ini misalnya:

  • Keynya ada di ransomware itu sendiri/fixed key
  • Keynya berdasarkan MAC address komputer (atau nomor seri harddisk, atau sesuatu yang lain yang bisa dicari)
  • Keynya random, tapi ada kelemahan dalam cara menghasilkan bilangan randomnya (tidak menggunakan secure random)
  • Salah memanggil fungsi enkripsi (misalnya salah parameter)
  • Salah mengimplementasikan algoritma enkripsi
  • Memakai stream cipher dengan key yang sama untuk setiap file

Di soal Flare On Mugatu, ternyata kelemahannya adalah: hanya 4 byte key yang dipakai untuk enkripsi. Dan ini bisa dibruteforce dengan cepat menggunakan C.

Salah satu cara untuk mendapatkan gambaran berbagai kelemahan enkripsi adalah dengan mengikuti CTF kategori crypto, atau minimal membaca berbagai writeup di kategori crypto. Untuk saat ini saya sarankan dari CTF di luar negeri, karena kebanyakan CTF di Indonesia masih basic sekali soal kriptografinya.

Contoh beberapa malware yang memiliki kelemahan enkripsi: LockCrypt dan ACCDFISA. LockCrypt memakai enkripsi lemah dan random number generator (RNG) yang lemah, sedangkan ACCDFISA yang membuat password dengan RNG yang lemah. Untuk contoh lain ransomware yang tidak bisa dibongkar tapi pembuatnya menyerah dan memberikan keynya: Teslaware.

Pernah juga ada kasus di mana kelemahan malware bukan di malware itu sendiri tapi di server pembayaran tebusan/ransom. Servernya berhasil di hack, dan keynya bisa diambil dari server.

Penutup

Mungkin sebagian tulisan ini terasa mengecewakan, dan mungkin sebagian akan berpikir: wah susah ya, kalau begitu gak jadi deh, saya menyerah aja. Kalau memang memiliki niat, sebaiknya jangan menyerah.

Tidak semua pembuat ransomware jagoan, mungkin ada ransomware buatan lokal dan hanya menyebar lokal di kota tertentu (bahkan sangat lokal, misalnya cuma area kampus tertentu), dan ada kemungkinan enkripsinya tidak rumit atau memiliki kelemahan. Anda bisa mencoba-coba membuat dekriptornya, dan menyelamatkan minimal orang-orang di sekitar Anda.

Semoga tulisan ini cukup untuk menjawab Anda yang ingin belajar membongkar sendiri ransomware. Jika ada pertanyaan lebih lanjut bisa ditanyakan ke saya (lihat side bar mengenai cara menghubungi saya).

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.

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. Ditambah lagi tiap versi proteksinya bisa diperbarui oleh pembuat programnya.

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 uangnya. 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 per bulan, 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 membantu Anda mengcrack software (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.