Computer Emergency Response Center

Agent Tesla qutu açılışı və "Matruşka" sənəti

.Net əsaslı zərərverici dövlət qurumlarına e-poçt xidməti üzərindən ACE arxiv içərisində göndərilmişdi. Zərərverici Anti-viruslar tərəfindən Agent-Tesla olaraq aşkarlanırdı və  olduqca kompleks şəkildə proqramlaşdırılmışdı. Xüsusi ilə iç-içə keçmiş zərərverici modullar bizə "Matruşka" oyuncaqlarını xatırladırdı. Bu səbəbədən olduqca uzun bir məqalə sizləri gözləyir.

Ace arxiv formatı uzun zamandır istifadə edilmədiyinə görə cari arxiv formatları ilə işləyən proqram təminatları bu formatı dəstəkləmirdi. Bunun üçün köhnə WinAce proqram təminatı ilə zərərverici arxiv içərisindən ixrac edildi.

Fayl adı: Document Doc_21530004532000342-JPG_23156412201

Fayl həcmi: 699.00 KB (715776 bytes)

Zərərverici 32 bitlik .Net əsaslı idi. Zərərvericiyə aid versiya məlumatları:

Analiz prosesinə zərərvericini təhlükəsiz mühitdə (virtual maşın) işə salaraq başladıq. Toplanan məlumatlar arasında bir neçə istisna xaric zərərverici əməliyyata rast gəlmədik. Bu isə zərərvericinin təhlükəsiz mühiti aşkarladığına işarə edirdi. Reyestr aktivliklərinə baxdıqda isə buna əmin olduq.

Vaxt itkisini mimumuma endirmək üçün ilk olaraq zərərvericini təmiz kompüter içərisində icra edərək ona aid aktivlikləri topladıq.

Agent Tesla proses aktivlikləri

İlk diqqətimizi cəlb edən məqam zərərvericinin bir neçə şübhəli prosesi başlatması oldu (bura zərərvericinin özünü yenidən işə salmasıda aiddir).

Loqların təhlili zamanı yaradılan proseslərin komanda sətirinə baxdıqda zərərvericinin, özünü və başqa bir icra edilə bilən faylı “Windows Defender” istisna siyahısına (exclusion list) əlavə etdiyinə şahid olduq.

PID:

8268

Command line:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" Add-MpPreference -ExclusionPath "C:\Users\admin\Desktop\Document Doc_21530004532000342-JPG_23156412201.exe"

PID:

1728

Command line:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" Add-MpPreference -ExclusionPath "C:\Users\admin\AppData\Roaming\bozPAnDilFxe.exe"

Bir digər maraqlı məqam zərərvericinin isə özünü Tapşırıq planlayıcısına (task scheduler) əlavə etməsi idi. Zərərverici tapşırıq planlayıcısına lazım olan parametrləri Temp qovluğunda yerləşən tmp1F5B.tmp XML formatında olan fayl üzərindən göndərir. Əlavə olaraq özündən əlavə daha bir icra edilə bilən faylı (AppData\Roaming\bozPAnDilFxe.exe) sistemə endirdiyinin şahidi olduq.

PID:

4700

Command line:

"C:\Windows\System32\schtasks.exe" /Create /TN "Updates\bozPAnDilFxe" /XML "C:\Users\admin\AppData\Local\Temp\tmp1F5B.tmp"

Zərərli prosesin modul aktivliklərinə baxdığımız zaman burada proses, soket, internet ilə bağlı əməliyyatların icra etdiyininin şahidi olduq. Maraqlı məqam isə sözü gedən modulların ilk icra edilən zərərverici tərəfindən deyil, zərərvericinin özünü işə saldığı 2-ci proses tərəfindən yüklənmələri idi. Bu isə bizdə zərərvericinin RunPE tərzi mexanizmindən istifadə etdiyi haqqında ciddi şübhələr yaratdı.

