Ini sudah keempat kalinya saya mengikuti challenge tahunan Flare-On dari FireEye. Saya sudah pernah menuliskan tentang Flare-On ini di posting saya yang lain, tapi akan saya ulangi sedikit.
Flare-On adalah challenge reverse engineering, alias tantangan membongkar program. Bentuk Flare-On adalah challenge, semua yang selesai adalah pemenang. Ini ibaratnya seperti marathon, semua yang berhasil menyelesaikan disebut sebagai finisher. Ini berbeda dari CTF lain yang biasanya sifatnya adalah lomba (seperti lari Sprint) di mana yang duluan memecahkan adalah pemenangnya (contoh seperti ini adalah ketika saya menang hadiah ke Hong Kong dari reverse engineering).
Panitia sudah memberikan write-up tentang bagaimana caranya menyelesaikan berbagai soal yang ada, jadi saya tidak akan membuat write-up. Tapi ada permintaan supaya saya menuliskan: ilmu apa sih yang dibutuhkan buat menyelesaikan masing-masing level? memang kadang membaca sebuah write-up itu terasa membingungkan kalau belum tahu dasar ilmunya. Jadi di posting ini akan saya tuliskan deskripsi challengenya, dan ilmu apa yang perlu diketahui untuk menyelesaikan tiap challengenya. Tahun ini dari Indonesia hanya Faco lagi yang solve, dan dari Thailand ada 2 orang lain selain saya.
Contents
Chal 1: Minesweeper Championship Registration
Ini adalah bentuk challenge reverse engineering paling sederhana. Ini sekedar memfilter orang-orang yang blank sama sekali soal reverse engineering. Misalnya ada yang bertanya di Twitter apa invitation codenya, padahal itulah soalnya (mencari invitation code).
Solusi untuk soal ini sangat sederhana, dengan decompiler Java didapatkan jawabannya, hanya sebuah if saja yang perlu dibaca. Hal yang perlu diketahui hanya ini: sebuah program bisa ditulis dalam berbagai bahasa, setelah mengetahui bahasanya, kadang kita bisa mendapatkan decompilernya dan bisa membaca kodenya.
Meskipun soal ini terlihat amat sangat sederhana, bukan berarti tidak terpakai. Sekitar 20 tahun yang lalu ada banyak aplikasi shareware yang proteksinya segampang ini, hanya ada satu password statik saja. Bahkan beberapa tahun terakhir ini ketika para ahli security membongkar firmware router, ditemukan juga perbandingan statik seperti ini (account backdoor dengan password statik).
Chal 2: Ultimate minesweeper
Tantangan ini mulai agak serius: hacking game. Gamenya sangat sederhana, hanya minesweeper. Tugas kita hanya satu: mencari tahu di mana yang bukan bom, tapi kebanyakan isinya adalah bom (900 sel dan hanya 3 yang bukan bom).
Cara yang manual adalah dengan mengklik satu per satu 900 kali untuk mencari tahu lokasi yang bukan bomb karena posisinya tidak akan berubah. Cara yang lebih cerdas adalah dengan membaca kode atau melakukan debugging untuk melihat isi memori, supaya tahu mana yang ada bombnya.
Ini adalah contoh di mana pengetahuan programming diperlukan. Jika Anda adalah programmer, maka akan terbayang bahwa perlu ada struktur data board (biasanya dalam bentuk array 2 dimensi) yang isinya apakah di suatu posisi ada bomb atau tidak. Jika Anda programmer yang membuat program semacam ini tentunya akan bisa mendebug program sendiri dan bisa menentukan di mana bom dan bukan bom.
Challenge ini sederhana karena 90% nama bisa dibaca dan tidak menyesatkan. Hanya ada satu bagian kecil saja yang dibuat agak membingungkan (bagian mengisi lokasi yang bukan bom).
Ini masih game yang super sederhana dan banyak yang menyerah tapi orang-orang ini sebagian ingin bisa membongkar dan mengakali game di App Store/Play Store. Untuk game yang serius, ada lebih banyak lagi hal-hal yang perlu dicatat oleh game, lokasi pemain, jumlah koin, kondisi musuh dsb. Jika Anda tahu cara kerja game (meskipun tidak pernah memprogram langsung), Anda akan terbayang data apa saja yang disimpan.
Secara teknis, program ini dibuat dengan .NET, diperlukan pengetahuan bahwa ada banyak debugger sekaligus decompiler .NET. Cara termudah adalah dengan dnspy yang bisa mendecompile dan mendebug. Menelusuri program bisa dilakukan cukup jelas, mulai dari klik sampai dia membaca memori yang berisi struktur data board.
Chal 3: FLEGGO
Di sini tantangan sudah masuk lebih serius: membongkar native code alias kode assembly. Ini hanya sedikit lebih sulit dari challenge pertama, karena di challenge pertama kita bisa mendapatkan kodenya dengan membaca source code Java. Kali ini yang dibaca adalah assembly, tapi string passwordnya masih jelas di file.
Masalah utamanya adalah: ada 48 file. Ini masih bisa dilakukan satu per satu, tapi butuh waktu lama. Di sini diperlukan otomasi, bagaimana mengulangi proses yang sama 48 kali. Proses otomasi ini juga penting dalam dunia nyata, contohnya FireEye pernah harus mengecek 10 ribu komputer untuk mengetahui apakah BIOS-nya diinfeksi malware atau tidak.
Orang yang tidak bisa mengotomasi ini sering saya temui dalam hidup, dulu saya pernah menuliskan tentang admin yang membuat secara manual 100 account dan menginstall satu per satu semua software. Inti dari otomasi adalah membuat program atau skrip untuk mengulangi berbagai pekerjaan manual.
Jadi ilmu dasar untuk menyelesaikan soal ini adalah: keahlian membaca assembly dasar dan memprogram untuk mengotomasi pembuatan solusi.
Chal 4: binstall
Ini contoh serius dari sebuah malware yang disederhanakan dan dijinakkan. Ini merupakan versi sederhana dari trojan banking sejenis Zeus dan sejenis berbagai malware lain yang membajak browser. Di sini sudah banyak dipakai berbagai teknik yang mulai rumit, seperti obfuscation dan dll injection. Karena malware ini sudah disederhanakan, ilmu dari berbagai buku dan tutorial website masih bisa digunakan.
Challenge ini mengkombinasikan .NET (installer), .dll (native code) dan .js (javascript). “Malware” ini akan menginjeksikan skrip pada website flare on dan menambahkan command baru. Malware yang sesungguhnya akan aktif di sebuah situs banking dan mencuri password kita, atau mengubah tujuan transfer ke nomor lain.
Ada banyak sekali ilmu dasar analisis malware yang perlu dimengerti untuk menyelesaikan soal ini. Saran saya adalah: bacalah salah satu buku analisis malware, dan coba praktikkan ilmunya pada soal ini.
Chal 5: Web 2.0
Beberapa tahun lagi WebAssembly akan populer. Saat ini WebAssembly sudah disupport semua browser, tapi masih belum banyak dipakai oleh berbagai website. Sebagai reverse engineer, kita harus berpikir maju dan mulai belajar membaca kode yang akan populer, bukan yang sudah populer.
Challenge di bab ini adalah untuk memahami kode WASM, dan sebenarnya setelah dipelajari bisa diselesaikan dengan sangat mudah menggunakan debugger yang ada di browser. Saat ini belum banyak resource reverse engineering web assembly, jadi kita perlu membaca banyak dasar teori untuk menyelesaikan soal ini.
Chal 6: Magic
Soal ini adalah mengenai binary Linux. Soalnya rada mengada-ada, kita diminta mengisi 666 password yang dihasilkan dari algoritma tertentu. Ada banyak cara menyelesaikan ini, baik dengan otomasi, ataupun memahami algoritma supaya tidak perlu menjawab sama sekali.
Dalam mencari bug di dunia nyata, kita tidak akan diberi program sederhana yang mudah dibongkar. Berbagai program di Linux ukurannya besar dan hasil compile dari ratusan ribu atau jutaan baris kode. Soal ini sekedar mensimulasikan bahwa kadang kita harus memahami beberapa algoritma yang ada di sebuah file biner dan memahaminya dengan benar.
Dasar ilmu untuk menyelesaikan soal ini adalah: kriptografi (dasar) dan pengetahuan debugging binary Linux. Beberapa tool juga bisa dipelajari (misalnya pexpect, frida, gdb) untuk mengotomasi solusinya.
Chal 7: WOW
Soal ini hanya bisa dijalankan di Windows 7 64 bit karena memakai teknik Heaven’s Gate. Ini hanyalah salah satu contoh teknik aneh yang dipakai oleh malware. Ada banyak sekali teknik-teknik lain yang dipakai oleh malware untuk mempersulit debugging.
Secara umum untuk menyelesaikan soal semacam ini kita perlu banyak mengikuti perkembangan malware dan teknik-teknik terbaru yang dipakai oleh malware untuk menyulitkan debugging.
Chal 8: Doogie Hacker
Challenge ini sebenarnya bisa dianggap sebagai selingan saja. Pengetahuan yang perlu dimiliki adalah melakukan reverse engineering boot sector. Jaman dulu banyak virus boot sector sederhana, dan sekarang ini ada yang namanya “bootkits” yang kompleks (rootkit yang bisa menginfeksi boot sector/MBR).
Hanya diperlukan keahlian dasar membaca kode 16 bit plus sedikit ilmu kriptografi untuk menyelesaikan ini. Soal ini juga merupakan pengantar untuk soal terakhir yang lebih kompleks. Soal sederhana seperti ini diberikan supaya pemain merasa sedikit tenang.
Chal 9: leet editr
Ini contoh lain penggunakan teknik yang digunakan oleh malware. Kali ini yang dipakai adalah VirtualAlloc dan VirtualProtect yang mempersulit debugging. Tapi sayangnya soal ini masih kurang kompleks sehingga ada beberapa shortcut untuk menyelesaikannya. Seperti challenge no 7, diperlukan pemahaman cukup dalam mengenai trik malware dan internal Windows untuk menyelesaikan soal ini.
Chal 10: golf
Ini soal yang luar biasa, berupa penggunaan hypervisor dengan menggunakan VT-X Extension dari Intel. Diperlukan pemahaman yang cukup dalam mengenai prosessor dan hypervisor untuk bisa menyelesaikan soal ini. Pembuat CTF tidak main-main dalam mengimplementasikan soal ini. Teknik semacam ini hanya dipakai oleh malware tingkat lanjut.
Di sini fitur Intel VT-X digunakan untuk mengimplementasikan sebuah instruction set khusus tapi tetap memakai register prosessor itu sendiri. Untuk menyelesaikan soal ini diperlukan banyak membaca mengenai hardware virtualization.
Chal 11: malware skillz
Ini soal tahun lalu yang disederhanakan. Jika sudah membaca soal dan solusi tahun lalu, tentunya akan tahu betapa panjangnya proses memahami soal ini. Bagi yang sudah menyelesaikan soal tahun lalu, menyelesaikan ini sangat gampang, segala macam tipuannya sudah terbaca dari awal dan soalnya sudah disederhanakan dari tahun sebelumnya.
Ini adalah soal yang paling dekat dengan malware yang sesungguhnya. Di soal ini juga diberikan file pcap yang merupakan hasil sniffing jaringan yang perlu kita analisa.
Untuk menyelesaikan soal ini diperlukan kombinasi dari berbagai hal:
- Pengetahuan jaringan (Wireshark, protokol DNS dan SMB)
- Reverse engineering native code
- Enkripsi, hashing, dan berbagai algoritma lainnya
- Reverse engineering .NET
- Pengetahuan mengenai git
Chal 12: Suspicious Floppy Disk
Soal ini awalnya seperti soal no 8, kita perlu melakukan reverse engineering kode 16 bit pada sebuah floppy disk. Di sini berbagai teknik DOS yang lama seperti intercepting interrupt digunakan. Saya menyangka tantangan kali ini akan memanfaatkan berbagai trik DOS yang kompleks (misalnya kode polymorphic) sehingga saya mempersiapkan diri membuat custom instrumentation untuk Bochs.
Dengan menuliskan kode instrumentasi saya bisa mencatat berbagai perintah yang dieksekusi sejak titik tertentu (minta password) sampai ada hasilnya. Ternyata jumlah instruksi yang dieksekusi banyak sekali. Setelah dipelajari lebih dalam lagi, ternyata isinya adalah sebuah virtual machine untuk arsitektur one instruction set computer (OISC) subleq.
Untuk yang menyelesaikan soal tahun lalu, tentunya akan ingat bahwa ini adalah soal no 11 tahun lalu. Ada pembahasan yang cukup dalam mengenai soal ini (jumlah halaman solusinya: 81 halaman). Saya juga membaca berbagai pendekatan lain untuk memahami yang dilakukan kode ini, termasuk juga membuat plot instruction pointer terhadap waktu.
Di sini diperlukan pengetahuan bagaimana sebuah interpreter bekerja. Saya mengimplementasikan ulang virtual machine subleq dalam C, lalu menjalannya. Bedanya dengan tahun lalu: kode subleq ini sangat panjang. Ada sekitar 500 ribu instruksi dieksekusi untuk menampilkan pesan dan mengecek password. Tahun lalu ini relatif pendek dan bisa dianalisis cukup cepat.
Akhirnya mau tidak mau saya harus membaca kode subleqnya, ternyata kodenya dipenuhi dengan sampah untuk mempersulit pembacaan. Contoh sampah adalah operasi aritmatika yang hasilnya dibuang. Ternyata kode subleq ini merupakan virtual machine juga. Jadi ini adalah virtual machine di dalam virtual machine. Virtual machine yang diimplementasikan oleh kode subleq adalah RSSB (Reverse subtract and skip if borrow), salah satu jenis one instruction set computer selain subleq.
Kode RSSB jauh lebih sulit dibaca dari subleq, dan saya perlu membuat kode python custom untuk menyederhanakan kode RSSB-nya. Ternyata kode inipun dipenuhi dengan sampah sehingga sulit dibaca. Di sini menurut saya yang dibutuhkan adalah ketekunan. Ini seperti kembali ke awal belajar membaca kode assembly (tanpa decompiler).
Jadi intinya untuk menyelesaikan soal ini butuh sedikit membaca teori dan banyak kesabaran.
Amazing CTF Player. Beda kelas. 😀