Dengan menerbitkan ini, saya menyadari bahwa metode ini mungkin tidak berfungsi lagi. Bahkan, saya telah mengunggahnya ke VirusTotal.com.Saya tidak berniat menggunakannya di alam liar, jadi dengan menerbitkannya ke publik, semoga bermanfaat bagi mereka yang ingin mempelajari lebih lanjut tentang virus dan cara menerobos perangkat lunak antivirus.
Metode ini tidak dapat dideteksi oleh Kaspersky Anti-Virus 2014. Basis data diperbarui sepenuhnya selama pengujian.
Selama Kursus Cracking the Perimeter dari Offensive Security, saya ditugaskan untuk menerobos Kaspersky AV menggunakan Netcat-X99 (ncx99.exe), versi netcat yang mendengarkan port 99. Saya tidak dapat melakukannya saat itu, tetapi dengan sekitar 4 jam kerja hari ini, saya akhirnya dapat melewati Kaspersky. Bagian terbaiknya adalah ini jauh lebih sederhana daripada yang saya kira sebelumnya. Prosesnya adalah sebagai berikut:
- Pisahkan biner menjadi beberapa bagian untuk menemukan di mana Kaspersky “menandai” netcat (tanda tangan).
- Tingkatkan ukuran biner agar memiliki cukup ruang untuk kode.
- Ubah alur eksekusi.
- Enkode bagian yang ditandai menggunakan enkoder khusus.
- Tambahkan rintisan decoding.
- Melompat ke kode membawa kita keluar dari sandbox
- Jalankan kode yang mengalahkan sandbox.
- Lompat ke titik masuk asli dan jalankan kode seperti biasa.
Langkah 1 mudah:
unduh pemisah file dan pindai setiap bagian. Setelah beberapa kali mengutak-atik, saya menemukan bahwa 17 KB pertama adalah bagian yang bertanggung jawab untuk membuat Kaspersky menjadi gila. Dalam biner ncx99.exe, ini berasal dari alamat 0x00401000 hingga 0x0040502C. Langkah 2 langsung saja. Pertama, Anda menggunakan editor header PE seperti LordPE untuk menambahkan bagian baru di akhir yang dapat dieksekusi. Saya menambahkan 1000h di akhir. Setelah ini selesai, beberapa byte data 1000h ekstra perlu ditambahkan ke file sehingga header konsisten dengan komposisi yang dapat dieksekusi (jika tidak, yang dapat dieksekusi tidak akan berjalan… Windows akan mengeluarkan kesalahan yang mengatakan bahwa biner tidak valid). Untuk mengubah aliran eksekusi, kami kembali menggunakan sesuatu seperti LordPE. Titik masuk asli untuk ncx99.exeada di 0x00404C00.
Just take the EntryPoint + ImageBase = 0x00404C00 |
Di akhir ncx99.exe, kita memiliki cukup ruang untuk menambahkan encoder biner lalu menggantinya dengan decoder:
Encoder yang saya gunakan melakukan hal yang sebaliknya: SUB 12, XOR 2E, dan ADD 20. Inti dari encoder ini adalah untuk menyembunyikan tanda tangan dari pemindaian statis yang mungkin dilakukan Kaspersky. Saya tidak yakin apakah Kaspersky pernah melakukan hal itu pada ncx99.exe, tetapi ini hanya untuk berjaga-jaga. Melompat ke kode yang membawa kita keluar dari kotak pasir dapat dilihat pada gambar di atas (JMP ncx90-hi.00413000). Ingatkah Anda ketika kita menambahkan 1000 byte kode di akhir ncx99.exe?Di sanalah kode kita ditambahkan. Di akhir dekoder kita, kita cukup melompat ke sana. Bagaimana kita mengalahkan sandbox? Nah, Kaspersky tidak bisa hanya duduk diam dan memantau setiap bit kode yang dieksekusi oleh setiap berkas biner karena hal itu akan terus membebani sistem dengan analisis dan pemeriksaan. Saya tidak yakin bagaimana cara kerja mesin heuristik Kaspersky, tetapi saya dapat membuat dua asumsi cepat:
- Akhirnya waktu habis setelah cukup banyak kode yang dieksekusi sehingga Kaspersky menganggap biner tersebut tidak berbahaya.
- Cerdas namun dengan cara yang bodoh.
Dengan nomor 2, yang saya maksud adalah ini: Kaspersky mungkin tidak akan tertipu oleh sesuatu yang sederhana seperti memanggil sleep(), tetapi ia dapat tertipu karena memorinya pendek. Berikut ini yang saya lakukan untuk melewati sandbox:
Jika Anda perhatikan dengan saksama, Anda akan melihat bahwa setiap kotak merah adalah kode yang sama persis yang dilakukan sebanyak 5 kali. Tujuannya adalah untuk membuatnya tampak seperti sesuatu yang berguna dan tidak berbahaya sedang terjadi, sekaligus memberi cukup waktu untuk keluar dari sandbox. Di masa lalu saya telah mencoba sesuatu yang serupa dan gagal: nested loop. Saya yakin nested loop gagal karena Kaspersky menganggapnya sebagai pembunuh waktu yang umum. Yang ini berhasil. Di suatu tempat di NOP-sled saya telah menambahkan JMP ke titik masuk program asli sehingga biner kita dapat dijalankan setelah kita meninggalkan sandbox.
Anda dapat melihat pada gambar tangkapan layar berikut bahwa saya memiliki koneksi bindshell dan Kaspersky tidak peduli sama sekali:
Setelah saya menulis ini, saya mengunggahnya ke VirusTotal.com (saya tahu… saya tahu. Tapi saya tidak berniat menggunakan ini). Skor yang saya terima adalah 19/48. Tujuannya bukan untuk mencapai 0/48, tetapi untuk melewati Kaspersky… salah satu yang paling sulit untuk diatasi.Jika ada yang punya pertanyaan, silakan berkomentar di bawah dan saya akan mencoba menjawabnya sesegera mungkin