Yüklənən modullar:

  • C:\Windows\SysWOW64\bcrypt.dll
  • C:\Windows\SysWOW64\psapi.dll
  • C:\Windows\SysWOW64\ws2_32.dll

Agent Tesla reyestr aktivlikləri

Zərərverici Windows reyestr üzərində icra etdiyi əməliyyatlar arasında, virtual mühiti aşkar etməsi xaric növbəti sistem işə salınmasında başqa 3-cü bir faylı avtomatik olaraq işə düşə bilməsi üçün aşağıdakı açarı yaradırdı.

Yaradılan yeni açara aşağıdakı məlumatı yazırdı:

Type:

REG_SZ

Length:

92

Data:

C:\Program Files (x86)\WAN Monitor\wanmon.exe

Söze gedən açar zərərvericinin %appdata% qovluğunda yaratdığı fayldan əlavə daha bir faylı “C:\Program Files (x86)\WAN Monitor\wanmon.exe” yaratdığını deyirdi. Hər 2 fayl eyni xeş dəyərlərə sahib olduğundan zərərvericinin özünü %appdata% və %homedrive%\Program Files\WAN Monitor” qovluqlarına kopyaladığını göstərirdi. Wanmon.exe faylından fərqli olaraq %AppData%\ Roaming\ qovluğunda olan bozPAnDilFxe.exe xüsusi şəkildə gizlədilmiş və fayla müdaxilələrin qarşısını almaq üçün  xüsusi hüquqlar verilmişdi. Ehtimal ki, zərərverici bozPAnDilFxe.exe -ni qorumaq üçün wanmon.exe -ni qurban olaraq seçmişdi. Hər hansı bir şəkildə wanmon.exe ələ keçsə (aşkar edilməsi olduqca rahat idi (Windows reyestr üzərindən) ), digər kopya gizli qala bilsin.

Agent Tesla fayl aktivlikləri

Tesla ilk işə salındığı zaman AppData\Roaming\bozPAnDilFxe.exe faylını yaradır.  Özünü işə saldıqdan sonra isə yeni yaradılan proses tərəfindən wanmon.exe faylı yaradılır.

RunPE tərzi mexanizm ilə icra edilən 2-ci prosesə aid fayl aktivlikləri:

Agent Tesla şəbəkə aktivlikləri

2-ci zərərverici proses UDP protokolu üzərindən 37.235.1.[174, 177]  ünvanlarına 53(dns) - cü port üzərindən sorğular göndərirdi. Lakin göndərilən sorğulara qarşı tərəfdən cavab gəlmirdi.

Zərərverici haqqında səthi məlumatlaraa sahib olduqdan sonra kodlar üzərindən teslanın analiz prosesinə başladıq.

Əsas zərərverici icra edilən bilən fayl

ACE arxiv içərsində gələn əsas dropper özünü PacMan oyunu kimi qələmə verirdi. 

Əsas əməliyyatlara InitializeComponent method içərisidən başlayır. Resurs bölməsində obfuskasiya edilmiş şəkildə saxlanılan String1 adında resurs üzərində bəzi deobfuskasiya əməliyyatlarından sonra yeni bir .Net kitabxana faylı generasiya edirdi.

Resurs üzərində deobfuskasiya əməliyyatı icra etdikdən sonra kitabxana faylı Tigra.dll əldə etdik.

Tigra modulu

32 bitlik yeni kitabxana faylının orijinal adı: Tigra.dll

Fayl həcmi: 60.00 KB (61440 bytes)

Əsas icra edilə bilən zərərverici moduldan fərqli olaraq bu kitabxana faylı obfuskasiya edilmişdi. Metod adları, dəyişənlər və s. oxunaqlı deyildi.

Kitabxana faylı DeepSea Obfuscator ilə obfuskasiya edilmişdi. Deobfuskasiya edildikdən sonra çağrılacaq Dodge metodu:

