Halo semuanya! Untuk mengantisipasi dimulainya aliran baru di kursus
teknik terbalik, kami berbagi dengan Anda terjemahan dari materi yang sangat menarik. Selamat membaca

Dua tahun terakhir bisa disebut tahun peretas ransomware. Ransomware, tanpa diragukan lagi, adalah jenis malware yang paling populer. Namun, pada akhir tahun-tahun terakhir, kami mulai mengamati penurunan popularitas mereka dan peningkatannya dalam mendukung penambang. Ada kemungkinan bahwa pada tahun 2018 tren ini hanya akan tumbuh.
Dari sudut pandang korban, ini melegakan, karena penambang tidak berbahaya seperti ransomware. Ya, mereka memperlambat sistem, tetapi begitu Anda menyingkirkannya, Anda dapat terus menggunakan komputer seperti sebelumnya. Data Anda tidak dicuri atau hilang, seperti halnya virus ransomware.
Dari perspektif peneliti malware, penambang mengecewakan. Mereka tidak menyediakan bahan baru yang cukup untuk analisis lebih dalam, terutama karena mereka didasarkan pada komponen open source yang terkenal dengan sedikit atau tanpa kebingungan atau siluman.
Namun, dari waktu ke waktu kami menemukan penambang menggunakan trik yang menarik. Kami baru-baru ini menyaksikan teknik yang disebut "Gerbang Surga," yang memungkinkan injeksi ke dalam proses 64-bit dari bootloader 32-bit. Gagasan ini bukan hal baru, implementasi pertamanya dimulai sejak 2009, tetapi menarik untuk melihat bagaimana penerapannya dalam bentuk baru, yang diperoleh langsung "dari alam."
Pemula dalam analisis virus dapat membaca panduan tentang apa itu Heaven's Gate dan bagaimana pendekatan analisisnya.
Bahan untuk analisis
Pola ini ditemukan dalam kelanjutan kampanye
Ngay (lebih lanjut tentang ini di
sini ). Memeriksa biografi sampel semacam itu membawa saya ke
artikel @_qaz_qaz , yang menggambarkan kampanye sebelumnya dengan sampel serupa. Namun, analisanya tidak mencakup teknologi Heaven's Gate.
Analisis perilaku
Untuk melihat injeksi yang disebutkan, kita harus menjalankan sampel pada sistem 64-bit. Kami melihat bahwa ia meluncurkan esensi notebook, dengan parameter khusus untuk penambangan cryptocurrency:

Melihat garis dalam memori di ProcessExplorer, kita melihat bahwa ini bukan notebook nyata, tetapi
penambang XMRig Monero .

Jadi, saat ini, kami yakin bahwa gambar notebook dalam memori kemungkinan besar digantikan oleh metode RunPE (Process Hollowing).
Dropper utama adalah 32-bit, tetapi menggeser payload ke notebook 64-bit:

Yang paling menarik, jenis injeksi ini tidak didukung oleh Windows API resmi. Kita dapat membaca / menulis ke memori proses 32-bit dari aplikasi 64-bit (menggunakan API WoW64), tetapi tidak sebaliknya.
Namun, ada beberapa solusi tidak resmi, seperti teknik yang disebut "Gerbang Surga."
Ulasan Gerbang Surga
Teknik The Heaven's Gate pertama kali dideskripsikan pada tahun 2009 oleh seorang hacker dengan nama panggilan Roy G. Biv. Kemudian, banyak implementasi yang dibuat, misalnya, perpustakaan
Wow64ext atau, berdasarkan itu,
W64oWoW64 . Dalam blognya pada tahun 2015, Alex Ionescu menggambarkan
langkah-langkah untuk memerangi teknik ini .
Mari kita lihat cara kerjanya.
Menjalankan proses 32-bit pada Windows 64-bit
Setiap proses 32-bit yang berjalan pada Windows versi 64-bit berjalan pada subsistem
WoW64 khusus yang mengemulasi lingkungan 32-bit. Anda dapat menggambar analogi dengan kotak pasir 32-bit yang dibuat di dalam proses 64-bit. Jadi pertama-tama, lingkungan proses 64-bit dibuat. Dan sudah ada di dalamnya lingkungan 32-bit dibuat. Aplikasi berjalan di lingkungan 32-bit ini, tetapi tidak memiliki akses ke bagian 64-bitnya.
Jika kita memindai proses 32-bit dari luar menggunakan pemindai 64-bit, kita akan melihat bahwa di dalamnya terdapat DLL 32 dan 64-bit. Yang paling penting, ia memiliki dua versi NTDLL: 32-bit (dimuat dari direktori SysWow64) dan 64-bit (dimuat dari direktori System32):

Namun, proses 32-bit itu sendiri tidak melihat bagian 64-bit dan terbatas untuk menggunakan DLL 32-bit. Untuk menyuntikkan ke dalam proses 64-bit, Anda harus menggunakan versi 64-bit dari fungsi yang sesuai.
Segmen kode
Untuk mendapatkan akses ke bagian lingkungan yang terbatas, kita perlu memahami bagaimana isolasi dilakukan. Ternyata semuanya cukup sederhana. Eksekusi kode 32-bit dan 64-bit tersedia melalui alamat segmen kode yang berbeda: 32-bit - 0x23 dan 64-bit - 0x33.
Jika kita memanggil alamat dengan cara biasa, maka mode yang digunakan untuk menafsirkannya diatur secara default. Namun, kami dapat secara eksplisit meminta perubahan menggunakan kode rakitan.
Di dalam penambang: implementasi Heaven's Gate
Saya tidak akan melakukan analisis lengkap tentang penambang ini, seperti yang telah dijelaskan di
sini . Ayo langsung ke tempat di mana kesenangan dimulai. Program jahat memeriksa lingkungannya, dan jika mendeteksi bahwa ia berjalan pada sistem 64-bit, ia menggunakan cara berbeda untuk menyuntikkan ke dalam proses 64-bit:

