Membuat Soal CTF

Setelah kemarin mengkritik mengenai soal CTF yang ngawur, saya ingin memberikan contoh soal CTF yang saya berikan di idsecconf. Harapan saya menulis ini adalah: supaya peserta CTF tahu apa yang saya pikirkan ketika membuat soal dan apa yang saya harapkan dari peserta.

Perlu diketahui bahwa saya menyumbangkan soal ini secara gratis, tidak ada imbalan apapun dari pihak idsecconf. Ini bukan mengiklankan idsecconf (buat yang tidak tahu: saya tinggal di Chiang Mai, Thailand, tidak ada kepentingan apapun dengan event apapun di Indonesia). Dan setelah membaca posting saya sebelumnya, Anda juga bisa membandingkan soal-soal ini dengan soal dari CTF internasional lainnya. Saya menuliskan ini untuk menunjukkan keterbukaan, saya tidak malu membuat soal ini, saya punya semangat berbagai ilmu.

Salah satu peserta telah mengirimkan writeupnya juga, sehingga Anda bisa melihat apakah jalan pikiran peserta sudah seperti yang saya harapkan: Cyber Security IPB dan Abdilah.

Tahun ini saya diminta agak mendadak untuk menyumbang soal CTF IDSECCONF. Karena mendadak, saya tidak mengeluarkan soal sulit. Soal yang sulit perlu ditest ulang untuk memastikan bisa berjalan dengan baik, dan perlu diuji oleh panitia lain. Soal-soal inipun sebenarnya sudah ada di komputer saya sejak lama.

Webwob

Ini adalah soal termudah yang saya buat. Soal ini adalah soal web yang diberi source code. Soal inipun bukan soal yang benar-benar baru, tapi varian dari soal strcmp dan PHP yang ada di berbagai CTF. Seperti harapan saya: banyak peserta bisa menyelesaikan soal ini (73 peserta, atau 46.5% peserta).

Source code yang saya berikan sangat pendek, jadi bisa segera dilihat apa yang tidak biasa. Di sini yang tidak biasa adalah penggunaan strcmp untuk membandingkan substring. Jika peserta mencari “strcmp php ctf writeup” maka akan muncul soal sejenis di CTF lain. Dari situ akan ada cukup hint untuk bisa menyelesaikan soal ini. Perhatikan bahwa CTF di dunia ini banyak yang berhubungan, writeup yang ditulis oleh seseorang menjadi inspirasi soal baru bagi orang lain sekaligus menjadi inspirasi untuk memecahkan suatu soal bagi peserta.

Soal sederhana seperti ini sudah berhasil membuat bingung beberapa orang . Saya tahu karena mereka bertanya ke saya dan saya cuma menyarankan untuk mencari “strcmp php ctf writeup”, dan membaca soal saya dengan teliti. Menurut saya soal ini berhasil membuat pemula agar belajar.

Sebagai pembuat soal, saya lupa melakukan sesuatu: saya tadinya berniat memang passwordnya 4 karakter saja, tapi saya ingin mensetup agar passwordnya tidak mudah ketemu dengan brute force dengan menggunakan karakter special (misalnya “\t” dan chr(254)) dalam passwordnya. Tapi setelah testing hal ini lupa saya lakukan, jadi peserta ada juga yang menggunakan pendekatan bruteforce (dan berhasil). Seharusnya password 4 karakter jika memakai karakter istimewa akan tetap butuh waktu lebih banyak (dan tidak akan berhasil ditebak dalam waktu yang diberikan).

Headshoot

Soal ini lebih sulit, hanya diselesaikan 16 peserta (10.2% peserta), dan masih masuk kategori web. Soal ini setahu saya baru (belum ada di CTF lain), jadi targetnya memang bukan untuk pemula.

Dalam setiap CTF saya berharap bisa belajar sesuatu yang baru dan sebagai pembuat soal berusaha mengajarkan sesuatu yang baru. Dalam hal ini sebuah header yang ada di dalam standar HTTP tapi jarang dipakai.

Clue soal ini sebenarnya cukup jelas: ada sebuah file flag yang hanya bisa diminta via request HEAD. Banyak peserta menyadari segera mengenai “Content-MD5” (ini standar HTTP) ada di header. Yang tidak disadari oleh banyak peserta adalah penggunakan header “Range”.

Header “Range” sebenarnya adalah header HTTP standar yang sangat banyak dipakai. Sebuah browser atau download manager bisa melakukan resume download karena adanya header ini. Download manager juga bisa melakukan download dengan multiple thread juga karena adanya header ini.

Saya sangat berharap soal ini tidak terlalu sulit, karena jika kita baca di dokumen spesifikasi HTTP, header berikutnya yang dibahas di dalam daftar adalah adalah “Content-Range”. Seharusnya “Range” itu cukup menjadi inspirasi.

Sayangnya ada dua implementasi Content-MD5, yang satu selalu mengembalikan MD5 keseluruhan file, dan yang lain mengembalikan MD5 parsial (hanya konten yang diminta). Supaya lebih jelas lagi, saya memberikan header “X-Compatible-With: Jigsaw”. Jigsaw adalah web server dari W3C yang menjadi reference implementation untuk web server lain.