public static void Dodge(string StringTypeInfo, string InputBlockSize, string EscapedIRemotingFormatter)
{
    Thread.Sleep(37665);
    string text = White.smethod_1();
    byte[] array = White.GZip(Convert.FromBase64String(text));
    Type type = White.smethod_3(array).GetType("MPV.Himentater");
    object obj = Activator.CreateInstance(type);
    StringTypeInfo = (string)type.GetMethod("CausalitySource").Invoke(obj, new object[] { StringTypeInfo });
    InputBlockSize = (string)type.GetMethod("CausalitySource").Invoke(obj, new object[] { InputBlockSize });
    Bitmap bitmap = White.LowestBreakIteration(StringTypeInfo, EscapedIRemotingFormatter);
    byte[] array2 = White.smethod_0(bitmap);
    array2 = (byte[])type.GetMethod("SearchResult").Invoke(obj, new object[] { array2, InputBlockSize });
    Assembly assembly = White.smethod_3(array2);
    White.smethod_2(assembly);
    Environment.Exit(0);
}

Metod ilk Thread.Sleep əmri ilə cari axının bir müddət gözləməsini təmin edir. Daha sonra başqa bir metod olan smethod_1 çağrılır. Bu metod içərisində base64 ilə kodlaşdırılmış mətn tərsinə çevrilmiş şəkildə saxlanılırdı. Zərərverici Str.Reverse metodu ilə kodlaşdırılan mətni tərsinə (orijinal vəziyyətinə) gətirir ve Dodge metoduna geri qaytarır.

Daha sonra geri qaytarılan base64 ilə kodlaşdırılmış mətn Convert.FromBase64String metodu ilə deşifrə edilir və White.Gzip metoduna parametr olaraq göndərilir. Oxşar əməliyyatları statik olaraq python üzərində icra edərək 3-cü kitabxana faylı Inspector.dll -i əldə etdik.

Inspector modulu

Əldə edilən yeni kitabxana faylının adı: Inspector.dll

Fayl həcmi: 16.00 KB (16384 bytes)

Bu metod içərisində növbəti kitabxana faylı dekompressiya edildikdən sonra smetod_3 metoduna göndərilərək proses yaddaşına yüklənir. Növbəti əməliyyat olaraq Dodge özünə parametr olaraq gələn StringTypeInfo -nu yeni yüklənən Inspector.dll modulunun CausalitySource metoduna parametr olaraq göndərir. Dodge metoduna əsas icra edilə bilən fayl tərəfindən aşağıdakı string tipində array göndərilir.

İlk olaraq arrayın 0. indeksində saxlanan “65736E42” hexa mətni CausalitySource metoduna göndərilir.

>>> binascii.unhexlify("65736e42")
b'esnB'

Daha sonra “esnB” ilə array içərisində 2-ci indeksdə olan məlumat “WindowsFormApp1LowestBreakIteration metoduna göndərilir. Bu metod içərisndə əsas icra edilə bilən faylın resurs bölməsində şifrələnmiş halda yerləşən “esnB” resursu Bitmap formatında geri qaytarılır.

esNB resursu:

Son olaraq əldə edilən rəsm faylı smethod_0 metoduna göndərilərək rəsmin pikselləri əldə olunur və əldə olunan piksellərdən ibarət array, Dodge metoduna parametr olaraq gələn string tipində array içərsində 1-ci indeksdə yerləşən hex formatında məlumat ilə birlikdə yaddaşa yeni yüklənən Inspector.dll içərisində ki, SearchResult metoduna göndərilir. SearchResult  geri qayıdan array isə yenidən proses yaddaşına yüklənir. Bu isə rəsm faylının pikselləri içərisində şifrələnmiş daha bir kitabxana faylının olduğuna işarə idi.

Dodge metoduna gələn string array içərisində olan açar: 0x646467 = "ddg"

SearchResult metodunun yer aldığı Inspector.dll kitabxanası ağır şəkildə obfuskasiya edilmişdi. Deobfuskasiya etməyə cəhd etsəkdə uğursuz oldu dinamik olaraq davam etdik.

