Ötən il Laboratoriyamızda ən çox araşdırılan müraciətlər dövlət qurumlarına, xüsusilə mərkəzi və yerli icra orqanlarına göndərilən zərərverici ilə bağlı olmuşdur. Məlumat oğurluğu məqsədi daşıyan bu zərərverici qurumlara e-poçt vasitəsilə göndərilmişdir. “Azərbaycan Respublikasının Qanununun tətbiqi ilə tanış olun” məzmunlu məktublarda cloud.mail.ru, bəzi nümunələrdə isə mega.nz xidmətlərinə keçid linkləri yerləşdirilmişdir.

Sözügedən keçidə daxil olduqda özünü “Office Word” sənədi kimi göstərən, saxta Word ikonu ilə təqdim olunan bir ədəd icra edilə bilən fayl (“Fərdi məlumatlar haqqında.exe”) aşkar etdik. Qeyd etdiyimiz kimi, zərərvericinin müxtəlif nüsxələri mövcud olduğundan məqalədə ən son göndərilən nüsxənin texniki analizinə yer verilmişdir.
Dropper
10 695 868 bayt həcmində olan “Respublikasının qanunu.exe” adlı zərərverici C# dilində yazılmışdır. İlkin araşdırma zamanı kodların obfuskasiya edildiyini aşkar etdik.

Deobfuskasiya əməliyyatından sonra zərərverici daxilindəki mətnlərin də müxtəlif metodlarla şifrələndiyini müşahidə etdik. Bu məqsədlə iki metoddan istifadə edilmişdi: XOR və AES.
XOR istifadə olunaraq şifrələnmiş, kritik əhəmiyyət daşımayan məlumatlar aşağıdakı metod vasitəsilə deşifrə edilirdi:
static Class9()
{
for (int i = 0; i < byte_0.Length; i++)
{
byte_0[i] = (byte)(byte_0[i] ^ i ^ 0xAA);
}
}
Kiçik python skripti ilə açıq məlumatları əldə etdik.
f = open("xor.dat","rb")
a = f.read()
f.close()
text = ""
for i in range(len(a)):
x = (a[i] ^ i ^ 0xAA) & 0xFF
text += chr(x)

AES vasitəsilə nisbətən daha vacib məlumatlar (C2 ünvanı, istifadəçi adı, şifrə və s.) şifrələnmişdi. Deşifrələmə üçün tələb olunan məlumatlar (açar və başlanğıc vektoru) XOR ilə deşifrə edilən məlumatların içərisində Base64 formatında saxlanılmışdı.

Deşifrələmə əməliyyatından sonra müəyyən etdik ki, zərərverici əvvəlcə sistemdə yalnız bir nüsxəsinin fəaliyyət göstərdiyinə əmin olur, daha sonra isə virtual mühitdə olub-olmadığını təyin etmək üçün bir sıra yoxlamalar həyata keçirir:
- IsDebuggerAttached() metodu ile debug edilib edilmədiyi;
- Sistemdə olan sürücü həcmlərinin 60 GB üstündə olması;
- Sistemdə fəaliyyət göstərən proseslər arasında aşağıdakı adların olub-olmadığı: [vmtoolsd, vmwaretray, vmwareuser, vmacthlp, vboxservice, vboxtray, vbox];
- Fiziki Yaddaşın 4 GB və ondan yuxarı olub-olmadığı habelə 1GB yaddaş ayırıb ayırabilmədiyi;
- WMI sorğusu (SELECT * FROM Win32_ComputerSystem) ilə cihaz istehsalçısı və model məlumatları arasında aşağıdakıların olub-olmadığı: [vmware, inc., microsoft corporation, xen, qemu, virtual machine, kvm, bosch];
- WMI sorğusu (SELECT * FROM Win32_Processor) sorğusu ilə prosesor adı və versiya məlumatları arasında aşağıdakıları axtarır: [hypervisor]
Ardınca zərərverici C2 hostunun doğrulanması üçün C2/search.php? ünvanına sorğu göndərir. Bu sorğuya hər dəfə unikal, Base64 formatında cavab qaytarılır. Cavab əldə etdikdən sonra 32 baytlıq məlumatın ikinci 16 baytlıq hissəsinin əvvəlinə 03012020 mətnini əlavə edir və bunun MD5 dəyərini hesablayır. Əldə edilən MD5 dəyəri gələn 32 baytlıq məlumatın ilk 16 baytı ilə eyni olarsa, zərərverici fəaliyyətinə davam edir. Əks halda, proses sonlandırılır.

Daha sonra istifadəçini yayındırmaq üçün resurs bölməsində saxlanılan saxta Word sənədini %temp% qovluğuna ixrac edir və işə salır.

