DEFCON Conference 17. Tertawalah pada virus Anda! Bagian 1

Michael: Saya menyambut semua orang, saya Michael Lai, ini Matthew Richard, Anda bisa memanggilnya Matt atau Richard, karena ia memiliki dua nama, tetapi itu tidak masalah.

Matt: Topik pembicaraan kami hari ini adalah cemoohan terhadap malware, dan itulah tepatnya yang kami coba lakukan.



Jadi, tidak semua orang yang menulis kode melakukannya dengan baik, orang membuat banyak kesalahan. Dan tidak semua orang yang menggunakan virus melakukannya dengan benar. Ada juga orang yang gagal dalam kedua kasus ini. Jadi duduklah dengan lebih nyaman, rileks dan dengarkan, mungkin informasi ini akan bermanfaat bagi Anda.

Untuk jaga-jaga, kami menyertakan materi teknis faktual dalam presentasi sehingga Anda setidaknya belajar sesuatu jika percakapan itu tidak lucu bagi Anda. Saya perhatikan bahwa ini hanya pendapat kami, yang mungkin tidak sesuai dengan pendapat majikan kami.

Michael: Kisah pertama disebut "Sayang, aku mengurangi entropi!" Dia berbicara tentang bagaimana penulis Silent Banker, sebuah algoritma enkripsi yang sangat kompleks, lupa membuat entropi menggunakan PRNG - generator angka acak semu. Pada slide, Anda melihat cuplikan kode Zeus September 2007 di mana PRNG digunakan untuk mencegah deteksi berbasis hash. Generasi terdiri dalam menginisiasi variabel global ini yang disebut ddTickCount: pertama, ia menempatkannya dalam register EAX, dari mana fungsi dipanggil untuk pertama kalinya. Kemudian diperiksa apakah nilai fungsi sama dengan nol, dan jika tidak sama, maka TickCount dipanggil untuk menghasilkan SEED, yaitu, untuk memulai nomor pseudo-acak, menggunakan perintah GetTickCount.



Kami tidak terkejut ketika kami melihat kesamaan dengan kode ini dalam file biner Silent Banker dari Februari 2008. Ini menggunakan PRNG untuk menghasilkan nama file sementara. Di sini, juga, ada variabel global yang sama ddTickCount, yang memeriksa apakah ada nol, dan jika ya, maka nomor pseudo-acak dimulai menggunakan GetTickCount. Pertama, sebelum saya melihat msvsrt rand, generator angka pseudo-acak yang digunakan oleh fungsi rand () dari perpustakaan Microsoft C Runtime Windows, saya berpikir bahwa ada koneksi antara penulis Zeus dan penulis Silent Banker, hanya berdasarkan pada nomor HEX yang di-hard-coded ke dalam file biner . Tetapi pada kenyataannya, mereka berdua hanya terhubung secara statis ke msvsrt.

Sekarang kita sampai pada resep untuk bencana. Ini adalah cuplikan kode dari versi Silent Banker Juli 2008, dirilis beberapa bulan setelah versi Februari.



Mereka memperbarui kode mereka dan memposting versi baru Silent Banker, yang sangat berbeda dari yang kami lihat sebelumnya. Dalam program ini, PRNG digunakan untuk menghasilkan kunci enkripsi. Di sini Anda tidak lagi melihat bahwa variabel global yang disebut CurrentSeed diperiksa untuk kesetaraan ke nol dan nomor pseudo-acak dihasilkan tergantung pada ini, itu hanya digunakan dalam kode ini.



Ada kemungkinan bahwa di suatu tempat dalam file biner, bahkan sebelum tempat ini, nilai variabel global ini dihasilkan dalam bentuk beberapa jenis angka. Jadi saya beralih ke pembongkaran kode ini dan melihat apakah nilai CurrentSeed digunakan di tempat lain dalam program sebelum digunakan dalam fungsi rand () ini. Anda melihat bahwa awalnya dd dimulai dari awal, dan kami akan memeriksa referensi silang ke variabel ini.



Di kolom T, nilai w berarti bahwa hanya ada satu operasi yang valid untuk variabel global ini di seluruh file biner - ini adalah fungsi rand itu sendiri. Saya akan membahas hal-hal ini dengan lancar karena mereka sudah disebutkan di DefCon tahun lalu. Pada slide "Resep untuk Bencana", baris Seed the PRNG, atau "Initiation of a Random Number Generator", ditampilkan dalam warna abu-abu untuk menunjukkan bahwa penulis Silent Banker tidak melakukan inisiasi ini.