Setelah beberapa pemeriksaan anti-analisis, itu menciptakan proses 64-bit yang baru ditangguhkan (dalam hal ini, notepad):

Ini adalah target di mana beban jahat akan dilaksanakan.
Seperti yang telah kita pelajari sebelumnya, untuk menanamkan muatan ke dalam proses 64-bit, kita perlu menggunakan fungsi 64-bit yang sesuai.
Pertama, bootloader melewati pemrosesan NTDLL 64-bit:

Apa yang terjadi di dalam fungsi
get_ntdll
membutuhkan penjelasan yang lebih rinci. Sebagai penjelasan, kita juga dapat melihat
kode serupa di perpustakaan ReWolf.
Untuk mengakses bagian 64-bit dari lingkungan proses, kita perlu bekerja dengan pemilih segmen. Mari kita lihat bagaimana malware memasuki mode 64-bit.

Tampaknya kode ini disalin langsung dari perpustakaan terbuka:
https://github.com/rwfpl/rewolf-wow64ext/blob/master/src/internal.h#L26Selektor segmen 0x33 didorong ke tumpukan. Kemudian, malware memanggil baris berikut: (dengan cara ini, alamat baris berikutnya juga didorong ke stack.)

Alamat yang
retf
stack diperbaiki dengan menambahkan 5 byte dan ditetapkan setelah
retf
:

Pada akhirnya, pernyataan RETF dipanggil. RETF adalah "jauh kembali", dan tidak seperti RET biasa, itu memungkinkan Anda untuk menentukan tidak hanya alamat dari mana Anda ingin melanjutkan eksekusi, tetapi juga sebuah segmen. Sebagai argumen, dibutuhkan dua DWORD dari stack. Dengan demikian, ketika RETF dijalankan, alamat pengirim kembali menjadi:
0x33: 0x402A50Berkat segmen yang diubah, kode mulai dari alamat yang ditentukan ditafsirkan sebagai 64-bit. Jadi kode yang dilihat oleh debugger adalah 32-bit ...

... sebenarnya 64-bit.
Untuk beralih tampilan dengan cepat, saya menggunakan fungsi PE-bear:

Dan inilah bagian dari kode ini jika ditafsirkan sebagai 64-bit:

Dengan demikian, kode yang dieksekusi di sini bertanggung jawab untuk memindahkan isi register R12 ke variabel di stack, dan kemudian beralih kembali ke mode 32-bit. Ini dilakukan untuk mendapatkan
Blok Informasi Blok 64-bit
(TEB) , dari mana kami mendapatkan
Blok Lingkungan Proses (PEB) 64-bit
dari sini - kami melihat
kode yang sama .
64-bit PEB digunakan sebagai titik awal untuk menemukan versi 64-bit NTDLL. Bagian ini diimplementasikan dengan sangat
sepele (implementasi "vanilla" dari metode ini dapat ditemukan di
sini ), menggunakan pointer ke pustaka yang dimuat, yang merupakan salah satu bidang dalam struktur PEB. Jadi, dari PEB kita mendapatkan bidang bernama
Ldr :
Ldr adalah struktur tipe
_PEB_LDR_DATA
. Ini berisi entri yang disebut
InMemoryOrderModuleList
:

Daftar ini berisi semua pustaka yang dimuat yang ada dalam memori proses yang sedang dipelajari. Kami memeriksa daftar sampai kami menemukan perpustakaan yang kami minati, dalam kasus kami adalah NTDLL. Inilah yang
get_ntdll
fungsi
get_ntdll
atas. Untuk menemukan nama yang cocok, ia memanggil fungsi berikut, yang ditunjuk sebagai
is_ntdll_lib
, yang memeriksa nama perpustakaan terhadap ntdll.dll menurut karakter. Setara
dengan kode
ini ternyata.

Jika nama-nama cocok, maka alamat perpustakaan dikembalikan ke beberapa register:

Setelah kami menemukan NTDLL, kami hanya perlu mendapatkan alamat dari fungsi yang sesuai. Kita dapat melakukan ini dengan melihat tabel ekspor perpustakaan:

Fungsi-fungsi berikut diambil:
- NttUnmapViewOfSection
- NtGetContextThread
- NtAllocateVirtualMemory
- NtReadVirtualMemory
- NtWriteVirtualMemory
- NtSetContextThread.
Seperti yang kita ketahui, fungsi-fungsi ini adalah khas dari teknik RunPE. Pertama, NtUnmapViewOfSection digunakan untuk menghapus peta file PE asli. Kemudian, dalam proses jarak jauh, memori dialokasikan dan PE baru ditulis. Pada akhirnya, konteks proses diubah sehingga eksekusi dimulai dari modul tertanam.
Alamat fungsi disimpan dan kemudian dipanggil (mirip dengan kode
ini ) untuk mengontrol proses jarak jauh.
Kesimpulan
Sampai sekarang, para penulis penambang belum menunjukkan banyak kreativitas. Mereka mencapai tujuan mereka dengan mengandalkan komponen open source. Kasus yang dijelaskan dengan baik mencerminkan tren ini, karena implementasi yang sudah jadi digunakan.
Gerbang Surga telah ada selama beberapa tahun. Beberapa program jahat menggunakannya untuk meningkatkan
sembunyi-sembunyi . Tetapi dalam kasus penambang ini, penulis mungkin berusaha lebih memaksimalkan kinerja dengan menggunakan payload yang paling sesuai dengan arsitektur target.
Itu saja. Anda dapat mengetahui lebih lanjut tentang kursus kami di
sini .