Anti Virus (AV) banyak diandalkan sebagai tools keamanan utama untuk mencegah virus (secara umum disebut malware). Banyak miskonsepsi dan mitos yang berkembang seputar AV ini. Salah satu miskonsepsi adalah merasa aman dengan adanya AV dan percaya 100% dengan AV, kalau AV bilang suatu file aman, maka kita akan percaya.
Tapi tahukah anda bagaimana cara AV mendeteksi malware? Boleh kah kita percaya 100% dengan AV ? Mungkinkah ada malware yang tidak terdeteksi AV ? Dalam tulisan ini saya akan menjelaskan cara kerja AV dan dengan memahami cara kerjanya kita bisa meloloskan diri dari deteksi AV.
Blacklist vs Whitelist
Dalam computer science, secara teoretis, mendeteksi sebuah program malicious atau bukan dengan sempurna adalah pekerjaan yang mustahil dan problem ini sekelas dengan halting problem. Dengan kata lain, secara teoretis, tidak ada satu algoritma atau prosedur yang bisa membedakan dengan sempurna mana program yang malicious dan yang tidak.
Ini adalah kabar buruk bagi kita semua pengguna komputer karena ternyata tidak mungkin ada AV yang bisa 100% melindungi kita dari malware. Namun di sisi lain, ini adalah kabar baik bagi pihak yang berniat jahat karena ini berarti terbuka lebar peluang untuk membuat malware yang tidak terdeteksi AV.
Walaupun secara teoretis pendeteksi malware yang sempurna tidak mungkin dibuat, AV akan berusaha keras mencegah jangan sampai malware berhasil dieksekusi sambil tetap mengijinkan program yang baik untuk dieksekusi
Bayangkan bila anda mengadakan acara hanya untuk orang baik saja. Bagaimana cara menyeleksi mana tamu yang baik dan tamu yang jahat ? Anda bisa menggunakan 2 pendekatan, whitelist atau blacklist.
- Whitelist. Pendekatan whitelist secara default akan menolak semua orang kecuali dia ada dalam daftar tamu (whitelist). Dalam pendekatan ini kita harus mempunyai daftar nama, ciri-ciri atau kriteria tamu yang baik.
- Blacklist. Pendekatan blacklist secara default akan menerima semua orang kecuali dia ada di dalam daftar terlarang (blacklist). Kebalikan dari whitelist, dalam pendekatan blacklist kita harus mempunyai daftar orang-orang yang dilarang masuk.
Dari sudut pandang security tentu lebih aman menggunakan whitelist karena defaultnya adalah “deny all”, sedangkan blacklist defaultnya adalah “allow all”.
Kapan kita memilih memakai whitelist/blacklist ? Salah satu kriterianya adalah berdasarkan jumlah/size dari whitelist/blacklist. Bila jumlah orang baik jauh lebih sedikit dari jumlah orang jahat, seperti dalam packet filtering firewall (deny all kecuali dari IP X.X.X.X) atau input validation (deny all kecuali inputnya hanya menggunakan digit 0-9), akan lebih aman dan sederhana menggunakan whitelist.
Namun bila jumlah orang baik jauh lebih banyak dari orang jahat, kita akan menggunakan blacklist. Dalam hal ini AV dan IDS (intrusion detection system) menggunakan blacklist karena jumlah program normal/baik diasumsikan jauh lebih banyak dari program yang malicious. Dengan mengikuti pendekatan ini AV harus selalu mengupdate blacklistnya mengikuti perkembangan malware, setiap ada malware baru yang belum ada di blacklist harus ditambahkan ke dalam blacklist.
Virus Signature
Kita tahu AV menggunakan pendekatan blacklist, namun pertanyaannya apa yang disimpan dalam blacklistnya itu. AV menyimpan signature malware dalam blacklistnya. Signature adalah ciri atau pola unik yang bisa dijadikan penanda keberadaan malware.
Signature ini bisa berupa string tertentu atau kumpulan instruksi yang diambil dari sample malware. Bila suatu file mengandung signature ini, maka AV akan mendeteksi file tersebut sebagai malware. Signature dalam file bisa dalam jumlah lebih dari satu dan berada di mana saja, bisa berada di awal file, di akhir atau di tengah.
Apakah ada file normal (bukan malware) yang “kebetulan” dalam filenya mengandung deretan byte yang sama dengan signature virus ? Itu mungkin saja terjadi dan hal itu disebut sebagai “false positive”. Hal sebaliknya, “false negative” juga mungkin terjadi bila signature/ciri khusus malware tersebut belum terdaftar dalam blacklist AV sehingga malware tersebut lolos dari deteksi AV. Dalam tulisan ini saya akan menunjukkan bagaimana meloloskan diri dari deteksi AV.
Seperti apa bentuk signature dalam AV ? Berikut adalah salah satu contoh signature yang diambil dari signature ClamAV (dari /var/clamav/daily.cld):
Format detail untuk ClamAV bisa dibaca di sini. Sekarang mari kita ambil satu contoh signature paling atas:
PUA.Win32.Packer.Expressor-29:1:*:e8530300008bf05656e8980300008bc8
- Nama malware: PUA.Win32.Packer.Expressor-29
- Jenis: 1 artinya Portable Executable, 32/64 Windows
- Offset: * artinya di posisi manapun dalam file
- Hex Signature: e8530300008bf05656e8980300008bc8 yang merupakan kumpulan instruksi assembly dalam hexa.
Jadi signature tersebut bisa dibaca sebagai:
Bila dalam file windows executable (PE file) ditemukan deretan byte “E85303….8BC8” di posisi manapun maka file tersebut diyakini mengandung malware PUA.Win32.Packer.Expressor-29. Dengan kata lain, bila suatu file windows executable mengandung instruksi “CALL DWORD 0x358, MOV ESI, EAX” dan seterusnya sampai “MOV ECX,EAX” maka file tersebut diyakini mengandung malware Expressor-29.
Static Analysis vs. Dynamic Analysis
Secara umum analisis terhadap suatu file untuk menentukan malicious atau tidak bisa dibagi menjadi 2 cara:
- Static analysis. Dalam static analysis AV akan memeriksa isi file byte demi byte tanpa mengeksekusinya. AV akan membaca isi file dan mencari deretan byte yang cocok dengan salah satu signature dalam blacklist yang dimiliki AV. Bila di dalamnya terkandung signature, maka AV akan yakin bahwa file tersebut adalah malicious.
- Dynamic analysis. Dalam dynamic analysis AV akan mengeksekusi malware tersebut. Lho ? Kalau malware sudah berhasil dieksekusi berarti game over dong? Memang cara ini sangat beresiko oleh karena itu harus dilakukan dalam virtual machine/sandbox yang diawasi dengan ketat.
Kelemahan dari static analysis adalah dia tidak mampu mendeteksi malware yang signaturenya belum terdaftar dalam blacklist. Kelemahan ini coba diatasi dengan dynamic analysis yang tidak hanya melihat signaturenya saja, namun juga mengeksekusi malware dalam sandbox dan melihat apakah program ini melakukan aktivitas yang tidak mungkin dilakukan oleh program baik-baik. Pendeteksian malware menggunakan dynamic analysis ini disebut juga teknik Heuristik.
Jadi sebenarnya bisa dikatakan dynamic analysis juga menggunakan signature, namun tidak statik berupa deretan byte, signaturenya berbasis behavior/aktivitas. Bila aktivitasnya setelah dieksekusi dalam sandbox terlihat mencurigakan berdasarkan signature behavior tadi maka AV akan mendeteksi file tersebut sebagai malware.
Metasploit Meterpreter vs. Antivirus
Mari kita mulai membuat malware yang lolos dari deteksi AV. Dalam contoh ini saya akan menggunakan Metasploit meterpreter bind TCP sebagai malwarenya. Meterpreter dikategorikan sebagai malware oleh semua AV, namun dalam contoh ini saya akan gunakan AVG.
Pertama kita akan membuat meterpreter.exe dengan msfpayload. Perhatikan saya tidak menggunakan msfencode untuk obfuscating/encoding, saya hanya menggunakan payload murni apa adanya.
Saya akan memastikan bahwa AVG saya adalah AVG dengan update terbaru (7 November 2013).
Agar tidak mengganggu, saya akan sementara mematikan resident shield. Nanti bila meterpreter yang lolos deteksi sudah selesai, saya akan menyalakan kembali untuk mengujinya.
Mendeteksi Posisi Signature
Sebelumnya kita coba scan dulu file meterpreter.exe yang masih original. Hasilnya adalah meterpreter.exe kita terdeteksi sebagai Win32/Heur.
Tentu di dalam file ini mengandung signature sehingga terdeteksi sebagai malware. Pertanyaannya adalah pada posisi/offset berapakah signature tersebut ? Kita perlu tahu di mana posisi offset yang mengandung signature karena dengan mengetahui posisi signature dengan tepat, kita bisa mengubah isi filenya di posisi tersebut agar tidak lagi cocok dengan signature AV.
Kita tidak tahu signature yang terdeteksi berada di posisi berapa antara 0 sampai 73802 (ukuran file meterpreter.exe). Bagaimana cara kita mencarinya ?
Kita akan melakukan dengan memecah file meterpreter.exe menjadi beberapa file dengan ukuran kelipatan dari suatu blok. Maksudnya bagaimana? Sebagai contoh kita akan memotong meterpreter.exe dengan panjang blok 10.000 byte. Maka hasil split akan memecah menjadi 8 file:
- File pertama berukuran 10.000 byte
- File kedua berukuran 20.000 byte (file pertama + 10.000 byte)
- File ketiga berukuran 30.000 byte (file kedua + 10.000 byte)
- File keempat berukuran 40.000 byte (file ketiga + 10.000 byte) dan seterusnya.
Saya membuat script python kecil untuk melakukan itu pydsplit.py yang sebenarnya adalah versi saya dari dsplit.exe.
Pada gambar di bawah ini terlihat pydsplit.py memotong mulai dari offset 0 sepanjang kelipatan 10.000 byte. File yang terbentuk adalah meterpreter_10000.exe berukuran 10.000, file meterpreter_20000.exe berukuran 20000 yaitu file pertama ditambah satu blok 10000 lagi, dan seterusnya.
Sesudah dipotong menjadi 8 file, kita scan semuanya dengan AVG.
Berikut adalah hasil scan yang diexpor ke bentuk Excel. Terlihat bahwa semua file terdeteksi sebagai malware. Ingat bila file yang berukuran 10.000 byte terdeteksi malware, file-file lain yang lebih besar juga pasti akan terdeteksi malware karena file-file tersebut juga mengandung file yang berukuran lebih kecil . Oleh karena itu kita akan mulai mencari signature dari file yang paling kecil dulu.
Karena file meterpreter_10000 terdeteksi sebagai malware, maka hasil ini menunjukkan bahwa ada signature di offset 0 s/d 10.000. Perhatikan kita sudah mempersempit posisi signature dari tadinya signature ada di offset 0 – 73802, sekarang dipersempit menjadi rentang offset 0 – 10.000.
Selanjutnya dengan cara yang sama kita akan melakukan split antara 0 s/d 10.000 dengan ukuran blok 1.000. Hasilnya adalah 10 file dengan ukuran 1000, 2000, 3000, 4000 s/d 10.000.
Selanjutnya kita scan juga dengan AVG untuk melihat mana di antara 10 file itu yang terdeteksi mengandung malware.
Berikut adalah hasil scan setelah diekspor ke Excel. Jangan kuatir dengan “Corrupted executable file” itu cara AVG untuk mengatakan file ini tidak mengandung malware dan namun dalam keadaan terpotong (tidak lengkap). Di antara 10 file hasil split ini ternyata file berukuran 7000 tidak terdeteksi malware, artinya pada posisi 0 – 7000 tidak mengandung signature.
Namun file berukuran 8000 dan 9000 dikenali sebagai malware oleh AVG artinya dalam file ini mengandung signature. Karena kita tahu file berukuran 7000 tidak mengandung signature, tapi file berukuran 8000 mengandung signature, berarti ada sesuatu antara 7000-8000 yang menimbulkan kecurigaan AV. Sesuatu itu adalah signature, dari hasil ini kita yakin bahwa ada signature yang berada di offset 7000 s/d 8000.
Hasil scan ini bisa digambarkan seperti gambar di bawah ini (icon tengkorak melambangkan signature yang dicari).
Kini sudah semakin sempit rentang posisi signature, tapi masih belum cukup. Kita perlu split lagi kali ini antara 7000 – 8000 dengan ukuran blok 100 byte. Karena ukuran blok 100 byte, maka akan terbentuk file berukuran 7100, 7200, 7300, 7400 s/d 8000.
Kita juga scan file-file hasil split ini dengan AVG.
Hasil scan menunjukkan bahwa file berukuran 7400 ke atas dikenali sebagai malware sedangkan file berukuran 7300 ke bawah tidak. Ini artinya sampai dengan offset ke 7300 tidak mengandung signature. Karena file berukuran 7400 dikenali sebagai malware, maka signature bisa dipastikan berada di posisi rentang 7300 – 7400.
Hasil scan ini bisa digambarkan dalam ilustrasi berikut.
Sekarang rentang signature semakin kecil lagi, hanya 100 byte saja. Kita lanjutkan melakukan split antara offset 7300-7400 dengan ukuran blok 10 byte. Hasil split akan menciptakan file baru berukuran 7310, 7320, 7330, 7340 s/d 7400.
Berikut adalah hasil scan file hasil split tersebut. AVG mendeteksi malware pada file berukuran 7370 ke atas. Karena file berukuran 7360 tidak mengandung signature, ini artinya signature berada pada posisi 7360 s/d 7370.
Hasil scan ini bisa diilustrasikan seperti gambar di bawah ini.
Sampai disini kita tahu signature berada di posisi 7360 – 7370. Namun kita perlu satu kali lagi melakukan split dengan ukuran blok 1 byte saja sehingga tercipta file berukuran 7361. 7362, 7363 s/d 7370.
Hasil Scan file menunjukkan file berukuran 7361 s/d 7369 tidak terdeteksi sebagai malware. Hal ini meyakinkan kita bahwa signature berada di offset 7370 karena file berukuran 7370 terdeteksi sebagai malware sedangkan 7369 tidak.
Modifikasi File Meterpreter
Setelah kita tahu pasti offset signature yang memicu AV mendeteksi malware pada posisi 7370, sekarang kita akan melihat dengan hex editor byte pada posisi tersebut. Pada posisi tersebut 7370 terdapat 0x75.
Kalau byte pada offset 7370 (0x75) dan satu atau beberapa byte sebelumnya kita “rusak” atau ganti dengan byte lain, maka seharusnya AV akan gagal mendeteksi malware karena signature yang tadinya ada disana kini sudah tidak ada lagi.
Namun sebelum kita menimpa byte signature tadi dengan byte lain untuk mengelabui AV. Pertanyaannya apakah pengubahan ini membuat meterpreter.exe menjadi corrupt/rusak ? Mari kita coba lihat dengan ollydbg.
Kita pasang jebakan breakpoint di 2 byte terakhir, EO 75 dan mulai menjalankan meterpreter. Ternyata setelah dieksekusi, meterpreter.exe bisa berjalan normal dan membuka session meterpreter dengan sempurna tanpa satu kali pun menginjak jebakan breakpoint kita.
Gambar berikut ini adalah eksploitasi meterpreter bind TCP. Eksploitasi ini dilakukan dalam keadaan meterpreter.exe dipasangi jebakan breakpoint. Eksploitasi berjalan sukses tanpa terhenti di breakpoint sama sekali.
Karena semua fungsi meterpreter jalan normal, tanpa sekalipun menginjak breakpoint, ini artinya instruksi pada posisi 7370 ini tidak berpengaruh pada jalannya program (menjadi semacam code cave / unreachable code).
Hasil ini meyakinkan kita untuk mengubah 2 byte terakhir 7369 dan 7370 menjadi byte 00 (null byte) tanpa perlu takut mengganggu/merusak program.
Setelah 2 byte pada posisi 7369 dan 7370 (E0-75) diubah menjadi 00-00, kita coba scan ulang meterpreter.exe. Hasil scan ulang menunjukkan kini AVG tidak lagi mendeteksi meterpreter.exe sebagai malware. Game Over, You Win!
Dengan hasil ini berarti kita telah berhasil menghindari deteksi AVG hanya dengan mengubah 2 byte menjadi null.
Sekarang kita aktifkan lagi resident shield di AVG karena disitu ada fitur “Use Heuristics”. Setelah itu kita coba double-click meterpreter.exe untuk mengeksekusinya, apakah bisa berjalan dengan sempurna tanpa hambatan dari AV ?
Setelah di double-click, ternyata eksekusi tetap berhasil walaupun opsi “Use heuristics” dan “Enable Resident Shield” diaktifkan, ini artinya AVG gagal total mendeteksi meterpreter kita. File meterpreter.exe yang sudah kita modifikasi 2 byte pada posisi 7369-7370 sekarang bisa dieksekusi secara lancar tanpa diblok oleh AV.
Terus terang saya agak kecewa juga melihat AVG begitu mudahnya ditipu hanya dengan mengubah 2 byte saja. Bahkan fitur Heuristic analisisnya pun tak berdaya dengan “obfuscation” sesederhana ini. Bagaimana dengan AV lain ? Saya harap lebih baik dari ini, mungkin di lain kesempatan saya akan bahas 🙂