Sudah lama saya tidak ikutan CTF online selain Flare-On, alasannya sama dengan kebanyakan orang lain: sibuk. Tapi tahun ini ada rekan yang kerja di TrustWave dan perusahaannya mengadakan CTF: SpiderLabs CTF, jadi saya penasaran sedikit ingin melihat soal-soalnya. Karena nggak berniat bermain penuh, saya mendaftar dengan nama team yang belum pernah saya pakai sebelumnya: pokedora (pokemon + doraemon, kesukaan anak-anak).
Ternyata saya bisa menyelesaikan banyak, sampai sekitar 6 jam sebelum lomba berakhir masih masuk peringkat 3, dan akhirnya ketika bangun tadi pagi sudah tergeser dan berakhir di peringkat 6. Peringkat 100 besar akan mendapatkan T-shirt.
Awalnya saya mengerjakan sendiri, lalu di akhir saya dibantu oleh Faco dan Abdillah Muhammad. Saya menyelesaikan 26 soal dari 29 soal yang kami selesaikan. Karena jumlahnya cukup banyak, saya tidak punya cukup waktu untuk menuliskan detail semuanya, jadi di sini akan saya berikan Write-up singkatnya saja. Selain itu alasan lainnya adalah: saya tidak menyimpan banyak screen capture (karena tadinya tidak berniat main sampai lama).
Contents
Soal kategori OSINT
Soal kategori ini sekedar searching di Google. Sudah ada yang menuliskan lengkapnya di sini. Saya kurang suka soal-soal sejenis ini, karena agak menebak-nebak. Panitia pun harus berkali-kali menambahkan hint supaya ketemu jawaban yang mereka maksud. Banyak sekali yang solve soal ini. Ini saya kerjakan agak di akhir, ketika sedang lelah mengerjakan soal lain. Ada 4 soal OSINT yang saya selesaikan, dan Faco menyelesaikan 1 soal (total ada 7 soal).
Soal kategori Cortex XDR
Soal-soal dalam kategori menurut saya hanyalah iklan sponsor. Intinya kita disuruh mencari sesuatu menggunakan interface produk Cortex XDR. Ada 10 soal di kategori ini dengan total nilai 600 poin. Dengan menjawab soal-soal ini saja sebuah team sudah akan masuk sekitar peringkat 109 (hampir dapat kaos). Di awal CTF, produknya ngadat karena terlalu banyak diakses, tapi akhirnya saya berhasil mengakses dan menyelesaikan semuanya. Tidak ada ilmu khusus yang didapat dari ini. Kalaupun tidak saya selesaikan, team hanya akan tergeser jadi peringkat 8.
Soal Kategori Exploit
Ada beberapa soal dalam kategori exploit, yang pertama saya selesaikan adalah Jello Jail dan satu lagi adalah Remote IOT Service.
Jello Jail
Ketika ssh ke sana kita diberi prompt. Apapun yang kita ketikkan, jawabannya cuma salah satu dari dua ini:
- Jello command executed. However, Jello does not produce output
- This is not a Jello command
Setelah mencoba-coba memasukkan semua karater, ternyata:
- Jika command mengandung karakter dalam blacklist (yaitu salah satu dari: bsdkc/$&*><) maka pesannya adalah “This is not Jello command”
- Selain itu (baik berhasil atau tidak commandnya) akan keluar pesan satu lagi (“Jello command executed. However, Jello does not produce output“)
Saya mencoba perintah ping ke server saya, dan berhasil mendapatkan ping. Tapi eksfiltrasi data sulit: kita tidak bisa menggunakan curl (huruf c difilter), tapi untungnya ada wget. Dengan ini kita bisa mendownload file dari remote, dan menjalankannya. Tapi ada masalah: kita tidak bisa memakai slash (/) jadi wget IP/namafile.txt tidak bisa. Defaultnya nama file jika kita mendownload dari host adalah index.html, tapi huruf ‘d’ diblokir, jadi kita perlu mengoutputkan ke file lain.
Setelah mengutputkan ke file lain, kita bisa menjalankan perintah dalam file tersebut dengan . namafile
(dot nama file). Setelah itu sisanya gampang: jalankan saja apapun dalam file itu. Dari titik ini berbagai trik dari CTF lain bisa dipakai.
Remote IOT Service
Ada password untuk layanan ini, tapi ini bisa diketahui dengan menggunakan format string bugs (print saja berbagai lokasi memori di stack). Setelah masuk, ternyata ada restricted shell lagi seperti Jello, kali ini hanya perintah id dan ls yang dibolehkan. Ternyata setelah dicoba lagi: perintah yang berawalan id dan ls dibolehkan, tapi tidak boleh ada spasi setelahnya (dianggap perintah baru). Jadi kita tidak bisa memberi parameter apa-apa.
Solusi untuk ini cukup mudah: saya jalankan id&&perl (harusnya python juga bisa). Dan saya jalankan system(“cat FLAG.txt”); dari dalam perl.
Kategori Misc
Ada 3 soal dalam kategori ini, tapi semuanya terkait binary yang sama: keypad.exe, kita diminta mencari 3 flag dari situ. Binarynya dalam .NET yang tidak obfuscated. Boleh dibilang ini gabungan antara RE dan enkripsi.
Saya tadinya berpikir ini harus dibruteforce, tapi setelah dibaca dengan teliti, ternyata kita hanya perlu mendekrip AES (key disediakan dalam program).
Kategori Crypto
Saya menyelesaikan dua soal dalam kategori ini Malcolm dan SSO Service.
Malcolm
Diberikan sebuah file python untuk enkripsi dengan AES mode ECB, key enkripsi adalah dua bilangan random antara 0 sampai 0xFFFFFF (satu bilangan ada 16.7 juta kemungkinan). Jadi string dienkrip dengan key angka pertama lalu hasil enkripsi dienkrip lagi dengan key angka kedua. String flag yang dienkrip diawali dengan: ‘Well done! your flag is:’. Kita diberi sebuah string hasil enkripsi tanpa diberitahu apa keynya dan harus mendekrip string tersebut.
Solusi pertama yang terpikir adalah : bruteforce, tapi ini makan waktu terlalu lama, untuk 16.7 juta enkripsi dibutuhkan sekitar 5 detik (ini baru level pertama), berikutnya harus dikalikan lagi dengan 16.7 juta. Solusinya adalah dengan membuat dua tabel:
- Tabel pertama adalah hasil dekrip string enkripsi yang diberikan panitia dengan key dari 0 sampai 0xFFFFFF
- Tabel kedua adalah hasil enkripsi dari string “Well done! your “; (16 byte pertama flag yang kita ketahui) dengan key dari 0 sampai 0xFFFFFF
Berikutnya kita cari sebuah nilai X yang muncul di kedua tabel tersebut. Ini mudah dicari dengan mengurutkan kedua tabel tersebut. Setelah itu kita cari lagi X di tabel pertama untuk mengetahui indeksnya (key pertama), dan X di tabel kedua untuk mencari indeksnya (key kedua).
SSO Service
Kita diberikan akses ke SSH, dan di situ diminta memasukkan private token (dalam bentuk heksa ) dan HMAC. Setelah saya decode, ternyata tokennya hanyalah teks biasa seperti ini: “username=guest×tamp=123344”. Hal pertama yang kepikiran adalah: length exstension attack.
Masalahnya untuk attack itu saya perlu mengotomasi brute force key length. Saya tadinya ingin memakai paramiko, ternyata agak ribet, dan akhirnya memakai plink (dari putty) untuk ssh dan menggunakan package python pexpect. Sudah ada package hashpumpy untuk implementasi attacknya, jadi relatif sederhana. Setelah saya coba ternyata memang benar attack ini (jadi nama HMAC di sini agak menyesatkan karena tidak benar-benar memakai HMAC).
Kategori DFIR
Saya menyelesaikan 2 soal dalam kategori ini. Saya kurang suka dengan soal-soal yang melibatkan file network capture (pcap), tapi setidaknya dalam kasus ini ukuran pcap-nya kecil, dan kita tidak perlu menebak-nebak mana packet penting atau tidak penting.
It takes a team!
Dalam file pcap ditemukan transmisi SMB berupa request daftar file dan mengambil satu file. Setelah diekstrak filenya, isinya adalah file ZIP, di dalam file zip ada file registry hasil ekpor dari Team Viewer. Dari file registry itu bisa didapatkan password team viewer. Setelah itu bingung akan diapakan, tapi ada hint bahwa passwordnya penting, tapi itu bukan flagnya.
Dalam pcap ada request SMB untuk melalukan list isi direktori. Ternyata di daftar file ada file dengan nama yang mengandung bilangan. Bilangan itu merupakan ID Team Viewer. Jadi solusinya adalah: konek dengan Team Vewer ke bilangan itu dengan password dari registry. Di situ kita bisa melihat desktop dengan flag yang terpampang. Hasilnya perlu di OCR karena tidak bisa copy paste.
This is quite an enigma
Dalam pcap ini ada dua hal : ada request HTTP untuk download file, dan ada koneksi SSL terenkripsi. Karena kita tidak bisa melihat isi stream terenkripsi, tentunya fokus pertama adalah ke file yang didownload, dan dari memperhatikan content-length didapati bahwa file ini corrupt. Dua byte pertama hilang, dan dari signature headernya ini merupakan file 7zip.
Setelah menambahkan dua byte pertama, filenya bisa diekstrak dan isinya adalah private key. Dengan private key ini kita bisa mendekrip SSL-nya (dengan wireshark) dan di akhir stream ada flagnya.
Web
Saya hanya menyelesaikan satu soal kategori web: For Your Eyes Only, dan Abdillah menyelesaikan Remote Management Service.
For Your Eyes Only
Pada dasarnya ini adalah soal reverse engineering JavaScript. Saya menggunakan debugger dan javascript console chrome untuk mendebug. Intinya adalah: skrip ini berharap kita mengunakan “User Agent” tertentu, menggunakan ukuran layar tertentu (100×100 piksel), dan memiliki nilai tertentu tersimpan di “localStorage“. Hanya butuh kesabaran untuk ini, tidak perlu menebak-nebak.
Reverse Engineering
Ada dua soal yang saya selesaikan: Link I Need You dan Lottery Roulette, sementara Faco menyelesaikan Space Invader.
Link I Need You
Ternyata nama soal ini adalah karena binary yang diberikan adalah raw binary (tidak dilink menjadi executable). Tadinya ketika saya coba reverse engineer: assemblynya agak ribet, memakai teknik anti disassembly/anti dekompilasi. Tapi setelah saya perhatikan, intinya program ini akan mencetak ke layar dengan syscall. Saya menyelesaikan ini dengan menggunakan Unicorn Engine. Saya cuma perlu mengimplementasikan syscall nomor 1 (syscall write).
Lottery Roulette
Soal ini diawali dengan dokumen dengan macro VBA. Belajar dari flare-on, saya ekstrak langsung Macro-nya menggunakan “olevba“. Ternyata challengenya sifatnya berlapis: dari macro vba ke skrip C#, lalu powershell berlapis.
Untuk macro vba: saya memakai MS Word untuk debugging. Untuk C# saya memakai Visual Studio, dan untuk PowerShell saya memakai PowerShell ISE. Tidak ada yang terlalu istimewa dengan challenge ini, hanya dibutuhkan kesabaran saja.
Penutup
Sudah lama saya tidak main CTF, dan ternyata main CTF masih menyenangkan. Ternyata ilmu saya juga masih lumayan, bahkan sempat menduduki peringkat 3. Satu-satunya hal yang agak saya sesali adalah: saya kurang berfokus ke SDR (software defined radio), dan tidak menyelesaikan sama sekali soal dalam kategori itu, padahal jika bisa menyelesaikan soal-soal SDR, bisa masuk peringkat 3.
Terima kasih ya.
Banyak tulisan tulisan bagus di blog ini.