Langkah selanjutnya adalah mereka menghasilkan kunci 16 byte, membuat 1.000 panggilan sistem ke fungsi MyRand (). Kemudian, dari kunci 16-byte, mereka menghasilkan angka 8-byte - kunci, menggunakan rumus tertentu.

Setelah itu, mereka menghasilkan nomor 8-byte lain untuk membuat kunci sekunder dari nomor 8-byte pertama, menambahkan nilai sewenang-wenang dari file konfigurasi INI dan mendapatkan kunci tersier, yang juga merupakan nomor 8-byte. Akhirnya, mereka menggunakan fungsi matematika presisi arbitrer untuk mengubah kunci 8 byte menjadi 32 byte.

Setelah itu, mereka mengenkripsi data yang dicuri seperti kata sandi pengguna menggunakan kunci 16-byte asli. Tetapi mereka tidak memberikan nomor byte "16" ini kepada penyerang "mereka" dengan data yang dicuri, karena mengirim kunci bersama dengan pesan terenkripsi bukanlah ide yang baik. Sebagai gantinya, penulis Silent Banker menempatkan nomor 32 byte di dalam data yang dicuri dan mengirimkannya ke penerima, yang seharusnya memiliki program yang mengubah nomor itu kembali ke kunci asli 16-byte. Namun, kami tidak memiliki program ini!

Slide berikutnya menunjukkan resep bagaimana menggunakan bencana ini dengan nomor 1 - kurangnya generator PRNG - untuk keuntungan Anda.



Untuk mulai dengan, kami menyamakan nilai PRNG ke nol. Kita dapat mengotomatiskan empat langkah berikutnya menggunakan skrip Python untuk debugger, karena kami memiliki rumus yang menghitung kunci 16 byte, kunci 8 byte, kunci 8 byte berikutnya, dan kunci 32 byte. Rumus ini tidak dalam kode C, tetapi kami memilikinya karena kami memiliki salinan file biner Silent Banker di mana ia ada.

Saya akan menunjukkan kepada Anda demo cara kerja skrip Python ini. Kami memiliki skenario yang baik: di sini saya memiliki Silent Banker dan debugger independen yang saya lampirkan, serta Internet Explorer, di mana Silent Banker berjalan. Saya mencatat empat fitur yang menghasilkan kunci enkripsi. Saya menyertakan skrip Python ini yang ditampilkan di slide sebelumnya, yang saya panggil dengan perintah bang keygen. Anda dapat melihat bahwa debugger hanya "kehilangan" beberapa fungsi yang ingin saya lakukan untuk demo ini 5 kali. Namun dalam kehidupan nyata, kami melakukan tindakan ini 5.000 kali untuk mendapatkan satu set kunci yang lebih besar.

Pada panel log, Anda dapat melihat bahwa untuk setiap iterasi loop, kunci 16-byte utama adalah output, yang kemudian dikaitkan dengan kunci 32-byte. Pada saat yang sama dengan skrip mencetak informasi dalam log, file teks juga dibuat pada disk, yang mencakup pasangan kunci terkait 16 dan 32 byte. Ini hanya file HEX heksadesimal, sehingga kita dapat menggunakan skrip Python untuk memproses file ini, kami juga memiliki direktori log yang kami pulihkan dari node perintah-dan-kontrol yang dicuri.



Di bagian atas Anda melihat beberapa sertifikat kunci pribadi terenkripsi, dan di bawahnya adalah beberapa file teks yang berisi data terenkripsi. Kita cukup menjalankan program dan mencari di dalam file teks ini dengan mengekstrak kunci 32-byte dan kunci asli 16-byte yang terkait dengannya.

Segera setelah program menemukan kunci 16-byte, program ini mendekripsi informasi yang terkandung di dalamnya dan menyajikannya dalam bentuk file teks. Anda melihat file ini di layar, dan tidak mungkin membacanya.



Tetapi kemudian kita memiliki banyak file sementara .tmp yang dapat dibaca, dari mana kita dapat memperoleh informasi ini dan mengembalikannya ke pemilik yang "berhak". Jadi semua kerja keras untuk melindungi informasi dilakukan oleh Silent Banker sia-sia karena mereka lupa untuk memulai generator nomor pseudo-acak.