Metodu diqqətlə analiz etdiyimiz zamanı özünə parametr olaraq gələn rəsm faylının pikselləri üzərində XOR şifrləmə metodunu istifadə etdiyinin şahidi olduq. Şifrə olaraq isə digər parametr olaraq gələn “ddg” mətnini istifadə edirdi. Deşifrləmə əməliyyatı üçün rəsm faylından götürülən pixellər üzərində XOR əməliyyatı icra edilir. Method ilk olaraq “ddg” mətnini UTF-16 big endian ilə kodlaşdırır. Lakin deşifrə əməliyyatı zamanı yalnız ilk 3 bayt istifadə edilir. Rəsm faylından əldə edilən məlumatlar ilk olaraq 0x85 daha sonra isə UTF-16_BE ilə kodlaşdırılan açar (“ddg” mətninin ilk 3 baytı  - [0x00, 0x64, 0x00] ) ilə XOR əməliyyatına salınır və yeni kitabxana faylı generasiya edilir. Python-da metodu təqlid edən kiçik bir skript yazaraq növbəti kitabxana faylını əldə etdik.

f = open("pixels.bin",'rb')
data = f.read()
f.close()

key = "ddg".encode("utf-16_be")[0:3]
i = 0
z = bytearray()

for c in range(len(data)):
	z.append(data[c] ^ 0x85 ^ key[i])
	i += 1
	if i == len(key):
		i = 0
		continue

f = open("collins.dll","wb")
f.write(z[0:len(data) - 1])
f.close()

Collins modulu

Əldə edilən yeni kitabxana faylı: Collins.dll

Fayl həcmi: 437.50 KB (448000 bytes)

Digər kitabxanalar kimi bu modulda güclü şəkildə obfukasiya edilmişdi və içərisində oxunaqlı heç bir məlumata rast gəlmədik.

Standart alətlər ilə deobfuskasiya etməyə cəhd etsəkdə uğursuz oldu. Son olaraq zərərverici kodlar arasında mətnləri obfuskasiya edən funksiya üzərindən məlumatları deobfuskasiya etməyə cəhd etdik. Nəticə tam ürək açan olmasada bəzi oxunaqlı məlumatlar əldə edildi.

Adını Anti-VM olaraq dəyişdirdiyimiz metod içərisində zərərverici bir çox metodlardan istifadə edərək virtual maşınları, sandbox sistemlərini aşkar etməyə cəhd edir.

Zərərverici cari istifadəçi adını aşağıdakılar ilə qarşılaşdırır (və ya içərisində olub olmadığına) və əgər nəticələr müsbət olarsa işini sonlandırır.

  • SCHMIDTI
  • MALWARE
  • SANDBOX
  • USER
  • CURRENTUSER
  • VIRUS

Zərərverici cari faylın işə düşdüyü qovluq (path) içərisində aşağıdakıları axtarır.

  • SANDBOX
  • \\VIRUS
  • C:\\file.exe
  • SAMPLE

Zərərverici GetModuleHandle funksiyası ilə “SbieDll.dll” kitabxanasına handle almaq istəyir. Sözü gedən kitabxana Sophos firmasının sandbox proqram təminatına (Sandboxie) aid kitabxana faylıdır. https://community.sophos.com/sandboxie/

FindWindow funksiyası ilə pəncərələr arasında “Afx:400000:0” axtarır.

Zərərverici Windows Reyestr üzərindən virtual maşınları (VMWARE, QEMU, VIRTUALBOX) aşkar etməyə çalışır. Bunun üçün aşağıdakı reyestr açarlarına müraciət edir.

  • "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", "Identifier"
  • "HARDWARE\\Description\\System", "SystemBiosVersion"
  • "HARDWARE\\Description\\System", "VideoBiosVersion"
  • "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", "Identifier"
  • "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 1\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", "Identifier"
  • "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 2\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", "Identifier"
  • "SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\Settings", "Device Description"
  • "SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000", "DriverDesc"
  • "SYSTEM\\ControlSet001\\Services\\Disk\\Enum", "0"
  • "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0", "Identifier"
  • "SOFTWARE\\VMware, Inc.\\VMware Tools", "InstallPath"

