TEZIS_AZE_3448_MFA - yerli dövlət qurumlarını hədəf alan zərərvericinin analizi - 2. hissə (zərərli faydalı yükün 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 - 31 Oktyabr 2022
TA007 - məqaləsində sizlərə dövlət orqanlarını hədəf alan zərərli dropperin analizi göstərmişdik. Bu məqalədə sözügedən zərərli dropperin sistemə yüklədiyi zərərli faydalı yükün (payload) analizi aparılacaqdır. Analiz prosesinə ilk olaraq PE haqqında qısa məlumat alaraq başladıq. Eyni ilə dropper kimi sistemə endirdiyi faydalı yükdə (payload) 32 bitlik icra edilə bilən fayl idi.
Fayl ölçüsü: 464.87 KB (476030 bytes)
MD5: 66357E47BBC2EC5694E2C5DE9CC3B9C6
SHA-1: CE9DB7DBF3368757C232AA960BBFA7B83278618D
Faylın import tablosunda standart kitabxanalar ilə yanaşı internet ilə bağlı əməliyyatlar aparmaq üçün winhttp və wininet kimi kitabxanalarıda import tablosunda gördük.
winhttp.dll
- WinHttpGetIEProxyConfigForCurrentUser
wininet.dll
- InternetOpenA
- InternetCloseHandle
- InternetConnectA
- InternetReadFile
- InternetSetOptionA
- HttpOpenRequestA
- HttpAddRequestHeadersA
- HttpSendRequestA
PE bölmələrində diqqətimizi çəkən bəzi məqamlar oldu. Burada fm qovluğu (TA-007) məqaləsi içərisində dropperin debug bölməsində qarşımıza çıxmışdı. Bir digər maraqlı məqam isə tərkib kodu faylının, fayl genişlənməsi (*.pas) idi. Bu bizə zərərvericinin Pascal dilində yazıldığı haqqında ipucu verirdi.
Zərərverici haqqında qısa məlumat aldıqdan sonra zərərvericini təhlükəsiz mühitdə işə salaraq dinamik olaraq hansı əməliyyatları icra etdiyini görmək istədik. Monitorinq üçün lazım olan alətlərini hazır etdikdən sonra zərərvericini işə saldıq. İlk olaraq fayl sistemində hansı əməliyyatları icra etdiyinə baxırıq. Standart əməliyyatlar xaricində maraqlı 3 əməliyyat yerinə yetirilirdi. %temp% qovluğunda update.lg adından fayl yaradaraq içərisində sistem haqqında məlumatların yazılması, %appdata%\Microsoft qovluğunda OneDrive\backup adında yeni bir qovluğun yaradılması və tapşırıq planlayıcısına (task scheduler) müraciət.
Update.lg faylının yaradılması:
Fayl aşağıda ki, məlumatları daşıyırdı.
İş qovluğu:
Tapşırıq paylayıcısı:
Başda yeni hansısa bir tapşırığı paylayıcıya əlavə etdiyini düşünsəkdə zərərverici tam tərsi əməliyyatı icra edirdi. Tapşırıq cədvəlindən Longhorn adında tapşırığı silmək üçün schtasks prosesini “/delete /f /tn Longhorn” parametri ilə çağırır.
Proses fəaliyyətlərindən sonra zərərvericinin reyestr üzərindən hansı əməliyyatları icra etdiyini görmək üçün reyetr fəaliyyətlərinə baxdıq. Burada ilk olaraq nəzərə çarpan zərərvericinin bir sonra ki, sistem başladılmasında özünü avtomatik olaraq işə sala bilməsi üçün Autorun-a yazdığını gördük. Gözdən yayınmaq üçün açar adını OneDriveUpdate olaraq təyin edir.
Lakin kiçik bir problem var idi. İmport tablosunda internet ile bağlı əməliyyatlar yerinə yetirmək üçün kitabxanaları import etməsinə baxmayaraq zərərvericini işə saldığımız zaman şəbəkə fəaliyyəti ilə bağlı heç bir əməliyyat qeydə almadıq.
Lakin bir müddətdən sonra şəbəkədə bəzi aktivliklər müşahidə etdik.
Vaxt damğalarına diqqət yetirdiyimiz zaman sorğuların müəyyən aralıqlar ilə göndərildiyinin şahidi olduq. Zərərverici əməliyyatları müəyyən vaxt aralıqlarında icra edirdi.
Daha sonra zərərvericinin yaradılan bağlantıdan sonra qarşı tərəfə hansı məlumatları göndərdiyini aydınlaşdırmaq istədik. Zərərverici HTTP üzərindən qarşı tərəfə POST sorğuları göndərirdi. Sorğuları analiz etdiyimiz zamanı aşağıda ki, nəticələri əldə etdik.
- b64 = məlumatın məzmunu base64 ilə kodlaşdırılan
- n = yüklənəcək faylın adı
- s = vaxt damğası
- t = komputer adı
Məlumatları deşifrə etdikdə aşağıda ki, məlumatları əldə etdik.
n=20221026192415.log
>>> f = open("data.bin","rb")
>>> data = f.read()
>>> f.close()
>>> import base64
>>> decoded = base64.b64decode(data)
>>> fout = open("decoded.log","wb")
>>> fout.write(decoded)
219
>>> fout.close()
Deşifrə edilən məlumat:
2022-10-26 19:24:15 -> Start session [20221026192415]
2022-10-26 19:24:15 -> -> C:\Users\
2022-10-26 19:24:15 -> -> D:\
2022-10-26 19:24:15 -> Next session in 49 minutes
2022-10-26 19:24:15 -> End
n=2022102618454_0.zip
>>> f = open("data.bin","rb")
>>> data = f.read()
>>> f.close()
>>> import base64
>>> decoded = base64.b64decode(data)
>>> chr(decoded[0]), chr(decoded[1])
('P', 'K')
>>> fout = open("decoded.bin","wb")
>>> fout.write(decoded)
146001
>>> fout.close()
>>> import zipfile
>>> z = zipfile.ZipFile("decoded.bin")
>>> z.namelist()
['~$0.0.filtertrie.intermediate.txt', '~$0.1.filtertrie.intermediate.txt', '~$0.2.filtertrie.intermediate.txt', '~$AppCache133112754268635833.txt', '~$AppCache133112758272534734.txt', '~$brndlog.txt', '~$commithash.txt', '~$Eula.txt', '~$LogFile_October_2_2022__9_43_21.txt', '~$manifest.txt', '~$SettingsCache.txt', '~$ThirdPartyNotices.txt']
Mətn fayllarına baxdığımız zaman tərkibində sistemə aid olan kritik məlumatlar yer alırdı. Zərərverici bu məlumatları ilk olaraq PTH_WORK qovluğu altında topladıqdan sonra lazımı vaxt aralıqlarında toplanan bu məlumatları ZIP arxiv halına salır və serverə upload edir.
Zərərverici haqqında bu məlumatları aldıqdan sonra keçdik zərərvericinin kodlarının analizinə.
Zərərverici ilk olaraq dropper kimi komanda sətri pəncərəsini gizlətməyə çalışır.
push 0 ; nCmdShow
call __$dll$kernel32$GetConsoleWindow
push eax ; hWnd
call __$dll$user32$ShowWindow ; Hide Window
Daha sonra dropper kimi proses mühitindən GetEnvironmentVariableA funksiyası ilə %temp% qovluğunun tam yolunu götürür və bunu "update.lg" mətni ilə birləşdirir.
lea edx, [ebp+var_4]
mov eax, offset aTemp ; "temp"
call P$ONEDRIVEUPDATE_$$_GE$ANSISTRING$$ANSISTRING ; %temp%
mov edx, [ebp+var_4]
mov eax, offset temp_path
call FPC_ANSISTR_ASSIGN ; assign tmp_path
mov edx, ds:temp_path
mov ecx, offset aUpdate_lg ; "\\update.lg"
lea eax, [ebp+var_8]
call fpc_ansistr_concat ; %temp%\update.lg
Daha sonra %temp% qovluğunda eyni adda yeni fayl yaradır. Yaradılan faylın içərisinə ilk olaraq "PTH_TMP: C:\\Users\\admin\\AppData\\Local\\Temp" dəyərini yazır.
Bu əməliyyatdan sonra cari proses yolunu götürərək buradan proses adını ayırır və sistemdə fəaliyyət göstərən proses adları ilə qarşılaşdırır. Bu əməliyyat üçün Toolhelp32 kitabxanasını istifadə edir. Bu qarşılaşdırmanın əsas məqsədi zərərli proqramın 2 dəfə işə salınmasının (duplicate process) qarşısını almaqdır. Əgər eyni adda proses öncədən işə salınıbsa proses özünü sonlandırır.
Növbəti icra edilən əməliyyat yenidən GetProcessEnvironmentA funksiyası ilə COMPUTERNAME dəyərinin götürülməsi və bunu ENV_CCN ilə birləşdirərək update.lg faylına yazmasıdır.
Daha sonra dXBkYXRlLmRhdA mətnini base64 ilə deşifrə edərək bunu işləmə qovluğu adı ilə birləşdirir. Daha sonra bu fayla kritik məlumatlar haqqında kritik loqlar yazılır.
mov eax, offset aDxbkyxrllmrhda ; dXBkYXRlLmRhdA== > update.dat
call BASE64DECODE
mov ecx, [ebp+var_4]
mov edx, ds:dword_445010 ; Iş qovluğu
mov eax, offset dword_445040
call STR_CONCAT
Bundan sonra isə zərərverici özünü növbəti sistem başladılması zamanı avtomatik işə düşməsi üçün P$ONEDRIVEUPDATE_$$_SS$$BOOLEAN funksiyasını çağırır.
Burada yazılacaq açar və dəyər base64 ilə kodlaşdırılıb.
Açar -> U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cUnVu (Software\\Microsoft\\Windows\\CurrentVersion\\Run)
Dəyər -> T25lRHJpdmVVcGRhdGU= (OneDriveUpdate). Zərərverici özünü avto işə salmaya yazdıqdan sonra Sleep funksiyası çağrılır.
Sleep əməliyyatından sonra zərərverici kritik <gccframe.P$ONEDRIVEUPDATE_$$_SCN> funksiyasını çağırır. Bu funksiya içərisində ilk olaraq GetLogicalDrives() funksiyasını çağırır. Bu funksiyanın köməkliyi ilə zərərverici sistemdə olan aktiv disk sürücülərinin siyahısını alır. Daha sonra bu sürücülərin sonuna “\\Users” əlavə edir. Əgər yaradılan yeni yol sistemdə mövcud olar isə bu qovluq və bu qovluğun alt qovluqlarını gəzməyə başlayır. (FindFirstFile və FindNextFile). Funksiya bütün fayl formatlarını (*.*) axtaracaq şəkildə çağrılır. Daha sonra PathFindExtensionA funksiyasının köməkliyi ilə fayl uzantısını götürür və zərərvericiyə lazım olan fayl uzantıları ilə qarşəlaşdırılır. Əgər fayl lazım olan uzantıya sahibdirsə fayl iş qovluğuna (%appdata%\Microsoft\OneDrive\Backup) köçürülür.
Axtarılan fayl uzantıları: [ .docx, .doc, .xlsx, .xls, .txt, .pdf ]
Lazım olan faylları topladıqdan sonra zərərverici P$ONEDRIVEUPDATE_$$_ARC funksiyasına müraciət edir. Bu funksiya içərisində backup qovluğunda olan (oğurlanan fayllar) zip arxiv içərisinə toplanır. Son olaraq isə zərərverici P$ONEDRIVEUPDATE_$$_LOG_SND
funksiyasını çağırır və toplanan məlumatları POST metodu ilə qarşı tərəfə göndərilir.