Sekarang saya akan menunjukkan bagian terbaik di atas - ini adalah fungsi Silent Banker, yang saya sebut Why_Not_Use_This (Mengapa tidak menggunakannya?).



Bahkan, di dalam program mereka sendiri, mereka memiliki fungsi GetCursorPos (menentukan posisi kursor) untuk menghasilkan entropi, yang dapat digunakan untuk memulai PRNG, dan kami dapat memeriksa referensi silang ke fungsi ini di dalam program.



Kami melihat bahwa ini digunakan di 10-15 tempat lain dalam kode. Dengan demikian, ternyata penulis Silent Banker tidak lupa untuk memasukkan generator nomor pseudo-acak ke dalam program, mereka hanya lupa untuk menjalankan fungsi ini dalam proses enkripsi menggunakan operator panggilan.



Slide berikutnya disebut "Itu menyelinap pergi ..." dan itu menunjukkan bagaimana program ini akan bekerja jika penulis tidak melupakan apa pun.



Kisah selanjutnya, berjudul "DES atau bukan DES," adalah tentang pembuat malware yang bahkan tidak tahu cara menggunakan antarmuka pemrograman Windows dengan benar atau tidak tahu apa ukuran kunci DES maksimum. Akibatnya, karena ukuran kunci ini tidak valid, Trojan-nya digunakan secara default dengan xor operator logis.

Jadi, untuk fungsi antarmuka program CryptDeriveKey, dua byte rendah dari parameter dwFlags, tanda yang mengatur bagaimana URL yang dihasilkan akan terlihat, menentukan ukuran kunci enkripsi Anda.



Jadi, jika byte rendah adalah 0080, maka kunci enkripsi yang kami minta akan menjadi kunci RC4 128-bit. Itu sama dengan menembak diri sendiri di kaki, dan saya akan tunjukkan alasannya.



Pada slide, Anda melihat garis dengan ukuran yang salah dari kunci dwFlags 128-bit - 800000 dan garis dengan nilai MSCryptoAPI yang salah. Saya akan menunjukkan kepada Anda pembongkaran hal ini. Anda melihat fungsi yang disebut "menginisialisasi subsistem enkripsi": trojan memanggil konteks terenkripsi dan kemudian membuat wadah untuk hash MD5, kemudian membuat hash MD5 dari kata sandi hard-coded dalam file biner dan mencoba menggunakan output dari fungsi hash ini untuk membuat kunci DES 128-bit. Namun, tidak ada kunci yang dibuat dalam kasus ini, karena tidak ada yang namanya kunci DES 128-bit.



Jika salah satu dari fungsi-fungsi API ini gagal, ia melompat ke tempat ini, yang saya tandai dengan warna kuning, dan menampilkan pesan bahwa kunci tidak dapat diterima. Dan tempat ini ada di sini, di mana ia memindahkan nilai yang ada di ebp dan pada waktu itu adalah 0, yaitu, langsung ke nilai boolean ini, BseMCryptoAPI.

Mari kita lihat apa akibatnya selama eksekusi program. Kami akan mengikuti elemen struktur kode ini untuk melihat di mana lagi ia digunakan dalam program dan bagaimana perbedaan tampilan trojan ini ketika fungsinya benar dan ketika luka salah.



Kita melihat bahwa nilai logis diperiksa dalam fungsi yang saya sebut data enkripsi, "enkripsi data", dan jika itu benar, ia datang ke blok ini, di mana enkripsi DES dan CryptEncrypt MSAPI digunakan.



Namun, jika nilai ini adalah 0, dan seperti yang kita tahu, itu akan selalu nol awal, fungsinya pergi ke blok ini, yang secara default adalah xor.



Saya ingin tahu pada titik waktu mana penulis program jahat memutuskan untuk membuat cadangan semua ini. Mungkin orang mendorongnya dari atas, jadi dia terpaksa menyingkirkan malware, tetapi pada menit terakhir dia menyadari bahwa DES-nya tidak berfungsi, jadi dia menggunakan xor untuk merekam cadangan. Secara keseluruhan, itu sangat lucu, jadi moral dari cerita ini adalah untuk selalu membuat cadangan!