Zərərverici GetProcAddress(GetModuleHandle(“kernel32.dll”), “wine_get_unix_file_name”) ilə WineHQ emulator içərisində işləyib işləmədiyini sorğulayır.

Son olaraq zərərverici WMI (Windows Management Instrumentation - \\\\.\\ROOT\\cimv2) üzərindən SELECT * FROM Win32_VideoController[Description] sorğusunu icra edərək aşağıdakıları sorğulayır.

  • VM Additions S3 Trio32/64
  • S3 Trio32/64
  • VirtualBox Graphics Adapter
  • VMware SVGA II

Statik kod analizi üzərindən yuxarıda qeyd etdiyimiz dinamik analiz loqlarından əldə etdiyimiz bəzi metodlarada rast gəldik.

Zərərverici sistemdən silinməsinin qarşısı almaq məqsədi ilə DirectorySecurity sinifindən istifadə edərək ixrac etdiyini kopyasına xüsusi hüquqlar verir.

Zərərvericinin özünü Windows Defender istisna siyahısına əlavə etməsi.

Zərərverici Endir və İcra et funksionallığına malik olmasına baxmayaraq hər hansı bir fayl internet üzərindən endirilmirdi. Metod konfiqurasiya əsaslı icra edilirdi. Sözü gedən metoda yükləmə keçidi olaraq public static string f000030 (0 dəyəri mənimsədilmişdi) verilmişdi.

Zərərverici 2 dəfə işə salınmanın qarşısını almaq üşün Mutex obyektindən istifadə edir. Obyekt adı olaraq "WfndXGisdcTIalGq" mətnindən istifadə edir. Əgər sözü gedən obyekt sistemdə mövcuddursa zərərverici fəaliyyətini sonlandırır.

 

RunPE mexanizmi və əsas faydalı yükün işə salınması

Tesla  son olaraq əsas zərərverici modulu işə salmaq üçün aşağıdakı yolları izləyir.
İlk olaraq Collins modulu içərsində ki, "VyH9TIPReR" metodu çağrılır və sözü gedən metod, Collins kitabxanasının resurs bölməsində yerləşən "lfJWi0I1Y0tFSBRbwy" adlı binary resursu (bilərəkdən zədələnmiş və deflate ilə sıxışdırılmış məlumat) götürür. Daha sonra bu məlumat üzərində bəzi düzəltmə əməliyyatları (bura obfuskatorun zərərvericiyə aid olmayan bir çox riyazi əməliyyatlarıda daxildir) icra etdikdən sonra System.IO.Compression.DeflateStream sinifi yaradılır və sıxışdırılmış məlumat decompress edilərək içərisində əsas zərərverici modulu (RAT) saxlayan yeni modulu generasiya edir . Generasiya edilən modul yaddaşa yüklənir.

f0329aad-ddd4-46d4-b2fe-5c2499b132de modulu

Əldə edilən yeni kitabxana faylı: f0329aad-ddd4-46d4-b2fe-5c2499b132de.dll

Fayl həcmi: 210.00 KB (215040 bytes)

Modul hər hansı bir kod icra etmir. Əsas məqsədi resurs bölməsində şifrələnmiş halda RAT modulunu saxlamasıdır. "VyH9TIPReR" metodunun ardınca Collins kitabxanasınin "FJXhiRjZ2" metodu çağrılır. Bu isə bizə lazım olan və RunPE mexanizmi ilə əsas faydalı yükü işə salan metoddur. Metod "f0329aad-ddd4-46d4-b2fe-5c2499b132de" modulunun resurs bölməsində şifrələnmiş (XOR) halda saxlanılan "gE8OpJk8fU" adlı binary resursu oxuyur və "RlszPuzs" açarı ilə deşifrə edir.

