Sunday, November 9, 2014

Mau ikut CTF, perlu belajar apa?

Kali ini postingnya bukan tentang writeup, tapi topik umum yang sering ditanyakan: kalau mau ikutan CTF, perlu belajar apa sih?  Saya sudah menulis tentang CTF secara umum di blog pribadi saya, jadi di sini saya hanya ingin membahas: kalau mau ikutan CTF, apa yang perlu dipelajari, atau: harus mulai dari mana?

Pertama perlu dipahami bahwa soal-soal CTF beraneka ragam: kriptografi, reverse engineering (reversing), exploit (pwnables), web/networking, forensic, dan topik lain-lain. Jadi secara umum kita perlu belajar semuanya. Banyak soal saling berhubungan, jadi berkonsentrasi pada satu hal saja akan membatasi soal yang bisa diselesaikan. Contoh: ketika reversing, kadang ada enkripsi di dalamnya, atau ketika melakukan forensic, ternyata ditemukan file pcap yang membuat kita harus tahu soal networking.

Anda tidak perlu terpaku dengan apa yang saya tuliskan di sini. Cara termudah untuk memulai adalah dengan ikut CTF apapun, coba selesaikan, dan ketika gagal, bacalah writeupnya. Cara terbaik untuk memulai adalah dengan mencoba sendiri. Tapi jika kemampuan dasar Anda masih nol, memang Anda perlu belajar dulu hal-hal dasar. Misalnya jika Anda tidak tahu C dan Assembly, kemungkinan Anda bisa menyelesaikan soal reversing mendekat nol.

Untuk topik reversing dan exploit, kita perlu memahami assembly dan bahasa C. Sekarang ini kebanyakan soal diberikan dalam bentuk binary, dan kadang bisa didekompilasi menjadi C (dengan IDA Pro atau Hopper). Nah jika Anda tidak bisa membaca bahasa C, maka percuma bisa memakai dan menjalankan decompiler jika tidak memahami apa outputnya. Bahasa C ketika dicompile akan dikonversi menjadi assembly lalu di assembler menjadi file biner. Jadi saran saya: untuk topik reversing dan exploit, pahamilah dasar-dasar bahasa C, minimal sampai ke topik: memory allocation, pointer, function pointer.

Setelah bisa mengkompilasi program dalam bahasa C, cobalah reverse engineer sendiri program yang sudah dicompile itu, supaya mendapatkan feel bagaimana sebuah program dikonversi dari teks dalam bahasa C menjadi bahasa mesin. Setelah itu, cobalah membaca artikel-artikel mengenai exploit, misalnya tentang buffer overflow, heap overflow, dsb. Tanpa dasar bahasa C, akan sulit mengikuti topik-topik tersebut.

Dalam topik web, Anda bisa belajar teknologi web manapun (PHP, Python, Ruby, dsb). Anda bisa mulai dengan yang mudah, misalnya PHP. Cobalah menulis program sederhana yang memakai session, mengakses database, tanpa menggunakan framework (jadi pakailah PHP murni saja, jangan memakai Yii, Code Igniter, dsb yg sejenis). Secara tidak langsung, di sini Anda perlu belajar memakai database (belajar dasar-dasar SQL, select, insert, update, dsb). Lalu cobalah mengeksploit aplikasi Anda sendiri (sql injection, session fixation, dsb).

Di sisi client, Anda perlu belajar HTML dan JavaScript (wajib, karena ini bahasa de facto untuk aplikasi sisi client). Di sisi client ini ada beberapa yang perlu dipelajari dari sisi security, misalnya XSS. Pahami juga mengenai bagaimana client dan server berkomunikasi, artinya ini Anda perlu belajar tentang protokol HTTP. Anda harus paham hal-hal dasar seperti POST request, GET request, Cookie, dsb.