Kisah berikut disebut "Apa yang telah Anda lakukan dengan apa?". Saya mencoba untuk datang dengan istilah yang menggambarkan bagaimana enkripsi Trojan Coreflood bekerja, dan memutuskan untuk menyebutnya "enkripsi tergantung lokasi". Singkatnya, penulis trojan ini menemukan metode enkripsi baru. Saya pikir, mungkin seseorang sudah menulis artikel tentang ini dan seharusnya "google"? Google memberi saya tautan ke situs paten AS tempat seseorang mengajukan paten untuk "enkripsi bergantung lokasi". Skema ini cukup membingungkan, sehingga akan membutuhkan banyak waktu untuk mempelajarinya. Begini cara kerjanya: Saya mengirimi Anda pesan terenkripsi, dan untuk mendekripsi dan membacanya, Anda perlu mengambil perangkat GPS dan menuju ke suatu titik dengan garis lintang dan bujur yang ditunjukkan oleh saya. Biasanya, enkripsi adalah kompromi antara keamanan dan kegunaan, tetapi tidak ada satu atau yang lain dalam metode ini.



Ini jelas tidak aman dan mengharuskan Anda pergi ke tempat pengirim menunjuk untuk membaca pesan. Matt bergurau bahwa jika Anda berkelahi secara online melalui email dan benar-benar ingin menyingkirkan seseorang, kirimkan pesan terenkripsi yang dapat ia baca di suatu tempat di Irak, dan Anda tidak akan lagi memiliki masalah dengannya.

Bagaimana metode ini digunakan dalam trojan Coreflood? Slide ini memperlihatkan sebuah fragmen kode yang darinya setelah trojan mencuri informasi pengguna, ia mengenkripsi dan menulisnya ke disk sehingga trojan nanti dapat menerima informasi ini dan mengunggah perintah-dan-kontrol ke situs webnya.

Fungsi ini disebut SetFilePointer (mengatur penunjuk file), dan nilai kembalinya adalah dWord, menunjukkan offset dalam file yang ditetapkan penunjuknya jika dilampaui. Selanjutnya, fungsi ini mengambil jumlah byte untuk mengenkripsi nNumberOfBitesToWrite dan memindahkannya ke register ecx. Dia kemudian mengambil pointer data untuk enkripsi dan memindahkannya ke register edx.



Setelah itu, operator xor digunakan, yang menempatkan setiap byte dalam buffer al dan ah, yang berarti byte level rendah dan tinggi dikembalikan dari SetFilePointer. Dengan demikian, kunci enkripsi dalam skema ini adalah offset dalam file tempat data ada. Ini luar biasa!

Slide berikutnya disebut "Cara mengatur ulang dump inti." Ini menggambarkan program dumpCore yang baru saja saya tulis, yang baru saja keluar. Anda dapat mengunduhnya, ada semua kode sumbernya. Program ini akan membantu Anda jika komputer terinfeksi dengan virus Coreflood, yang karena alasan tertentu tidak bisa sampai ke server perintah-dan-kontrol untuk mengunduh data yang dicuri. Jadi Anda bisa mendapatkan file-file ini yang disimpannya di disk dan mendekripsi menggunakan program saya untuk mencari tahu apa yang dicuri dari Anda, misalnya, jika Anda perlu memberi tahu klien tentang hal itu.

Log data yang dicuri dilingkari merah pada slide.



Apa yang masih menarik di Coreflood: walaupun memiliki algoritma enkripsi yang agak lemah, Coreflood masih mencoba untuk mentransfer semua informasi yang dicuri tentang konfigurasi komputer korban, semua informasi target dari bank dan serikat kredit, dan sebagainya. Jadi cara lain untuk menghapus dump inti disebut "Bagaimana menghapus dump inti menggunakan Wireshark." Wireshark adalah program yang menganalisis lalu lintas jaringan Ethernet, atau aliran data TCP.



Slide berikut menunjukkan cara kerja Coreflood. Ini adalah dll yang dimasukkan ke dalam Explorer dan Internet Explorer. Mereka memodifikasi registri, memerlukan restart aplikasi, tetapi tidak memerlukan reboot sistem. Ada berbagai cara untuk menyuntikkan dll ini ke dalam suatu proses.



Penting bagi peretas yang ingin menyerang virus tanpa disadari adalah bagaimana virus masuk ke komputer pengguna: apakah itu memerlukan sistem reboot agar malware memiliki efek, atau cukup bagi pengguna untuk hanya me-restart aplikasi, dalam hal ini Explorer.

Dan sekarang tenang sehingga tidak ada yang bisa mendengar!