Daha sonra zərərverici cari istifadəçinin masaüstündə “my.txt” adlı faylı və onun daxilində “I_AM_ALIVE \r\n” mətnini axtarır. Əgər bu fayl mövcuddursa, fəaliyyətini sonlandırır. Bu isə sözügedən zərərvericinin sistemə daha əvvəl yoluxduğunu göstərir.
Son yoxlamadan sonra dropper sistemdə sonrakı mərhələdə fəaliyyət göstərəcək əsas zərərverici nüsxəni endirməyə başlayır. İlk olaraq, asinxron şəkildə sistemdə Windows Updates adlı yeni tapşırıq yaradır.

Tapşırığın yaradılması ilə paralel olaraq, zərərverici sistemdə daha sonra daimi fəaliyyət göstərəcək nüsxəni “C2/default/paloaltu.jpg” ünvanından sistemə (“c:\Users\Admin\AppData\Roaming\Windows_Automatization_Tool\QS60092140.exe) endirir.

URL-ə müraciət zamanı avtorizasiya üçün tələb olunan giriş məlumatlarını, yəni istifadəçi adı və şifrəni AES ilə şifrələnmiş məlumatlardan əldə edir. Zərərvericinin bundan sonrakı fəaliyyətləri sistemə endirdiyi nüsxə ilə eyni olduğundan analiz prosesinə sistemə endirilən əsas nüsxə üzərindən davam edirik.
2-ci hissə
Sistemə endirilən və Tapşırıq Planlayıcısı vasitəsilə işə düşən yeni modulun dropperdən əsas fərqi serverlə bağlantı qura bilmədiyi halda GitHub üzərindən əldə etdiyi şəkil faylından alternativ IP ünvanı çıxarma funksionallığına malik olması idi.

Sözügedən IP və ya IP-lər şəkil faylının daxilində steqanoqrafiya metodu ilə gizlədilmişdi.


Zərərli proqramın C2 (Command and Control) server infrastrukturunu iflic etmək məqsədilə, müvafiq GitHub repozitoriyası barədə GitHub təhlükəsizlik komandasına rəsmi şikayət (take-down request) göndərilmişdir.
Analiz etdiyimiz nüsxə GitHub hesabından Heydər Əliyevə məxsus şəkli endirir və daha sonra həmin faylın pikselləri arasında gizlədilmiş IP ünvanını əldə edir.

Python skripti ilə gizlədilmiş İP-ni əldə etdik.
from PIL import Image
import array
from bitarray import bitarray
def smethod_3():
img = Image.open("2.png")
width, height = img.size
pixels = img.load()
arr = array.array('B')
for y in range(height):
for x in range(width):
r, g, b, a = pixels[x, y]
arr.extend([r,g,b])
return arr
def smethod_2(byte_0, int_0, int_1):
num = int_1 * 8
num2 = int_0 * 8
array = bitarray(endian='little')
for i in range(num):
if (byte_0[i + num2] % 2) == 1:
array.append(True)
else:
array.append(False)
array2 = bytearray(len(array) // 8)
array2 = array.tobytes()
return array2
def main():
pixels = smethod_3()
int_ = smethod_2(pixels, 0, 4)
z = int.from_bytes(int_, 'little')
ip = smethod_2(pixels, 4, z)
print(ip)
if __name__ == '__main__':
main()
File stealer
Son olaraq zərərverici istifadəçiyə məxsus Desktop, Download və Pictures qovluqlarında yerləşən faylları C2 serverinə yükləyir. Yükləmə zamanı sözügedən qovluqlarda olan gizli fayllar, həmçinin .exe, .iso və .dll uzantılı fayllar istisna edilir.

Indicators of Compromises
QS2022193938.exe
MD5: 756001275cd18c3fb9f84b85d0af4001
SHA-1: 86ac9cf988c4cf3bcde9e9d817ff7d032be59102
SHA-256: cab78aebb5a246f36cc162f581902c985feb262bd039f2ea60e62f1e1cac6c62
RESPUBLİKASININ QANUNU.exe
MD5: 2723a93a5bdd5dc986b0fb9e52dc0860
SHA-1: 319b7ab6c47fe29e3047fbec5092c28f544bc00a
SHA-256: 54f37e0c984b21153f154eb2cd16b19152e8df10587222c53fee04c1c78f9f13
2.png
MD5: 1992ede511446c537725fac0e708d600
SHA-1: 5dbee2c9a6609546753529fd2c4fabfe20d74410
SHA-256: 4017cecd4a45908e7871057fae68a6dffc6efc1a65d83bfe63852f6dc1003b12