Desifrələmə əməliyyatını təqlid edən python skripti:

key = bytearray("RlszPuzs".encode())
data = bytearray(open("gE8OpJk8fU", 'rb').read())

dlen = len(data)

keylen = len(key)

for i in range(dlen + 1):
	data[i % dlen] = (data[i % dlen] ^ key[i % keylen]) - data[(i + 1) % dlen] & 0xFF

f = open("nano_core_decrypted.bin",'wb')
f.write(data[0:len(data) - 1])
f.close()

Sözü gedən əməliyyarı icra etdikdən sonra öz kopyasını CreateProcess funksiyası ilə (CREATE_SUSPENDED) işə salır.

Daha sonra ZwUnmapViewOfSection funksiyası ilə yeni yaradılan prosesin əsas modul yaddaşı boşaldılır və deşifrə edilən əsas faydalı icra edilə bilən fayl yeni prosesin yaddaşına yazılaraq ResumeThread funksiyası ilə işə salınır və proses fəaliyyətini sonlandırır. Bundan sonra isə əsas işləri yeni yaradılan proses icra edir.

NanoCore RAT

Yuxarıda göstərdiyimiz bütün metodlar və mexanizmlər NanoCore RAT-ın sistemə yeridilməsi üçün nəzərdə tutulmuşdu. 37.235.1.x ilə bağlantı qurulmadığı üçün qarşı tərəf haqqında geniş məlumat edə bilməsəkdə NanoCore haqqında aşağıdakı məlumatları əldə etdik. Deşifrə edilən bu modulda obfuskasiya edilmişdi.

Deobfuskasiyadan sonra:

RAT-ı proqramlayan şəxs Taylor Huddleston 2017-ci ildə Amerika Birləşmiş Ştatları Federal Təhqiqat Bürosu (FBI) tərəfindən HƏBS EDİLMİŞDİR.

Standart RAT proqramlarına bənzəyir və istifadəçiyə yoluxan kompüterə uzaqdan girişə imkan yaradır. Bundan əlavə olaraq sistemdə kritik məlumatları oğurlamaq üçün kifayət qədər funksionallığa malikdir.

  • Müraciət edilən faylllar
  • Keylogger
  • Aktiv pəncərələrin siyahısı
  • Browser yaddaşında saxlanılan istifadəçi adları və şifrələr
  • Clipboard məlumatları və s.

Toplanan loglar AppData qovluğu altında toplanır.

Zərərvericinin test-i zamanı sistemdən toplanan məlumatlara aid rəsm:

 

İnternet üzərində NanoCore və funksionallıqları haqqında kifayət qədər məlumat olduğu üçün (istinadlar bölməsi) məqaləni burada sonlandırırıq.

 

IOCs

MD5: 7C67021612D168FA2110517F394707C1
SHA-1: AF1C4BEA54CDF9DC8138185721D0F3FD3C1910D1
MD5: B2D0625C46714E40A6A38238659EA9ED
SHA-1: DC43D5D539EAB67B7E3109D0E4894E099A1A18F8
MD5: 89AC57478044C57C7195943116A521E0
SHA-1:  1FF2BAFEED795423E3538D810BDA8E1E3FCDCFA5
MD5: 4EDA36732E8B9FBF6E0BBD4C77CB0308
SHA-1: 8D56C3FED89AED5A68AD3DB2BA9DD115B9A203D7
MD5: 6FBD09EE63094D9121C3450C3CDA830D
SHA-1: 51357CC3E5B03E5903FDDBAF3B475B6E96151685
MD5: B13A01704A90EE656E2A0E3A8A257F52
SHA-1: 162DE532407068763D1BE7342982009082C73CBF

IP:

37.235.1.174
37.235.1.177

 

İstinadlar

[1] https://medium.com/@the_abjuri5t/nanocore-rat-hunting-guide-cb185473c1e0
[2] https://www.fbi.gov/news/stories/malware-creator-sentenced-070518

 

Press ESC to close