Ini adalah kode yang kami merekonstruksi menggunakan teknik terbalik. Ini menunjukkan bagaimana Coreflood secara manual mematikan Explorer sehingga perubahan segera berlaku. Anda mungkin akrab dengan apa yang terjadi ketika Explorer gagal di komputer - bilah tugas menghilang, semua jendela aplikasi yang terbuka, semua ikon di desktop menghilang, dan kemudian satu per satu mereka mulai kembali ke tempatnya.

Para penulis Coreflood jelas tahu tentang ini, jadi mereka menempatkan panggilan sistem di tempat ini untuk mengatur mode kesalahan "benar" dari konduktor tepat sebelum panggilan OpenProcess.

Apa fungsi fungsi SetErrorMode? Ini mencegah kegagalan spesifik dari pemberitahuan yang dikirim ke sistem yang membuat jendela sembul kecil dan mengirim pesan kesalahan yang menyebabkan aplikasi berhenti. Yang mereka lakukan dengan pesan kesalahan ini adalah untuk mencegah jendela pop-up muncul kepada pengguna sebelum Explorer gagal. Beri tahu saya apa yang tampak lebih mencurigakan bagi pengguna: jendela sembulan kecil yang disertai dengan lenyapnya segala sesuatu yang muncul di layar dan kemudian muncul kembali, atau hilangnya dan penampilan segala sesuatu tanpa pesan kesalahan? Saya mendengar Anda berkata: "kedua acara."

Slide berikutnya saya sebut "Dengan tangan dan kaki, tetapi tanpa kepala." Coreflood, ketika dimuat sebagai dll, tidak muncul dalam daftar modul yang dimuat. Dia mengalokasikan sedikit memori pada heap dan menyalin dirinya ke tempat heap ini - saya meletakkannya di bingkai merah.



Lalu dia menghapus header PE-nya, jadi jika Anda bertemu komputer yang terinfeksi trojan ini, maka katakan: "langkah saya selanjutnya adalah membuang file yang dapat dieksekusi ini dan mengunggahnya ke IDA untuk dianalisis", tetapi sangat sulit untuk membuang file yang dapat dieksekusi, jika tidak ada header PE-nya. Jadi, ketika Coreflood memanggil alokasi virtual, ia menentukan flag mem dari atas ke bawah, yang menyebabkan sistem mengembalikan alamat tertinggi, bukan terendah, yang tersedia. Hal ini memungkinkan trojan untuk menyembunyikan tanda kutip pembukaan / penutupan di area memori yang lebih tinggi dari mode pengguna di antara dll sistem lainnya. Oleh karena itu, demo berikutnya saya panggil "Cara membuat semua yang tidak berguna menjadi tersembunyi."



Ketika Anda menemukan sesuatu seperti Coreflood yang menggunakan stealth, dan tidak ada alat yang siap pakai untuk bekerja dengan virus semacam itu, Anda harus membuatnya sendiri.
Jika Anda terbiasa membongkar, maka menggunakan debugger adalah hal yang umum untuk Anda. Terutama jika tidak ada pembongkar otomatis, karena ini bukan algoritma yang umum. Dalam hal ini, Anda bisa menggunakan debugger untuk pergi ke titik entri asli dan kemudian menghapus dump Trojan menggunakan ProcDump atau utilitas lain. PE Import Reconstructor, , , .

, . . Volatility, Internet Explorer . , Coreflood, , . , 7FF81000.



, HEX , Coreflood. , , . .

, , Coreflood, Volatility . , ID Internet Explorer. , , PID 1732. Malfind, , , , . VAD , , . , .



, , 7FF81000. , Fix IAT, PID 1732 Internet Explorer , Coreflood.

dll, Internet Explorer, , RBA , , .

, 7FF81000, , . , PE . , Import Reconstructor: , , . Fix IAT , PE modify viewer , .



21:15

DEFCON 17. ! Bagian 2


Terima kasih telah tinggal bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikannya kepada teman-teman Anda, diskon 30% untuk pengguna Habr pada analog unik dari server entry-level yang kami temukan untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps dari $ 20 atau bagaimana membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps hingga Desember secara gratis ketika membayar untuk jangka waktu enam bulan, Anda dapat memesan di sini .

Dell R730xd 2 kali lebih murah? Hanya kami yang memiliki 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV dari $ 249 di Belanda dan Amerika Serikat! Baca tentang Cara Membangun Infrastruktur Bldg. kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?

Source: https://habr.com/ru/post/id428858/


All Articles