Tapi sebenarnya dengan mengandalkan logika saja (dan mengetahui bahwa ada header “Range”) seperti yang dilakukan team Cyber Security IPB, kita tidak perlu membaca spesifikasi HTTP.

Kopi

Soal reversing biasanya terlalu stressful bagi banyak pemula, jadi saya mencoba membuat soal yang menurut saya ringan: Reversing file .class bahasa Java. Bedanya dengan reversing binary adalah: Anda mendapatkan kembali source code yang lengkap. Keahlian yang dibutuhkan hanyalah mencari decompiler Java (tidak sulit) dan membaca kodenya. Bagian kedua ini juga harusnya tidak sulit: saya tidak melakukan obfuscation apapun.

Sesuai harapan juga: 49 peserta berhasil menyelesaikan ini (31.2% peserta). Soal ini tidak terlalu istimewa, tapi merupakan contoh soal di mana hasil dekompilasi bisa dengan mudah dikompilasi kembali (saya sengaja membuat hanya satu file class), jadi jika ingin menambahkan kode debugging (seperti System.println) akan dengan mudah bisa dilakukan.

Untuk reverser handal seperti tim Cybersecurity IPB, bahkan kodenya tidak dibaca karena bisa melihat pola dalam byte array yang diberikan. Sebagai pembuat soal, saya merasa senang dengan pendekatan unik seperti ini. Di CTF lain kemungkinan saya tidak akan lagi menggunakan pola yang terlalu sederhana, karena sangat terbaca.

ECB

Ini soal di kategori misc (bisa juga masuk kategori encryption). Sebenarnya saya memberikan hint ukuran file untuk memudahkan peserta, tapi karena panitia sudah mencoba dan menganggap bahwa itu membuat soalnya terlalu mudah, hintnya dihapus. Saya senang dengan hal ini karena panitia yang saya beri soal mau menguji soal saya dan bisa menentukan tingkat kesulitan soal. Walau hint sudah dihapus, 14 team berhasil menyelesaikan soal ini.

Soal ini sebenarnya mengajak pembaca untuk menengok Wikipedia (dan itulah yang dilakukan peserta yang berhasil menyelesaikan soal), di situ dengan jelas dicontohkan betapa buruknya mode ECB untuk gambar. Dari situ peserta bisa langsung mencoba menggunakan image editor untuk mengatur offsetnya.

Perhatikan bahwa meski di sini memakai tool grafik (GIMP atau photoshop atau tool lain) untuk menyelesaikan soal, yang menjadi fokus adalah: pemahaman pada enkripsi mode ECB.

Sebagai pentester, saya pernah menemui aplikasi banking yang memakai enkripsi custom dengan mode ECB. Saya berhasil menunjukkan bahwa ini rawan tampering (karena saya bisa mengubah blok di tengah). Ini contoh pengetahuan aplikasi enkripsi di dunia nyata.

Signal

Saya merasa kaget tapi senang (pleasantly surprised) karena ada 20 peserta berhasil menyelesaikan soal reversing ini. Keunikan ini dibandingkan soal reversing lain adalah: saya tidak menggunakan perbandingan (if) untuk mengecek password, dan tidak menggunakan function call secara linear, tapi saya menggunakan fitur signal di Unix.

Pengecekan panjang dilakukan dengan mentrigger signal Floating Point Exception (dengan pembagian 0), dan tabel signal juga digunakan untuk menentukan mana fungsi yang dipanggil (flag benar atau salah). Soalnya saya buat singkat, agar masih bisa dipahami level pemula sampai menengah.

Sebenarnya soal ini bisa dipersulit lagi, tapi karena saya tahu bahwa baru akan dirilis di hari kedua, saya tidak lakukan. Misalnya saya bisa membuat signal handler lebih banyak lagi (misalnya dijadikan state machine), bisa lebih menyembunyikan lagi operasi perbandingan flagnya, bisa menambah anti debug, dsb. Kelemahan utama soal ini adalah: saya hanya menggunakan satu operasi (XOR) untuk menyembunyikan flagnya.

Penutup

Demikian contoh sudut pandang pembuat soal CTF dibandingkan dengan kenyataan mengenai bagaimana peserta menyelesaikan soal yang saya buat. Semoga Anda bisa melihat bahwa soal-soal yang saya buat sifatnya jelas, tidak ada main tebak-tebakan.

Saya juga berharap peserta belajar sesuatu yang baru dari soal saya dengan membuat soal yang unik. Setidaknya ada satu orang yang belajar tentang header “Range”, dan jika ada satu orang saja bertambah ilmunya, maka saya sudah sangat senang sekali.

Hal menarik yang diberitahukan oleh panitia adalah: ada beberapa tim internasional yang ikutan (confirmed dari IP address dan juga dari email yang mereka kirimkan ke panitia, bukan email registrasi), bahkan ada yang berhasil menyelesaikan soal sangat sulit yang dibuat oleh Oghie. Hal yang membuat saya bangga dengan fakta ini adalah: soal kami melintasi batas bahasa sehingga orang asing yang memiliki kapabilitas security bisa ikutan hanya bermodalkan Google Translate.

2 thoughts on “Membuat Soal CTF”

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.