Studi tentang satu berbahaya

gambar

Saya menemukan file doc baru-baru ini berbahaya yang dikirim dengan email phishing. Saya memutuskan bahwa ini adalah alasan yang bagus untuk mempraktikkan teknik reverse dan menulis sesuatu yang baru di Habr. Di bawah kucing - contoh parsing penetes makro berbahaya dan dll tidak kurang berbahaya.

Makro


Sha256 dari file - abb052d9b0660f90bcf5fc394db0e16d6edd29f41224f8053ed90a4b8ef1b519 . Dalam file doc itu sendiri, pada halaman pertama ada gambar yang memberitahukan bahwa file ini dilindungi dan menjelaskan cara mengaktifkan makro, ada dua tabel besar dengan angka dalam file. Bilangan ditulis dalam bentuk desimal, terpanjang sepuluh digit, ada positif dan negatif.

Ketika korban mengizinkan eksekusi makro (ada yang mengaktifkannya secara default?), Serangkaian tindakan diluncurkan, yang akhirnya menjalankan fungsi updatedb_network, yang mengubah direktori saat ini menjadi yang sementara dan membuat file "icutils.dll" di dalamnya, di mana ia menuliskan angka-angka dari tabel pertama berturut-turut sebagai integer 32 bit dengan tanda. Hasilnya adalah dll yang benar. Fungsi klon diimpor dari dll ini :

Declare PtrSafe Function clone Lib "icutils.dll" _
(ByVal Saved As String, ByVal Time As Integer) As Boolean

Dan itu dimulai dengan dua parameter:

R1 = Module1.clone("Cream", 0)

Jika panggilan klon mengembalikan False, file icutils.dll ditimpa dengan data dari tabel kedua dan klon dipanggil lagi dengan parameter yang sama.

Ke depan, saya akan mengatakan bahwa dll pertama adalah 64 bit dan tidak akan berjalan pada sistem 32 bit. Dengan demikian, makro memilih arsitektur kode biner yang benar.

Menariknya, fungsi updatedb_network memiliki sepotong kode yang tidak memiliki tujuan fungsional:

Sub updatedb_network()
...
Dim query_to_change As Variant
    Set query_to_change = CurrentDb.QueryDefs("query_name")
    
    query_to_change.SQL = "SELECT * FROM Table ORDER BY ID Asc"
    query_to_change.SQL = "SELECT Field1, Field2 FROM Table ORDER BY ID Asc"
    query_to_change.SQL = "SELECT Field1, Field2 FROM Table WHERE Field LIKE Fashion"
    query_to_change.SQL = "SELECT Field1, Field2 FROM Table WHERE Field LIKE '" & something & "'"
...
End Sub

Mungkin dia ada di sini untuk memberikan tampilan pekerjaan yang bermanfaat bagi mereka yang dengan cepat membalik kode, melihat beberapa baris dalam SQL dan berpikir bahwa semuanya baik-baik saja? Saya tidak tahu. Juga, sebagian besar fungsi dan variabel memiliki nama acak atau tidak-nyata (misalnya, updatedb_network , yang tidak berinteraksi dengan database atau jaringan). Meskipun ada, misalnya, fungsi dump_payload , yang menyimpan 4 byte di icutil.dll. Tetapi bagaimanapun juga, keberadaan fungsi Document_Open harus segera diperingatkan , pembuat malware tidak dapat mengubah namanya secara sewenang-wenang (meskipun mereka dapat menggunakan fungsi lain yang diluncurkan secara otomatis sebagai gantinya).

Jadi, fungsionalitas makro kurang lebih jelas, saatnya untuk membongkar dll dan melanjutkan ke analisis mereka.

Dll pertama


Dll pertama (sha256 7427cc4b6b659b89552bf727aed332043f4551ca2ee2126cca75fbe1ab8bf114 ) 64 bit.

Daftar fungsi yang diimpor berisi fungsi CreateProcessW (mulai program), CreateRemoteThread (membuat utas dalam proses lain ), VirtualAllocEx (mengalokasikan blok memori dalam proses lain ), WriteProcessMemory (menulis ke memori proses lain ), yang langsung menyarankan injeksi kode ke proses lain. proses. Sekarang mari kita lihat apa sebenarnya yang dia lakukan dengan menggunakan IDA Free dan Ghidra.
Titik masuk utama hanya mengembalikan 1, tidak melakukan apa pun. Fungsi yang diekspor kedua adalah klon, yang dipanggil oleh makro dan berisi kode berbahaya.
Parameter yang dipanggil sepertinya tidak mempengaruhi apa pun. Aplikasi mendekripsi dua blok data. Blok data 0x78 pertama dengan konten berikut (sudah didekripsi):