Meskipun saya menyarankan PHP, tapi pada banyak CTF, bahasa lain banyak dipakai. Konsep security dalam berbagai bahasa ini masih serupa, jadi pengetahuan dari satu bahasa bisa dipakai di bahasa lain.

Dalam topik forensic, kita biasanya diminta untuk mengekstrak data dari sebuah file. File ini bisa berupa disk image, bisa berupa network capture. Dalam hal ini, kita perlu tahu mengenai berbagai jenis filesystem dan tools-tools yang berkaitan dengan itu, tools forensik misalnya Sleuthkit dan Volatility. Untuk forensic yang berhubungan dengan networking (sebenarnya ini juga masuk dalam topik networking), Anda perlu memahami banyak protokol dasar, seperti misalnya HTTP, FTP, HTTPS, dsb. Cara memahami protokol-protokol ini, selain dengan banyak membaca adalah dengan mempraktikkan dengan mengcapture packet menggunakan wireshark dan membaca hasilnya.

Topik kriptografi adalah topik yang sangat abstrak, Anda harus belajar mulai dari enkripsi paling sederhana (rot13, xor, dsb), sampai topik yang rumit seperti RSA, dan bahkan topik kriptografi yang tidak standar lainnya. Berbagai tools standar (Seperti command line openssl) perlu dikuasai.

Hampir semua soal butuh programming untuk menyelesaikannya. Selain belajar bahasa C untuk masalah exploit dan reverse engineering, sebaiknya Anda belajar minimal satu bahasa lain. Kebanyakan orang menggunakan Python. Bahasa C bisa digunakan untuk menyelesaikan semua soal, tapi biasanya butuh waktu lebih lama untuk menulis program dalam bahasa C.  Contoh kecil saja: tanpa programming, bagaimana Anda akan mengekstrak teks untuk menyelesaikan soal seperti challenge ini?

Selain programming, kemampuan menggunakan shell (misalnya bash) dan tools-tools command line lainnya juga akan sangat membantu (misalnya: bagaimana mendapatkan MD5/SHA1 sebuah file). Sebenarnya menggunakan fitur-fitur shell juga adalah bentuk programming (ada loop, if dsb) tapi kemampuan dan kecepatan shell terbatas .

Akhir-akhir ini banyak algoritma ditanyakan, jadi pengetahuan mengenai berbagai algoritma dasar diperlukan. Contoh writeup di blog ini: Gas Stations (K Means), Web 200 SecuInside (CRC32)

Terakhir yang tak kalah penting adalah kemampuan menggunakan search engine (Google Fu). Ini sangat penting untuk mencari solusi soal. Kadang jawabannya langsung ketemu dengan Google, kadang kita perlu memodifikasi jawaban yang sudah ada. Cara terbaik untuk belajar memakai google adalah: jangan langsung bertanya pada orang ketika mentok. Cobalah habiskan waktu sejam, dua jam untuk mencari jawaban sendiri, dengan berbagai variasi kata kunci, kalau sudah menyerah, baru bertanya, plus sekalian tanya: bagaimana orang tersebut tahu jawabannya.

Perlu dicatat: kemampuan googling harus disertai kemampuan lain, misalnya jika sudah tahu  algoritma tertentu, kita tetap perlu bisa memodifikasi source codenya supaya sesuai dengan soalnya (butuh kemampuan programming).

Jika Anda sudah mulai "menyerah" melihat topik yang begitu banyak: perlu dicatat bahwa topik yang dipelajari juga berguna untuk dunia nyata. Keahlian forensik bisa untuk membantu teman yang datanya terhapus. Keahlian web bisa digunakan untuk membuat aplikasi web (dan mengetes/pentest aplikasi web).

Saya sendiri mendapatkan berbagai pengetahuan ini dari pengalaman saja. Pengetahuan networking karena kebetulan saya pernah jadi admin. Pengetahuan programming karena pekerjaan saya adalah programmer.  Sisanya adalah pengetahuan dari pengalaman sehari-hari. Data saya pernah hilang, jadi saya coba pelajari bagaimana proses recovery bekerja. Saya juga sering iseng membuat berbagai project pribadi yang sering saya buang (jadi cuma dapat ilmunya aja).

