Jawaban pendek
1. Jika Anda menjalankan ProcMon untuk memantau program ini, Anda akan
melihat bahwa satu-satunya panggilan untuk menulis ke registri adalah untuk
RegSetValue untuk nilai HKLM \ SOFTWARE \ Microsoft \ Cryptography \ RNG \ Seed.
Beberapa perubahan tidak langsung dibuat oleh panggilan ke CreateServiceA,
Tetapi program ini juga membuat perubahan langsung ke registry dari kernel
yang tidak terdeteksi oleh ProcMon.
2. Untuk mengatur breakpoint untuk melihat apa yang terjadi di kernel, Anda harus
membuka executable dalam sebuah contoh dari WinDbg berjalan dalam mesin
virtual, sementara juga debugging kernel dengan contoh lain dari WinDbg di
mesin host. Ketika Lab10-01.exe dihentikan dalam mesin virtual, Anda pertama
kali menggunakan! drvobjperintah untuk mendapatkan pegangan ke objek driver,
yang berisi pointer ke fungsi membongkar. Berikutnya, Anda dapat mengatur
breakpoint pada fungsi membongkar dalam pengemudi. breakpoint akan dipicu
ketika Anda me-restart Lab10-01.exe.
3. Program ini menciptakan layanan untuk memuat sopir. Kode driver kemudian
menciptakan (atau memodifikasi, jika mereka ada) kunci registri \ Registry \
Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ StandardProfile dan
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ DomainProfile.
Pengaturan kunci registri menonaktifkan firewall Windows XP.
Analisis rinci
Kita mulai dengan beberapa analisis statis dasar. Meneliti executable, kita melihat
sangat sedikit impor selain yang standar yang disertakan dengan setiap executable.
Impor dari bungaOpenSCManagerA. OpenServiceA. ControlService. StartServiceA, dan
CreateServiceA. Ini menunjukkan program menciptakan layanan, dan mungkin mulai dan
memanipulasi layanan tersebut. Tampaknya ada sedikit interaksi tambahan sistem.
String keluaran mengungkapkan string menarik beberapa. Yang pertama
adalahC: \ Windows \ System32 \ Lab10-01.sys, Yang menunjukkan bahwa Lab10-01.sys
mungkin berisi kode untuk layanan ini.
Memeriksa file driver, kita melihat bahwa itu mengimpor hanya tiga fungsi.
Fungsi pertama adalahKeTickCount, Yang termasuk dalam hampir setiap pengemudi
dan dapat diabaikan. Dua fungsi yang tersisa,RtlCreateRegistryKey dan
RtlWriteRegistryValue, Memberitahu kita bahwa pengemudi mungkin mengakses registry. 10
File driver juga berisi sejumlah string yang menarik, sebagai berikut:
EnableFirewall
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ StandardProfile
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ DomainProfile
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft
string ini terlihat banyak seperti kunci registri, kecuali bahwa mereka mulai
dengan \ Registry \ Machine, Bukan salah satu kunci akar registri biasa, seperti HKLM.
Ketika mengakses registry dari kernel, awalan\ Registry \ Machine setara dengan
mengakses HKEY_LOCAL_MACHINEdari program user-space. Pencarian Internet
mengungkapkan bahwa pengaturanEnableFirewall nilai 0 menonaktifkan built-in
Windows XP firewall.
Karena string ini menunjukkan bahwa malware menulis ke registri, kita
membuka ProcMon untuk menguji hipotesis kami. Hal ini menunjukkan beberapa
panggilan ke fungsi yang membaca registry, tetapi hanya satu panggilan untuk
menulis ke registri:RegSetValue pada nilai HKLM \ SOFTWARE \ Microsoft \ Cryptography \
RNG \ Seed. nilai registri ini berubah sepanjang waktu dan tidak berarti untuk analisis
malware, tapi karena kode kernel yang terlibat, kita perlu memastikan bahwa
pengemudi tidak memodifikasi registri secara terselubung.
Berikutnya, kita membuka executable, arahkan ke utama fungsi yang ditampilkan
pada Listing 10-1L, dan melihat bahwa itu hanya membuat empat fungsi panggilan.
Listing 10-2L: Panggilan untuk OpenServiceA untuk mendapatkan pegangan ke layanan untuk Lab10-01
sub_10906
0040107C mendorong eax; lpServiceStatus
0040107D push 1; dwControl
0040107F mendorong esi; hService
00401080 call ds: ControlService; Kirim kode kontrol untuk layanan Win32
Fungsi ini adalah titik masuk dari pengemudi, tapi itu bukan DriverEntryfungsi.
compiler menyisipkan kode pembungkus sekitarDriverEntry. Yang asliDriverEntry Fungsi
terletak di sub_10906 .
Seperti ditunjukkan pada Listing 10-5L, tubuh utama dari DriverEntry Fungsi muncul
untuk memindahkan nilai offset ke lokasi memori, tetapi sebaliknya tidak membuat
panggilan fungsi atau berinteraksi dengan sistem.
Kemudian kita mulai program dan menunggu sampai breakpoint terkena. Ketika
breakpoint terkena, kita disajikan dengan informasi berikut di WinDbg:
Breakpoint 0 hit
eax = 0012ff1c ebx = 7ffdc000 ecx = 77defb6d edx = 00000000 esi = 00.144.048 edi = 00144f58 eip
= 00.401.080 esp = 0012ff08 EBP = 0012ffc0 iopl = 0 nv up ei pl nz na pe nc cs = 001B ss = 0023 ds
= 0023 es = 0023 fs = 003b gs = 0000 EFL = 00.000.206 image00400000 + 0x1080:
Setelah program ini berhenti di breakpoint, kita bergerak dari mesin virtual untuk
menghubungkan debugger kernel dan mendapatkan informasi tentang Lab10-01.sys.
Kami membuka contoh lain dari WinDbg dan pilih FileDebug kerneldengan pipa
set untuk \\. \ pipe \ com_1 dan baud rate 115200 untuk menghubungkan contoh
WinDbg berjalan di mesin host untuk kernel dari mesin tamu. Kita tahu bahwa layanan
kami disebut Lab10-01, sehingga kita bisa mendapatkan objek pengemudi dengan
menggunakan! drvobj perintah, seperti yang ditunjukkan pada Listing 10-6L.
Output dari ! drvobj perintah memberikan kami alamat dari objek sopir di . Karena
tidak ada perangkat yang tercantum dalam daftar perangkat objek di, Kita tahu bahwa
driver ini tidak memiliki perangkat yang dapat diakses oleh aplikasi userspace.
CATATAN Untuk mengatasi kesulitan menemukan nama layanan, Anda bisa mendapatkan daftar
objek pengemudi sedang dalam kernel dengan ! Objek \ driver perintah.
Setelah kita memiliki alamat dari objek driver, kita bisa melihatnya menggunakan dt
perintah, seperti yang ditunjukkan pada Listing 10-7L.
melanjutkan itu juga. Segera, seluruh tamu OS membeku karena debugger kernel
telah memukul breakpoint kernel kami. Pada titik ini, kita bisa pergi ke debugger
kernel untuk melangkah melalui kode. Kami melihat bahwa program
panggilanRtlCreateRegistryKey berfungsi tiga kali untuk membuat beberapa kunci
registri, dan kemudian memanggil RtlWriteRegistryValue dua kali untuk mengatur
EnableFirewallnilai 0 di dua tempat. Ini menonaktifkan firewall Windows XP dari kernel
dengan cara yang sulit bagi program keamanan untuk mendeteksi.
Jika fungsi membongkar di 0xf7c47486 yang panjang atau kompleks, akan sulit
untuk menganalisa di WinDbg. Dalam banyak kasus, lebih mudah untuk menganalisis
fungsi dalam IDA Pro setelah Anda telah mengidentifikasi di mana fungsi terletak,
karena IDA Pro melakukan pekerjaan yang lebih baik dari menganalisis fungsi.
Namun, lokasi fungsi dalam WinDbg berbeda dari lokasi fungsi dalam IDA Pro, jadi
kami harus melakukan beberapa perhitungan manual untuk melihat fungsi dalam IDA
Pro. Kita harus menghitung offset fungsi dari awal berkas ini dimuat di WinDbg
menggunakanlm perintah, sebagai berikut:
Seperti yang Anda lihat, file tersebut dimuat pada 0xf7c47000 di , Dan dari awal, kita
tahu fungsi membongkar terletak di 0xf7c47486. Kami kurangi 0xf7c47000 dari
0xf7c47486 untuk mendapatkan offset (0x486), yang kemudian kita gunakan untuk
menavigasi ke fungsi membongkar di IDA Pro. Misalnya, jika alamat beban dasar di IDA
Pro adalah 0x00100000, maka kita arahkan ke alamat 0x00100486 untuk menemukan fungsi
membongkar di IDA Pro. Kita kemudian dapat menggunakan analisis statis dan IDA Pro
untuk mengkonfirmasi apa yang kita temukan di WinDbg.
Atau, kita dapat mengubah alamat dasar di IDA Pro dengan memilih
EditsegmenRebase Program dan mengubah nilai alamat dasar dari 0x00100000
ke 0xf7c47000.
Jawaban pendek
1. Program ini menciptakan file C: \ Windows \ System32 \ Mlwx486.sys. Anda
dapat menggunakan ProcMon atau alat pemantauan dinamis lain untuk melihat file
yang dibuat, tetapi Anda tidak dapat melihat file pada disk karena tersembunyi.
2. Program ini memiliki komponen kernel. Hal ini disimpan dalam bagian sumber
daya file, dan kemudian ditulis ke disk dan dimuat ke dalam kernel sebagai
layanan.
3. Program ini merupakan rootkit yang dirancang untuk menyembunyikan file.
Menggunakan hooking SSDT menimpa masuk keNtQueryDirectoryFile, Yang
digunakan untuk mencegah tampilan dari setiap file yang dimulai dengan Mlwx
(case-sensitive) dalam daftar direktori.
Analisis rinci
Melihat bagian impor dieksekusi ini, kita melihat impor untuk
CloseServiceHandle. CreateServiceA. OpenSCManagerA, dan StartServiceA, Yang
memberitahu kita bahwa program ini akan membuat dan memulai layanan. Karena
program ini juga panggilanCreateFile dan WriteFile, Kita tahu bahwa itu akan menulis
ke file di beberapa titik. Kami juga melihat panggilan keLoadResource dan
SizeOfResource, Yang memberitahu kita bahwa program ini akan melakukan sesuatu
dengan bagian sumber daya dari Lab10-02.exe.
Menyadari bahwa program mengakses bagian sumber daya, kita menggunakan
Resource Hacker untuk memeriksa bagian sumber daya. Di sana, kita melihat bahwa
file berisi header PE lain dalam bagian sumber daya, seperti yang ditunjukkan pada
Gambar 10-1L. Ini mungkin file lain dari kode berbahaya yang Lab10-02.exe akan
menggunakan.
Berikutnya, kita menjalankan program dan menemukan bahwa itu menciptakan
sebuah file dan layanan. Menggunakan ProcMon, kita melihat bahwa program ini
menciptakan sebuah file di C: \ Windows \ System32, dan bahwa hal itu menciptakan
sebuah layanan yang menggunakan file sebagai executable. File yang berisi kode kernel
yang akan dimuat oleh OS.
Kami berikutnya harus menemukan file yang program menciptakan untuk
menganalisis dan menentukan apa kode kernel lakukan. Namun, ketika kita melihat di
C: \ Windows \ System32, kami menemukan bahwa tidak ada ada. Kita bisa melihat di
ProcMon bahwa file tersebut dibuat, dan tidak ada panggilan yang akan menghapus file.
Berdasarkan fakta-fakta bahwa file tersebut tidak muncul tapi kami tidak melihat
bagaimana hal itu dihapus dan bahwa sopir yang terlibat, kita harus curiga bahwa kita
sedang berhadapan dengan rootkit.
Gambar 10-1L: Sebuah file executable yang disimpan di bagian sumber daya Lab10-02.exe
Menemukan Rootkit yang
Dalam rangka untuk terus menyelidiki, kami ingin memeriksa untuk melihat apakah
driver kernel kami dimuat. Untuk melakukan itu, kita menggunakansc perintah untuk
memeriksa status layanan yang menjalankan driver kernel kami, seperti ditunjukkan
pada Listing 10-8L.
Kami query untuk nama layanan 486 WS driver di , Yang ditentukan dalam
panggilan untuk CreateServiceA. Kita lihat padabahwa layanan masih berjalan, yang
mengatakan kepada kita bahwa kode kernel dalam memori. Sesuatu yang
mencurigakan sedang terjadi karena pengemudi masih berjalan, tapi tidak pada disk.
Sekarang, untuk menentukan apa yang terjadi, kita menghubungkan debugger kernel
untuk mesin virtual kami, dan kami memeriksa untuk melihat apakah sopir itu
sebenarnya dimuat menggunakanlmperintah. Kami melihat entri yang cocok dengan
nama file yang telah dibuat oleh Lab10-02.exe:f7c4d000 f7c4dd80 Mlwx486 (ditangguhkan)
Kita sekarang yakin bahwa pengemudi dimuat ke memori dengan nama file
Mlwx486.sys, tetapi file tersebut tidak muncul pada disk, menunjukkan bahwa ini
mungkin rootkit.
Berikutnya, kita memeriksa SSDT untuk setiap entri yang dimodifikasi, seperti
ditunjukkan pada Listing 10-9L.
Listing 10-9L: Sebuah kutipan dari SSDT dengan satu entri yang telah dimodifikasi oleh rootkit
Kita melihat bahwa entri di di lokasi memori yang jelas di luar batas-batas
ntoskrnlmodul tetapi dalam pengemudi Mlwx486.sys dimuat. Untuk menentukan
fungsi normal digantikan, kita kembali mesin virtual kami sebelum rootkit tersebut
telah terpasang untuk melihat fungsi disimpan pada offset ke SSDT yang ditimpa.
Dalam hal ini, fungsi iniNtQueryDirectoryFile, Yang merupakan fungsi serbaguna yang
mengambil informasi tentang file dan direktori yang digunakan oleh FindFirstFile dan
FindNextFileuntuk melintasi struktur direktori. Fungsi ini juga digunakan oleh Windows
Explorer untuk menampilkan file dan direktori. Jika rootkit yang mengaitkan fungsi
ini, itu bisa menyembunyikan file, yang akan menjelaskan mengapa kita tidak dapat
menemukan Mlwx486.sys. Sekarang kita telah menemukan fungsi yang mengaitkan
SSDT, kita harus menganalisis apa fungsi yang melakukan.
CATATAN Ini mungkin tidak sepenuhnya jelas dari Listing 10-10L bahwa fungsi dipanggil adalah
NtQueryDirectoryFile. Namun, jika kita satu langkah di ataspanggilan fungsi, kita melihat
bahwa ia pergi ke bagian lain dari file yang melompat ke NtQueryDirectoryFile. Dalam
IDA Pro, panggilan ini akan diberi labelNtQueryDirectoryFile, Tapi disassembler termasuk
dalam WinDbg jauh lebih canggih. Idealnya, kita akan memiliki file untuk melihat di
IDA Pro sementara kita debugging, tapi kami tidak dapat menemukan file ini karena itu
tersembunyi.
Itu PatchFunction memeriksa parameter kedelapan, FileInformationClass, Dan jika itu adalah
nilai lain dari 3, ia mengembalikan NtQueryDirectoryFile'S nilai kembali asli. Hal ini juga
memeriksa nilai kembali dariNtQueryDirectoryFile dan nilai parameter kesembilan,
ReturnSingleEntry. PatchFunctionmencari parameter tertentu. Jika parameter tidak memenuhi
kriteria, maka fungsi ini persis sama dengan aslinyaNtQueryDirectoryFile. Jika parameter
melakukan memenuhi kriteria,PatchFunction akan mengubah nilai kembali, yang adalah apa
yang kita tertarik. Untuk menguji apa yang terjadi selama panggilan untuk PatchFunction
dengan parameter yang benar, kita menetapkan breakpoint pada PatchFunction.
Jika kita mengatur breakpoint pada PatchFunction, Akan merusak setiap kali fungsi
ini dipanggil, tapi kami tertarik hanya beberapa fungsi panggilan. Ini adalah waktu
yang tepat untuk menggunakan breakpoint kondisional sehingga breakpoint terkena
hanya ketika parameter untukPatchFunctionsesuai dengan kriteria kami. Kami mengatur
breakpoint padaPatchFunction, Namun breakpoint akan terkena hanya jika nilai
ReturnSingleEntry adalah 0, sebagai berikut:
CATATAN Jika Anda memiliki Windows Explorer terbuka dalam sebuah direktori, Anda
mungkin melihat breakpoint ini memukul berulang-ulang di benang yang berbeda,
yang dapat mengganggu saat Anda sedang mencoba untuk menganalisis fungsi.
Untuk membuatnya lebih mudah untuk menganalisis, Anda harus menutup
semua dari Windows Explorer jendela dan menggunakan dir perintah di baris
perintah untuk memicu breakpoint.
Setelah kode menyaring panggilan yang menarik, kita melihat fungsi lain yang
disimpan pada offset 0xf7c4d590. Meskipun tidak secara otomatis diberi label oleh
WinDbg, kita dapat menentukan bahwa itu adalahRtlCompareMemorydengan melihat
pembongkaran atau melangkah ke fungsi panggilan. Kode pada Listing 10-11L
menunjukkan panggilan untukRtlCompareMemory di .
Listing 10-11L: Perbandingan nama file untuk menentukan apakah rootkit akan memodifikasi informasi
kembali dari NtQueryDirectoryFile
kd> db esi + 5e
036a302e 49 00 6e 00 73 00 74 00-61 00 6c 00 6c 00 65 00 Installe
036a303e 00 68 00 72 00 00 00 00-00 00 f6 BB menjadi f0 6e 70 rh .......... np 036a304e c7 01 47 c0 db
46 25 75-cb 01 50 1e c1 f0 6e 70 .. G..F% u..P ... np 036a305e c7 01 50 1e c1 f0 6e 70-c7 01 00 00 00 00
00 00 ..P ... np ........
Operan lain dari perbandingan adalah lokasi f7c4d51a tetap, dan kita dapat
menggunakan dbperintah untuk melihat itu juga. Daftar 10-13L menunjukkan bahwa
parameter kedua untukRtlCompareMemory menyimpan surat-surat Mlwx, yang
mengingatkan kita pada pengemudi Mlwx486.sys.
menyembunyikan File
Setelah menemukan yang nama file PatchFunction akan beroperasi pada, kita
menganalisis bagaimana hal itu akan mengubah nilai-nilai kembalinya
NtQueryDirectoryFile. Memeriksa dokumentasi untukNtQueryDirectoryFile, Kita melihat
FileInformation struktur dengan serangkaian FILE_BOTH_DIR_INFORMATIONstruktur. Field
pertama diFILE_BOTH_DIR_INFORMATION Struktur adalah offset yang menunjuk ke depan
FILE_BOTH_DIR_INFORMATION. Seperti ditunjukkan dalam Gambar 10-2L,PatchFunction
memanipulasi bidang ini untuk menyembunyikan file tertentu dari daftar direktori
dengan memindahkan offset maju ke titik ke entri berikutnya jika entry ini memiliki
nama file diawali dengan Mlwx.
Gambar 10-2L menunjukkan apa nilai pengembalian
NtQueryDirectoryFileSepertinya untuk direktori yang berisi tiga file. ada
satuFILE_BOTH_DIR_INFORMATIONstruktur untuk setiap file. Biasanya, struktur pertama
akan menunjuk kedua, dan yang kedua akan menunjuk ke ketiga, tapi rootkit telah
diubah struktur sehingga pertama struktur poin ke posisi ketiga, dengan demikian
menyembunyikan struktur tengah. Trik ini memastikan bahwa setiap file yang
dimulai dengan Mlwx yang dilewati dan tersembunyi dari daftar direktori.
FILE_BOTH_DIR_INFORMATION
FILE_BOTH_DIR_INFORMATION
FILE_BOTH_DIR_INFORMATION
1. Menonaktifkan layanan yang dimulai pengemudi dan reboot. Ketika Anda reboot,
kode tersebut tidak akan berjalan dan file tidak akan tersembunyi.
2. Ekstrak file dari bagian sumber daya dari file executable yang diinstal itu.
3. Mengakses file meskipun itu tidak tersedia di daftar direktori. Hook
keNtQueryDirectoryFilemencegah file dari yang ditampilkan dalam daftar direktori,
tapi file masih ada. Misalnya, Anda bisa menyalin file menggunakan perintah
DOScopy Mlwx486.sys NewFilename.sys. File NewFilename.sys tidak akan
tersembunyi.
Semua pilihan ini cukup sederhana, tetapi yang pertama adalah yang terbaik
karena menonaktifkan pengemudi. Dengan sopir dinonaktifkan, Anda harus mencari
sistem anda untuk file yang dimulai dengan Mlwx dalam kasus ada file lain yang
tersembunyi oleh driver Mlwx486.sys. (Tidak ada satu pun dalam kasus ini.)
Mlwx486.sys membuka di IDA Pro, kita melihat bahwa sangat kecil, jadi kita
harus menganalisis semua itu memastikan bahwa pengemudi tidak melakukan apa
pun yang kita tidak sadar. Kami melihat bahwaDriverEntry panggilan rutin
RtlInitUnicodeString dengan KeServiceDescriptorTable dan NtQueryDirectoryFile, Dan
kemudian memanggil MmGetSystemRoutineAddressuntuk menemukan offset bagi
mereka dua alamat. Hal berikutnya mencari masuk dalam SSDT
untukNtQueryDirectoryFile dan menimpa yang masuk dengan alamat PatchFunction. Tidak
menciptakan perangkat, dan tidak menambahkan penangan fungsi untuk objek driver.
Jawaban pendek
1. Program user-space load driver dan kemudian muncul iklan setiap 30 detik. Sopir
menyembunyikan proses dengan membatalkan tautan Proses Lingkungan Block
(PEB) dari sistem linked list.
2. Setelah program ini berjalan, tidak ada cara mudah untuk menghentikannya tanpa
reboot.
3. Komponen kernel merespon setiap DeviceIoControl permintaan dengan membatalkan
tautan proses yang membuat permintaan dari linked list dari proses untuk
menyembunyikan proses dari pengguna.
Analisis rinci
Kita mulai dengan beberapa analisis statis dasar pada file. Ketika kita menganalisis file
driver, kita melihat impor berikut:
IofCompleteRequest
IoDeleteDevice
IoDeleteSymbolicLink
RtlInitUnicodeString
IoGetCurrentProcess
IoCreateSymbolicLink
IoCreateDevice
KeTickCount
OpenSCManager
CreateService
Memulai layanan
CloseServiceHandle
CreateFile
DeviceIoControl
OleInitialize
CoCreateInstance
VariantInit SysAllocString ecx
+ 0x2c
winMaindapat secara logis dibagi menjadi dua bagian. Bagian pertama, yang
terdiri dariOpenSCManager melalui DeviceIoControl, Termasuk fungsi untuk memuat
dan mengirim permintaan untuk driver kernel. Bagian kedua terdiri dari fungsi-
fungsi yang tersisa, yang menunjukkan penggunaan objek COM. Pada titik ini, kita
tidak tahu target panggilan untukecx + 0x2c, Tapi kami akan kembali ke nanti.
Melihat panggilan dalam detail, kita melihat bahwa program menciptakan
layanan yang disebut Proses Helper, yang memuat driver kernel C: \ Windows \
System32 \ Lab10-03.sys. Kemudian mulai layanan Helper Proses, yang beban
Lab10-03.sys dalam kernel dan membuka pegangan untuk \\. \ ProcHelper, yang
membuka pegangan ke perangkat kernel yang diciptakan oleh driver ProcHelper.
Kita perlu melihat hati-hati pada panggilan untuk DeviceIoControl, Ditunjukkan
pada Listing 10-14L, karena parameter input dan output lulus sebagai argumen
untuk itu akan dikirim ke kode kernel, yang kita perlu menganalisa secara terpisah.
Menganalisis Driver
Berikutnya, kita membuka file kernel dengan IDA Pro. Seperti ditunjukkan pada Listing
10-15L, kita melihat bahwa itu panggilanIoCreateDevice di untuk menciptakan sebuah
perangkat bernama \ Device \ ProcHelper di .
Listing 10-15L: Lab10-03.sys menciptakan sebuah perangkat yang dapat diakses dari ruang pengguna
Listing 10-16L: Lab10-03.sys menciptakan link simbolik untuk membuatnya lebih mudah untuk aplikasi
user-ruang untuk mengakses pegangan untuk perangkat
Menemukan Driver di Memory dengan WinDbg
Kami dapat menjalankan malware atau hanya memulai layanan untuk memuat driver
kernel kami ke dalam memori. Kita tahu bahwa objek perangkat di\ Device \ ProcHelper,
Jadi kita mulai dengan itu. Dalam rangka untuk mencari fungsi diProcHelper yang
dieksekusi, kita harus menemukan objek driver, yang dapat dilakukan dengan !
devobjperintah, seperti yang ditunjukkan pada Listing 10-17L. Output dari! devobj
memberitahu kita di mana DriverObject di tersimpan.
Setiap entri dalam tabel mewakili berbagai jenis permintaan bahwa pengemudi
dapat menangani, tapi seperti yang Anda lihat, sebagian besar entri dalam tabel adalah
untuk fungsi yang sama di 0X804F354A. Semua entri dalam tabel dengan nilai
0X804F354A merupakan jenis permintaan bahwa pengemudi tidak menangani.
Untuk memverifikasi ini, kita perlu mencari tahu apa fungsi yang melakukan. Kita
bisa melihat pembongkaran, tetapi karena fungsi Windows, namanya harus
memberitahu kami apa yang dilakukannya, seperti yang ditunjukkan di sini:
kd> ln 804f354a
(804f354a) nt IopInvalidDeviceRequest! | (804f3580)
nt! IopGetDeviceAttachmentBase
pertandingan yang sebenarnya:! nt IopInvalidDeviceRequest = <tidak
ada informasi jenis>
Sekarang kita tahu bahwa fungsi sedang mengakses LIST_ENTRY struktur, kita
melihat secara dekat bagaimana LIST_ENTRYsedang diakses. ItuLIST_ENTRY Struktur
adalah daftar ganda terkait dengan dua nilai: yang pertama adalah BERKEDIP, Yang
menunjuk ke entri sebelumnya dalam daftar, dan yang kedua adalah FLINK, Yang
menunjuk ke entri berikutnya dalam daftar. Kita melihat bahwa itu tidak hanya
membacaLIST_ENTRY struktur, tetapi juga mengubah struktur, seperti ditunjukkan pada
Listing 10-21L.
00010671
00010677 add eax, 88h
0001067C
0001067E
00010680
00010682
00010685
Ketika OS berjalan normal, setiap proses memiliki pointer ke proses sebelum dan
setelah. Namun, pada Gambar 10-3L, Proses 2 telah disembunyikan oleh rootkit ini.
Ketika iterates OS selama linked list dari proses, proses tersembunyi selalu dilewati.
Anda mungkin bertanya-tanya bagaimana proses ini terus berjalan tanpa
masalah, meskipun itu tidak ada dalam daftar OS proses. Untuk menjawab ini, ingat
bahwa proses hanyalah sebuah wadah untuk berbagai benang untuk menjalankan
dalam. Benang dijadwalkan untuk mengeksekusi pada CPU. Selama benang masih
benar dicatat oleh OS, mereka akan dijadwalkan, dan proses akan terus berjalan
seperti biasa.
Jawaban pendek
1. Ekstrak malware dan menjatuhkan msgina32.dll berkas ke disk dari bagian
sumber daya bernama TGAD.
2. malware menginstal msgina32.dll sebagai GINA DLL dengan menambahkannya
ke lokasi registri HKLM \ SOFTWARE \ CurrentVersion \ Winlogon Microsoft \ Windows NT \
\ GinaDLL, Yang menyebabkan DLL akan dimuat setelah sistem reboot.
3. malware mencuri kredensial pengguna dengan melakukan GINA intersepsi. File
msgina32.dll mampu mencegat semua kredensial pengguna dikirim ke sistem
untuk otentikasi.
4. The malware kayu curian mandat untuk% SystemRoot% \ System32 \
msutil32.sys. Username, domain, dan password login ke file dengan catatan
waktu.
5. Setelah malware dijatuhkan dan diinstal, harus ada reboot sistem untuk GINA
intersepsi untuk memulai. The malware log kredensial hanya ketika pengguna log
keluar, sehingga log out dan kembali untuk melihat kredensial Anda dalam file
log.
Analisis rinci
Dimulai dengan analisis statis dasar, kita melihat string GinaDLL dan PERANGKAT LUNAK\
\ Winlogon Microsoft \ Windows NT \ CurrentVersion, Yang membawa kita untuk menduga
bahwa ini mungkin GINA intersepsi malware. Meneliti impor, kita melihat fungsi
untuk memanipulasi registri dan penggalian bagian sumber daya. Karena kita melihat
sumber daya fungsi ekstraksi impor, kami memeriksa struktur file dengan
Gambar 11-1L: Lab11-01.exe di PEview menunjukkan bagian sumber daya TGAD
Memeriksa format file PE, kita melihat bagian sumber daya bernama TGAD.
Ketika kita klik bagian tersebut di PEview, kita melihat bahwaTGAD berisi file PE
tertanam.
Berikutnya, kita melakukan analisis dinamis dan memantau malware dengan
ProcMon dengan menetapkan filter untuk Lab11-01.exe. Ketika kami meluncurkan
malware, kita melihat bahwa hal itu menciptakan sebuah file bernama msgina32.dll
pada disk dalam direktori yang sama dari mana malware diluncurkan. malware
menyisipkan path ke msgina32.dll ke kunci registriHKLM \ SOFTWARE \ CurrentVersion \
Winlogon Microsoft \ Windows NT \ \ GinaDLL, Sehingga DLL akan dimuat oleh Winlogon
Analisis msgina32.dll
Kami akan memulai analisis kami msgina32.dll dengan melihat output String, seperti
ditunjukkan pada Listing 11-1L.
GinaDLL
Software \ CurrentVersion \ Winlogon Microsoft \ Windows NT \
MSGina.dll
PBB% s DM% s PW% s OLD% s msutil32.sys
String dalam daftar ini berisi apa yang tampaknya menjadi pesan log di , Yang
dapat digunakan untuk login kredensial pengguna jika ini adalah GINA intersepsi
malware. stringmsutil32.sys menarik, dan kami akan menentukan signifikansi nanti di lab.
Meneliti ekspor msgina32.dll, kita melihat banyak fungsi yang dimulai dengan
awalan WLX. Ingat dari Bab 11 yang GINA intersepsi malware harus berisi semua ekspor
DLL ini karena mereka diwajibkan oleh GINA. Kami akan menganalisis masing-masing
fungsi di IDA Pro.
Kita mulai dengan memuat malware ke IDA Pro dan menganalisis DllMain, Seperti
ditunjukkan pada Listing 11-2L.
Kode pada Listing 11-4L melewati sekelompok argumen dan format string di .
String ini akan diteruskan kesub_10001570, Yang disebut di .
Sepertinya sub_10001570mungkin fungsi logging untuk kredensial dicuri, jadi mari
kita memeriksanya untuk melihat apa yang dilakukannya. Daftar 11-5L menunjukkan
kode logging yang terkandung dalamsub_10001570.
Nama pengguna yang pemakai dan hacker, Password mereka test123 dan p @ ssword,
Dan domain adalah MALWAREVM.
Ringkasan
Lab 11-1 adalah interceptor installer GINA. malware menjatuhkan DLL pada sistem
dan menginstalnya untuk mencuri kredensial pengguna, dimulai setelah sistem reboot.
Setelah GINA interceptor DLL diinstal dan berjalan, log mandat untuk msutil32.sys
ketika pengguna log keluar dari sistem.
Jawaban pendek
1. Lab11-02.dll berisi satu ekspor, bernama pemasang.
2. Jika Anda menjalankan malware dari baris perintah dengan menggunakan rundll32.exe
Lab11-02.dll, installer, Salinan malware dirinya ke direktori sistem Windows sebagai
spoolvxx32.dll dan menginstal sendiri terus-menerus di bawah AppInit_DLLs. malware
juga mencoba untuk membuka Lab11-02.ini dari direktori sistem Windows, tetapi tidak
menemukannya di sana.
3. Lab11-02.ini harus berada di% SystemRoot% \ System32 \ agar malware untuk berjalan
dengan baik.
4. malware menginstal sendiri dalam AppInit_DLLs nilai registri, yang menyebabkan
malware yang akan dimuat ke setiap proses yang juga memuat User32.dll.
5. malware ini menginstal hook inline dari Kirim fungsi.
6. Hook memeriksa apakah paket keluar adalah pesan email yang berisi RCPT TO:, Dan jika
string ini ditemukan, ia menambahkan tambahan RCPT TO baris yang berisi account email
berbahaya.
7. Target malware hanya Msimn.Exe, THEBAT.exe, dan outlook.exe karena semua adalah
klien email. malware tidak menginstal hook kecuali sedang berjalan di dalam salah satu
dari proses-proses ini.
8. File INI berisi alamat email terenkripsi. Setelah mendekripsi Lab11-02.ini, kita melihat
mengandung billy@malwareanalysisbook.com.
9. Lihat “Menangkap Lalu Lintas Jaringan” pada halaman 580 untuk metode kami
menangkap data menggunakan Wireshark, mail server palsu, dan Outlook Express.
Analisis rinci
Kita mulai dengan analisis statis dasar Lab11-02.dll. DLL hanya memiliki satu
ekspor, bernamapemasang. malware berisi impor untuk memanipulasi registri
(RegSetValueEx), Mengubah sistem file (CopyFile), Dan mencari melalui proses atau
benang daftar (CreateToolhelp32Snapshot). String yang menarik untuk Lab11-02.dll
ditunjukkan pada Listing 11-6L.
CATATANRCPT adalah perintah SMTP untuk membangun penerima untuk pesan email.
Berikutnya, kita menggunakan alat dinamis dasar seperti ProcMon untuk memantau
malware. Kita mulai dengan mencoba untuk menginstal malware
menggunakanpemasang ekspor dengan perintah berikut:
Dalam ProcMon, kita menetapkan filter untuk rundll32.exe proses, dan melihat
malware membuat file bernama spoolvxx32.dll di direktori sistem Windows. Setelah
pemeriksaan lebih lanjut, kita melihat bahwa file ini identik dengan Lab11-02.dll.
Selanjutnya dalam ProcMon daftar, kita melihat malware menambahkan
spoolvxx32.dll ke daftarAppInit_DLLs(Menyebabkan malware yang akan dimuat ke
setiap proses yang memuat User32.dll). Akhirnya, kita melihat bahwa malware
mencoba untuk membuka Lab1102.ini dari direktori sistem Windows. Oleh karena
itu, kita harus menyalin
file INI ke direktori sistem Windows agar malware untuk mengaksesnya.
Kami bergerak analisis kami untuk IDA Pro untuk melihat lebih dalam ke malware.
Kita mulai dengan menganalisispemasangekspor. Sebuah grafik-referensi silang
daripemasang ditunjukkan pada Gambar 11-2L.
Seperti yang Anda lihat, pemasangmenetapkan nilai dalam registri dan salinan file
ke direktori sistem Windows. Ini sesuai dengan apa yang kita lihat selama analisis
dinamis dan dikonfirmasi di pembongkaran. Itupemasang -satunya tujuan fungsi adalah
untuk menyalin malware untuk spoolvxx32.dll dan mengaturnya sebagai AppInit_DLLs
nilai.
Dalam Listing 11-7L, kami fokus pada DllMain, Yang dimulai dengan memeriksa
DLL_PROCESS_ATTACH, Seperti dengan lab sebelumnya. Tampaknya malware ini hanya
berjalan selamaDLL_PROCESS_ATTACH; jika tidak,DllMain kembali tanpa melakukan hal
lain.
Listing 11-7L: Kode di DllMain yang mencoba untuk membuka Lab11-02.ini dari direktori sistem
Pada Listing 11-7L di , Kita melihat direktori sistem Windows diambil, serta
string untuk Lab11-02.ini di . Bersama-sama, membentuk jalur denganstrncat di .
malware mencoba untuk membuka file INI untuk membaca di. Jika file tidak dapat
dibuka,DllMain pengembalian.
Jika malware berhasil membuka file INI, membaca file ke dalam buffer global,
seperti ditunjukkan pada Listing 11-8L di .
Setelah panggilan untuk ReadFile, Cek malware untuk memastikan ukuran file
lebih besar dari 0 di . Berikutnya, buffer yang berisi isi file akan diteruskan
kesub_100010B3 di . sub_100010B3 terlihat seperti itu mungkin rutinitas decoding
karena fungsi pertama disebut setelah membuka pegangan ke file dikodekan
dicurigai, jadi kita akan menyebutnya maybeDecoder. Untuk menguji teori kami, kami
memuat malware ke OllyDbg dan mengatur breakpoint di 0x100016CA. (Pastikan
Anda menyalin file INI dan malware ke dalam direktori sistem Windows dan
mengubah nama spoolvxx32.dll DLL.) Setelah breakpoint terkena, kita
melangkahisebut maybeDecoder. Gambar 11-3L menunjukkan hasilnya.
Gambar 11-3L: OllyDbg menunjukkan isi diterjemahkan dari Lab11-02.ini
Dalam Listing 11-11L, kita melihat pegangan untuk wsock32.dll diperoleh dengan
menggunakan
GetModuleHandleA di . pegangan yang dilewatkan keGetProcAddress untuk
menyelesaikan Kirim fungsi pada . malware berakhir lewat alamatKirim Fungsi dan dua
parameter lainnya (sub_1000113D dan dword_10003484) untuk sub_10001203, Yang kami
berganti nama place_hook.
Sekarang, kita meneliti place_hookdan mengubah nama argumen sesuai dalam rangka
untuk membantu analisis kami. Daftar 11-12L menunjukkan awalplace_hook.
Kode pada Listing 11-12L menghitung perbedaan antara alamat memori dari
Kirim fungsi dan awal sub_1000113D. Perbedaan ini memiliki tambahan 5 byte
dikurangi dari itu sebelum pindah keVAR_4 di . VAR_4 digunakan kemudian dalam
kode dan didahului dengan 0xE9 (Opcode untuk jmp), Membuat ini instruksi 5-byte
untuk melompat ke sub_1000113D.
Mari kita lihat bagaimana malware menginstal kode ini sebagai kail kemudian di
place_hook.
Awal Kirim Fungsi dimodifikasi oleh petunjuk yang ditampilkan pada Listing 11-13L.
Di , Kode salinan 0xE9 opcode ke awal Kirimfungsi. Setelah itu, itu salinanVAR_4
ke dalam memori hanya setelah 0xE9 di . Ingat dari Daftar 11-12L yangVAR_4
mengandung tujuan melompat, sub_1000113D. Kode pada Listing 11-13L
menempatkanjmp instruksi pada awal Kirim fungsi yang melompat ke fungsi dalam
DLL kami di sub_1000113D, Yang sekarang kita akan mengubah nama hook_function.
Sebelum kita meneliti hook_function, Mari kita membungkus analisis kami instalasi
inline kait. Listing menunjukkan 11-14Lplace_hook memanipulasi memori.
CATATAN Agar ini untuk mengeksekusi dengan baik, memori dikembalikan oleh panggilan
untuk malloc harus memori executable, yang mungkin tidak selalu menjadi kasus jika,
misalnya, Pencegahan Eksekusi Data (DEP) diaktifkan melalui / Noexecute = AlwaysOn
atau serupa.
Daftar 11-15L menunjukkan penciptaan kode trampolin itu.
Ringkasan
Lab 11-2 adalah DLL berbahaya yang ekspor pemasang, Yang menginstal malware
terus-menerus menggunakan AppInit_DLLs, Menyebabkan malware yang akan dimuat
ke sebagian proses. Pemeriksaan malware untuk melihat apakah itu dimuat ke klien
email dengan menggunakan daftar yang telah ditetapkan nama-nama proses untuk
menargetkan. Jika malware menentukan bahwa itu berjalan di dalam salah satu dari
proses-proses ini, akan bertindak sebagai rootkit mode pengguna dengan memasang
kait inline untukKirimfungsi. hook mengambil bentuk darijmp instruksi ditempatkan di
awal Kirimfungsi. hook mengeksekusi fungsi yang memindai setiap buffer data
diteruskan keKirim Fungsi dan mencari RCPT TO. Jika malware menemukanRCPT TO
string, ia menyisipkan tambahan RCPT TO mengandung alamat email diambil oleh
decoding Lab11-02.ini, pada dasarnya menyalin penulis malware pada setiap email
yang dikirim dari program email yang ditargetkan.
Jawaban pendek
1. Lab11-03.exe mengandung string inet_epar32.dll dan net start cisvc, Yang berarti bahwa itu
mungkin dimulai layanan pengindeksan CiSvc. Lab11-03.dll mengandung stringC: \
WINDOWS \ System32 \ kernel64x.dll dan impor panggilan API GetAsyncKeyState dan
GetForegroundWindow, Yang membuat kita menduga itu adalah keylogger yang log ke
kernel64x.dll.
2. malware dimulai dengan menyalin Lab11-03.dll untuk inet_epar32.dll di direktori sistem
Windows. malware menulis data ke cisvc.exe dan mulai layanan pengindeksan. malware
juga muncul untuk menulis keystrokes ke C: \ Windows \ System32 \ kernel64x.dll.
3. malware terus-menerus menginstal Lab11-03.dll oleh trojanizing layanan pengindeksan
oleh entry-titik pengalihan. Ini pengalihan titik masuk untuk menjalankan shellcode, yang
beban DLL.
4. malware menginfeksi cisvc.exe untuk memuat inet_epar32.dll dan memanggil ekspor
zzz69806582.
5. Lab11-03.dll adalah keylogger polling dilaksanakan di ekspor zzz69806582.
6. The malware toko keystrokes dan jendela ke mana keystrokes dimasukkan ke C: \
Windows \ System32 \ kernel64x.dll.
Analisis rinci
Kita akan mulai analisa kita dengan memeriksa string dan impor untuk Lab11-03.exe
dan Lab11-03.dll. Lab11-03.exe mengandung stringinet_epar32.dll dan net start cisvc.
Itumulai bersih Perintah ini digunakan untuk memulai layanan pada mesin Windows,
tapi kami belum tahu mengapa malware tersebut akan memulai layanan
pengindeksan pada sistem, jadi kita akan menggali selama analisis mendalam.
Lab11-03.dll mengandung string C: \ WINDOWS \ System32 \ kernel64x.dll dan
impor panggilan API GetAsyncKeyState dan GetForegroundWindow, Yang membuat
kita menduga itu adalah keylogger yang log keystrokes untuk kernel64x.dll. DLL
juga mengandung ekspor bernama aneh:zzz69806582.
Berikutnya, kita menggunakan teknik analisis dinamis untuk melihat apa
malware melakukan pada saat runtime. Kami mendirikan ProcMon dan filter pada
Lab11-03.exe untuk melihat malware membuat C: \ Windows \ System32 \
inet_epar32.dll. DLL inet_epar32.dll identik dengan Lab11-03.dll, yang mengatakan
kepada kita bahwa salinan malware Lab11-03.dll ke direktori sistem Windows.
Lebih lanjut dalam output ProcMon, kita melihat malware membuka pegangan untuk
cisvc.exe, tapi kami tidak melihat WriteFile operasi.
Akhirnya, malware dimulai layanan pengindeksan dengan mengeluarkan
perintah net start cisvc. Menggunakan Process Explorer, kita melihat bahwa cisvc.exe
sekarang berjalan pada sistem. Karena kita menduga bahwa malware mungkin
logging keystrokes, kita buka notepad.exe dan masukkan sekelompok karakter. Kami
melihat bahwa kernel64x.dll dibuat. Mencurigai bahwa penekanan tombol login, kita
membuka kernel64x.dll di hex editor dan melihat output berikut:
keystrokes kami telah login ke kernel64x.dll. Kami juga melihat bahwa program di
mana kita diketik kami (Notepad) telah login bersama dengan data keystroke dalam
heksadesimal. (Malware tidak mengubah nilai-nilai heksadesimal ke string dibaca,
sehingga penulis malware mungkin memiliki script postprocessing untuk lebih mudah
membaca apa yang dimasukkan.)
Berikutnya, kita menggunakan teknik mendalam untuk menentukan mengapa
malware ini mulai layanan dan bagaimana keylogger adalah mendapatkan eksekusi.
Kita mulai dengan memuat Lab11-03.exe ke IDA Pro dan memeriksautama fungsi,
seperti ditunjukkan pada Listing 11-17L.
Menggunakan diagram ini, kita melihat bahwa sub_401070 peta file cisvc.exe ke
dalam memori untuk memanipulasi dengan panggilan ke CreateFileA.
CreateFileMappingA, dan MapViewOfFile. Semua fungsi ini membuka file untuk membaca
dan menulis akses.
The mulai alamat dari tampilan memori-dipetakan dikembalikan oleh MapViewOfFile
(berlabel lpBaseAddressoleh IDA Pro) adalah baik dibaca dan ditulis untuk. Setiap
perubahan yang dibuat untuk file ini akan ditulis ke disk setelah panggilan
keUnmapViewOfFile, Yang menjelaskan mengapa kita tidak melihat WriteFile fungsi dalam
output ProcMon.
Beberapa perhitungan dan pemeriksaan tampaknya dibuat pada header PE dari
cisvc.exe. Daripada menganalisa manipulasi kompleks, mari kita fokus pada data
ditulis ke file, dan kemudian ekstrak versi cisvc.exe ditulis ke disk untuk analisis.
Sebuah buffer ditulis ke file memori-dipetakan, seperti ditunjukkan pada Listing 11-18L.
11
0040127C mov edi, [EBP + lpBaseAddress]
0040127F menambahkan edi, [EBP + var_28]
00401282 mov ecx, 4EH
00401287 mov esi, offset byte_409030 0040128C rep movsd
Sisi kiri dari tabel berisi byte baku, tetapi jika kita menempatkan kursor di
0x409030 dan tekan C di IDA Pro, kita mendapatkan pembongkaran ditampilkan di
sisi kanan meja. Ini adalah perakitan shellcode-buatan tangan itu, dalam hal ini,
digunakan untuk proses injeksi. Daripada menganalisis shellcode (demikian dapat
sedikit rumit dan berantakan), kami akan menebak apa itu didasarkan pada senar yang
dikandungnya.
Menjelang akhir 312 byte shellcode, kita melihat dua string:
Gambar 11-7L: PEview dari versi asli dan Trojanized dari cisvc.exe
Listing 11-19L: panggilan Penting dalam shellcode dalam Trojanized yang cisvc.exe
Sekarang kita memuat versi Trojanized dari cisvc.exe ke debugger dan mengatur
breakpoint di 0x1001B0A. Kami menemukan bahwa di, Panggilan malware
LoadLibraryuntuk memuat inet_epar32.dll ke dalam memori. Di, Panggilan malware
GetProcAddress dengan argumen zzz69806582untuk mendapatkan alamat dari fungsi
diekspor. Di, Panggilan malware zzz69806582. Akhirnya, malware melompat ke titik
masuk asli di, Sehingga layanan dapat berjalan seperti biasanya. Fungsi shellcode
ini cocok kecurigaan kami sebelumnya bahwa beban inet_epar32.dll dan panggilan
ekspor.
Analisis keylogger
Berikutnya, kita menganalisis inet_epar32.dll, yang sama dengan Lab11-03.dll. Kami memuat
Lab11-03.dllke IDA Pro dan mulai menganalisa file. Sebagian besar 11
kode berasal dari zzz69806582ekspor. ekspor ini mulai thread dan kembali, jadi kami
akan fokus pada analisis benang, seperti ditunjukkan pada Listing 11-20L.
Listing 11-20L: mutex dan pembuatan berkas dilakukan oleh thread yang dibuat oleh zzz69806582