https://pastebin.com/raw/Jyujxy7z\x00\x00\x00\x00\x00\x00\x00\xf2i\xe0\x1d\x95h\xbc\x03\xe4#\xe0\x1d<\x04\xe0\x1d\xe6\x00\xde\x01\xa4\x17\xbc\x03x\x01\xe0\x1d\xe2\x16x\x07Qy\xbc\x03@Fx\x07Df\xbc\x03\x89a\xde\x01q\x11\xe0\x1d|Ix\x07D@\xbc\x03\x8a\x01\xde\x01^9\xde\x01\xf2i\xe0\x1d\x95h\xbc\x03\xe4#\xe0\x1d\xab

Blok data kedua panjangnya 0x1D4C dan berisi kode yang dapat dieksekusi.

Selain itu, pointer ke modul kernel32, hasil dari fungsi GetTickCount (), dan alamat fungsi ZwDelayExecution () dari kernel32 ditulis ke struktur 0x90 byte .

Kemudian proses ( CreateProcessW ) "cmd.exe" dibuat. Menggunakan VirtualAllocEx , dua buffer dialokasikan di dalamnya: dengan izin RW dengan panjang 0x108 dan dengan izin RWX dengan panjang 0x1D4C. Buffer RW menyalin blok data di atas dan struktur yang disebutkan di atas dengan panjang 0x90. Struktur juga menulis pointer ke blok data yang didekripsi (di ruang alamat proses anak (cmd.exe)). Di RWX, buffer disalin ( WriteProcessMemory) blok data yang didekripsi dengan kode.
Kemudian, dalam proses cmd.exe, aliran ( CreateRemoteThread ) dibuat dengan titik masuk di awal buffer RWX, pointer ke buffer RW dilewatkan sebagai argumen. Ini melengkapi fungsi klon, tindakan berlanjut dalam proses cmd.exe.

Menariknya, fungsi klon tampaknya seperti potongan kode yang tidak dapat diakses yang mengimpor ( LoadLibraryW ) pustaka " WorkPolyhistor ".

Kode disuntikkan ke cmd.exe


Ia melakukan tindakan berikut:

  • menemukan alamat fungsi-fungsi yang diperlukan dari kernel32.dll (alamatnya diperoleh dari proses induk)
  • memuat pustaka ntdll , Ole32 , User32
  • Temukan alamat fungsi yang diperlukan di perpustakaan ini.

Sangat menarik bahwa untuk sebagian besar fungsi dalam kode tidak ada nama fungsi, tetapi hanya CRC32 atas nama (semua nama fungsi dari pustaka dimuat dicari sampai ada fungsi dengan CRC32 yang diinginkan atas nama). Mungkin ini adalah perlindungan terhadap mendapatkan daftar fungsi yang diimpor oleh utilitas string, meskipun aneh bahwa kode yang disimpan dalam bentuk terenkripsi memiliki perlindungan seperti itu, sedangkan dll itu sendiri mengimpor fungsi hanya dengan nama. Secara total, fungsi-fungsi berikut terdeteksi:

kernel32:

  • GetProcAddress
  • Perpustakaan Load
  • Globalalloc
  • GetTempPath
  • DapatkanFileAttributesW
  • Buat ProsesW
  • Bebas global
  • GlobalRealloc
  • File Writeile
  • CreateFileW (ditemukan dengan nama)
  • File Writeile
  • Closehandle
  • Gettickcount
  • BacaFile
  • GetfileSize

nll:

  • RtlCreateUnicodeStringFromAsciiz
  • Eksekusi ZwDelay
  • ZwTerminateProcess
  • swprintf

OLE32:

  • Menginisialisasi (ditemukan dengan nama)
  • CoCreateInstance (ditemukan dengan nama)

msvcrt:

  • Rand
  • srand

Selanjutnya, proses menggunakan GetTempPath memperoleh jalur ke direktori sementara, membuat file di dalamnya dengan nama 26342235.dat, di mana nama file adalah catatan desimal dari TickCount yang diterima dari proses induk dan beralih pada setiap upaya baru (mis. Jika unduhan gagal pada upaya pertama, maka pada upaya kedua file akan dibuat dengan nama 26342236.dat). Setelah itu, perpustakaan wininet dimuat dan ada pointer ke fungsi-fungsi berikut:

  • InternetCloseHandle (crc32: 0xe5191d24)
  • InternetGetConnectedState (crc32: 0xf2e5fc0c)
  • InternetOpenA (crc32: 0xda16a83d)
  • InternetOpenUrlA (crc32: 0x16505e0)
  • InternetReadFile (crc32: 0x6cc098f5)