Cobalah juga membaca banyak writeup yang tersebar di berbagai penjuru internet. Ketika sudah dituliskan, semuanya tampak mudah, jadi kalau bisa: cobalah selesaikan sendiri soal tersebut. Jika Anda sudah membaca writeupnya, coba download soalnya, dan tanpa mencontek lagi coba selesaikan soal tersebut. Coba juga bayangkan juga: apakah kira-kira Anda bisa melihat apa yang dilihat oleh penulis writeup ketika melihat soal itu, tanpa diberi petunjuk apa-apa.

Ada juga CTF yang mengarsipkan semua soal plus scoringnya, misalnya hack.lu, arsipnya di sini. Jadi Anda bisa mendownload soal, menyelesaikan soal, koneksi ke server, mengecek flag Anda sudah benar atau belum (bedanya Anda tidak mendapatkan skor). Setiap tahun soalnya ada minimal 20 soal dan ada 4 tahun yang terarsip di situ, jadi minimal ada 80 soal yang bisa Anda coba.

Mengenai environment: kebanyakan orang menggunakan Virtual Machine (Silakan install Virtual Box atau VMWware). IDA Pro berjalan paling bagus di Windows, banyak tools command line bagus di OS X atau Linux, dan kebanyakan soal exploit adalah untuk Linux. Minimal mahirlah dalam menggunakan Windows dan Linux. Memiliki komputer dengan OS X boleh-boleh saja (silakan install Virtual Machine Windows dan Linux di dalamnya), tapi pemahaman mendalam mengenai OS X saat ini belum menjadi soal CTF.

Sebagai penutup: tim kami masih sangat jauh peringkatnya di dunia ini (saat artikel ini ditulis peringkat 166 di CTF Time), walaupun kami nomer 1 di Indonesia. Ini menunjukkan bahwa negara kita masih sangat ketinggalan dalam bidang CTF ini. Sebagian besar anggota team kamipun tergolong "tua" dan berkeluarga, sedangkan dari kebanyakan negara lain, mereka masih sangat muda. Orang muda punya waktu dan stamina yang lebih banyak dalam mengerjakan soal-soal CTF. Jadi saya sangat menyarankan Anda yang masih muda untuk ikutan CTF.


27 comments:

  1. Izin share ke teman pak,, mantab pak thanks (y)

    ReplyDelete
  2. Kata - kata terakhirnya om sangat menyentuh. Saat nya kaum muda unjuk gigi ya OM???

    saya juga tertarik dengan dunia kompetisi CTF walaupun belum punya background.

    maka dari itu. mohon bimbingan nya om. saya mau belajar CTF. hehehe.

    ReplyDelete
  3. Terima Kasih pak infonya

    sangat setuju sama atas saya

    ReplyDelete
  4. tulisannya sangat menginspirasi dan mudah dimengerti

    ReplyDelete
  5. Terima kasih pak. Menginspirasi banget

    ReplyDelete
  6. selain xor,dan rot 13 apa lagi enkripsi sederhana?

    ReplyDelete
  7. Jadi tertarik nih om berkat kata katamu :*

    ReplyDelete
  8. Om ajarin ctf dari awal pliss ...
    Saya pengen belajar ctf dengan giat masa saya hanya bisa merusak;'v ajari lah plisss

    ReplyDelete
  9. Saya masih bodoh dan semua start saya berawal dari hati dan niat positive yang tulus untuk belajar . terimakasih pak Jo buat artikelnya . Higher Intelligence yang bless pak Jo dan keluarga .

    ReplyDelete
  10. semoga saja bisa lah untuk belajar materinya

    ReplyDelete
  11. Merinding sama kata kata yang memotivasi pak, terima kasih

    ReplyDelete