Saat 03:14’tü. Ekranın mavi ışığı gözlerimi acıtırken, testCompany’nin ana veri merkezindeki bir sunucudan gelen o kritik 'Process Injection' uyarısı tüm uykumu dağıtmaya yetti. EDR (Endpoint Detection and Response) ekranında gördüğüm manzara pek iç açıcı değildi: Standart bir notepad.exe süreci, sistemde olması gerekenden çok daha fazla ağ trafiği yaratıyor ve şüpheli bir IP adresine (127.0.0.1 - defanged) veri sızdırmaya çalışıyordu. İşte o an anladım ki, yine bir 'fileless' (dosyasız) malware vakasıyla karşı karşıyayız ve önümüzdeki birkaç saat boyunca kahve en yakın dostum olacak.
Siber güvenlik dünyasında biz Red Teamciler genelde sızma tarafındayızdır ama işin mutfağını, yani 'malware'ın nasıl çalıştığını bilmeden gerçek bir savunma kurgulamanız imkansızdır. Bugün size, o gece analiz ettiğimiz o 'canavarın' anatomisini ve bir malware analistinin zihninden geçenleri anlatacağım. Amacımız, bu zararlıların nasıl gizlendiğini anlamak ve sistemlerimizi buna göre zırhlandırmak.
İlk Temas: Statik Analizin Sınırları
Elimizde sadece bellekten dump ettiğimiz (dışarı aktardığımız) şüpheli bir binary vardı. İlk yaptığım iş, dosyanın parmak izini (hash) almak ve bilinen veritabanlarında aratmak oldu. Sonuç? Koca bir sıfır. Saldırgan, dosyayı o ana özel (FUD - Fully Undetectable) paketlemişti. Statik analiz, yani dosyayı çalıştırmadan inceleme aşamasında strings komutuyla içine baktığımızda, sadece anlamsız karakter dizileri ve yoğun bir entropi (karmaşıklık) gördük.
Eğer bir binary'nin entropisi çok yüksekse, bilin ki o dosya ya sıkıştırılmıştır (packed) ya da şifrelenmiştir (encrypted). Saldırganlar, analiz araçlarından kaçmak için gerçek niyetlerini bu şekilde gizlerler.
# Bir dosyanın entropisini ölçmek için basit bir pseudo-kod
import math
def calculate_entropy(data):
if not data:
return 0
entropy = 0
for x in range(256):
p_x = float(data.count(chr(x))) / len(data)
if p_x > 0:
entropy += - p_x * math.log(p_x, 2)
return entropy
# Eğer sonuç 7.0'ın üzerindeyse, orada bir 'paketleyici' (packer) vardır diyebiliriz.
Dinamik Analiz: Labirentte Koşmak
Statik analiz bizi bir yere götürmeyince, güvenli ve izole edilmiş 'sandbox' ortamımıza geçtik. Burada amaç, zararlıyı kontrollü bir ortamda koşturup ne yaptığını izlemek. Zararlı notepad.exe içine kendini enjekte ettikten sonra ilk iş olarak kernel32.dll üzerinden VirtualAllocEx ve WriteProcessMemory fonksiyonlarını çağırdı. Bu, siber güvenlik dünyasının en eski ama en etkili numaralarından biridir: Process Hollowing.
Saldırgan, meşru bir sürecin içini boşaltıp, kendi zararlı kodunu oraya yerleştiriyor. Dışarıdan bakan bir sistem yöneticisi sadece çalışan bir not defteri görüyor, ancak arka planda o not defteri sizin Active Directory hash'lerinizi çalıyor olabilir.
Bu aşamada ağ trafiğini izlediğimizde, zararlının example-c2-server.com (defanged) adresine HTTP POST istekleri attığını gördük. Ancak isteklerin gövdesi de şifreliydi. İşte burada tersine mühendislik (reverse engineering) devreye giriyor.
Kodun İçine Dalış: Obfuscation ve Deobfuscation
Zararlı, analiz edilmesini zorlaştırmak için inanılmaz katmanlı bir Base64 ve XOR mantığı kullanıyordu. PowerShell üzerinden yürütülen o meşhur tek satırlık (one-liner) kodun bir benzerini aşağıda basitleştirilmiş ve zararsızlaştırılmış haliyle görebilirsiniz:
# Defanged/Zararsızlaştırılmış örnek kod yapısı
$k = [System.Text.Encoding]::ASCII.GetBytes('MY_SECRET_KEY');
$b = [System.Convert]::FromBase64String('aGVsbG8gd29ybGQ='); # Buradaki payload çok daha uzundur
for($i=0; $i -lt $b.length; $i++) { $b[$i] = $b[$i] -bxor $k[$i % $k.length] };
[System.Reflection.Assembly]::Load($b); # Belleğe yükleme noktası
Buradaki [System.Reflection.Assembly]::Load($b) komutu aslında her şeyin bittiği yerdir. Zararlı kod hiçbir zaman diske yazılmaz, sadece RAM üzerinde yaşar. Bu yüzden geleneksel antivirüsler genelde bunu kaçırır. Bizim burada yapmamız gereken, o XOR işlemini tersine çevirip bellekteki gerçek 'payload'u yakalamaktı.
Defansif Yaklaşım: Ne Yapmalı?
Peki, testCompany'deki bu sızıntıyı nasıl durdurduk ve siz kendi ortamınızda neler yapabilirsiniz? Sadece bir EDR'a güvenmek yetmez, derinlemesine savunma (Defense in Depth) şart.
- Sysmon Kullanımı: Windows sistemlerde Sysmon (System Monitor) kurun. Özellikle Event ID 1 (Process Creation) ve Event ID 8 (CreateRemoteThread) olaylarını izlemek, bu tarz enjeksiyon saldırılarını yakalamanın en iyi yoludur.
- PowerShell Hardening: PowerShell'i 'Constrained Language Mode'a çekin ve 'Script Block Logging'i aktif edin. Saldırgan ne kadar karmaşıklaştırırsa karmaşıklaştırsın, script çalıştığı anda deobfuscate edilmiş hali loglara düşecektir.
- YARA Kuralları: Şüpheli aktiviteleri veya dosya imzalarını taramak için YARA kuralları yazın. Örneğin, yukarıdaki enjeksiyon tekniğini yakalamak için şöyle basit bir kural hayat kurtarabilir:
rule Suspicious_Process_Injection {
strings:
$s1 = "VirtualAllocEx"
$s2 = "WriteProcessMemory"
$s3 = "CreateRemoteThread"
condition:
uint16(0) == 0x5A4D and all of ($s*)
}
Geceyi Bitirirken
Sabahın ilk ışıklarıyla birlikte o zararlının sadece bir 'credential stealer' (kimlik bilgisi hırsızı) olduğunu, şans eseri kritik sunuculara henüz ulaşamadığını tespit ettik. Sistemi temizledik, IP adreslerini blokladık ve ilgili hesapların şifrelerini rotasyona soktuk.
Malware analizi sadece bir dosyayı parçalarına ayırmak değildir; o, saldırganın zihnindeki satranç hamlelerini okumaktır. Unutmayın, en iyi savunma, saldırganın bir sonraki adımını bilen savunmadır. Bir sonraki kriz anında, o analiz raporunun başında kimin olacağı size kalmış.
Şimdi, biraz uyku ve taze bir kahveyi hak ettim sanırım. Güvenli kalın dostlar.