Menggunakan InternetGetConnectedState memeriksa apakah ada jaringan, jika tidak, aplikasi memanggil fungsi di alamat yang tidak ada dan crash (perlindungan terhadap penentuan alamat dari mana muatan diperoleh dengan menggunakan mesin yang diisolasi dari jaringan. Ini adalah satu-satunya kasus ketika aplikasi berakhir secara abnormal, dalam 3 upaya sisanya dilakukan , setelah itu cmd.exe berakhir menggunakan ZwTerminateProcess ). Jika ada jaringan, kemudian menggunakan fungsi yang ditemukan, muatan diunduh dari URL yang diteruskan dari proses induk (https://pastebin.com/raw/Jyujxy7z) dan disimpan ke file yang dibuat sebelumnya dengan ekstensi .dat.

Selanjutnya, payload dibaca dari file dat, didekodekan (base64), didekripsi menggunakan XOR dengan CRC32 dari URL, periksa bahwa 2 byte pertama dari data yang didekripsi adalah 'MZ', jika demikian, hasilnya disimpan ke file dengan nama yang sama tetapi ekstensi. exe

Kode dekripsi python
from binascii import crc32
from base64 import b64decode


def decrypt_payload(payload_b64: bytes, url: str):
    payload_bin = b64decode(payload_b64.decode())
    key = str(crc32(url.encode())).encode()
    decrypted = bytearray()
    for i, b in enumerate(payload_bin):
        decrypted.append(b ^ key[i % len(key)])
    return bytes(decrypted)

Menggunakan fungsi CreateProcessW , file yang disimpan diluncurkan. Jika semuanya berjalan dengan baik, proses cmd.exe keluar menggunakan ZwTerminateProcess . Jika terjadi kesalahan (kecuali karena kurangnya jaringan), maka semuanya diulangi lagi, maksimal 3 upaya dilakukan, nama file dat dan exe bertambah 1 setiap kali.

Dll kedua


Dll kedua (sha256 006200fcd7cd1e71be6c2ee029c767e3a28f480613e077bf15fadb60a88fdfca ) 32 bit.

Di dalamnya, fungsi jahat utama diimplementasikan dalam fungsi klon . Itu juga mendekripsi 2 buffer. Buffer pertama berukuran 0x78 (120) byte, data tersebut didekripsi dan ditulis ke dalamnya (dalam bentuk dekripsi):

https://pastebin.com/raw/Jyujxy7z\x00\x00\x00\x00\x00\x00\x00\x1e(\xf0\x0e\xc5r\xc0;\x12)\xc0;Jr\xc0;Y4\xbc\x03/Mx\x07\x038\xde\x01\x9e\x05\xe0\x1d#\x08\xbc\x03\xeeU\xf0\x0e\x18{x\x078\x1a\xf0\x0e\xccg\xf0\x0eze\xde\x01\x89&\xe0\x1d\xf6\x1f\xe0\x1d

Dapat dilihat bahwa pada awalnya adalah URL yang sama seperti pada versi x64.

Buffer kedua ukuran 0x4678 byte dialokasikan dengan izin RWX. Kode didekripsi ke dalamnya, setelah fungsi dipanggil dari itu dengan offset 0x4639 dari awal buffer.

Saya tidak menganalisis kode ini secara detail. Dia juga menemukan fungsi pada CRC32, meluncurkan notepad.exe, menyuntikkan kode di sana yang mengunduh muatan dari URL yang sama di pastebin.

Muatan dengan pastebin


Payload yang didekripsi dengan pastebin adalah file exe 32-bit (sha256 9509111de52db3d9a6c06aa2068e14e0128b31e9e45ada7a8936a35ddfaf155f ) Saya tidak membongkar secara detail namun karena kurangnya waktu.

Kesimpulan


Secara umum, malware terkesan membuat saya agak ditulis dengan buruk, dengan banyak kesalahan (saya tidak sengaja menyebutnya di sini). Seolah-olah mereka mencambuk.
Dll ditemukan dalam fungsi memori yang kemudian tidak digunakan di mana pun. Mungkin kode ini, seperti makro, secara teratur ditulis ulang oleh penjahat dunia maya setiap kali mulai terdeteksi oleh antivirus, sebagai akibat dari artefak tersebut tetap dalam kode.

Sangat menarik juga bahwa dalam versi "dll" dari dll yang "dijatuhkan" ke disk x64, nama fungsi impor "berbahaya" tidak di-mask (setidaknya Anda bisa melihatnya string), dan dalam kode yang didekripsi dalam memori dan tidak muat di disk, mereka berada di CRC32 dari nama, bukan hanya dengan nama.

Muatan pastebin dihapus beberapa hari kemudian.

PS KDPV diambil dari sini

All Articles