Selamlar millet, ben Sedat. Bugün biraz 'mutfakta' işlerin nasıl yürüdüğünden konuşalım istiyorum. Siber güvenlik dünyasında trendler o kadar hızlı değişiyor ki, bazen yetişmek için çift monitör yetmiyor. Eskiden bir dosyayı analiz etmek demek, onun MD5 veya SHA-256 hash değerini alıp VirusTotal'e atmak ve kırmızı renk görmeyince 'Tamam, bu güvenli' diyerek arkana yaslanmaktı. Peki ya artık 16 çekirdekli işlemci bekleyen, sadece belirli bir kurumun domain'inde çalışan veya analiz edildiğini anladığı an intihar eden 'akıllı' zararlılar kapımızdaysa? Mevzu artık sadece imzaya bakmak değil, canavarın karakterini çözmek.
İlk Bakış: Statik Analiz mi, Yoksa Fal Bakmak mı?
Bir dosya önüme geldiğinde ilk yaptığım şey onu çalıştırmak değildir. Bu, pimi çekilmiş bir bombayı kulağına dayayıp 'saat mi çalıyor?' diye dinlemeye benzer. Önce dışarıdan bakıyoruz. strings komutuyla o dosyanın içinde gömülü olan yazılara bakmak bazen altın değerindedir. Ama dikkat, profesyonel bir yazar (attacker) asla oraya http://attacker-c2-server.example.com yazmaz. Yazıyorsa ya çok acemidir ya da sizinle dalga geçiyordur.
Genelde karşımıza 'packed' (paketlenmiş) dosyalar çıkar. UPX gibi araçlarla sıkıştırılmış bir dosyayı açmadan analiz etmek imkansıza yakındır. PE (Portable Executable) başlıklarına (headers) daldığımızda, hangi kütüphaneleri çağırdığını görürüz. Mesela bir hesap makinesi uygulaması neden InternetOpenA veya WriteProcessMemory fonksiyonlarını çağırsın ki? İşte orada bir 'Hoppala!' diyoruz.
Kodun Kalbine İnmek (The 'Nitty-Gritty' Part)
Zararlı yazılımın asıl amacı kendini gizlemek ve hedefte kalıcı olmaktır. Gelin, tipik bir 'Process Injection' (Süreç Enjeksiyonu) mantığına göz atalım. Zararlı yazılım, sistemde güvenilir görünen bir süreci (mesela explorer.exe veya svchost.exe) gözüne kestirir.
İşte pseudo-kod seviyesinde bu 'çakallığın' nasıl döndüğü (Eğitim amaçlıdır, gerçek dünyada çalışmaz):
// Zararsızlaştırılmış (Defanged) Enjeksiyon Mantığı
void InjectIntoProcess(DWORD targetPid) {
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid);
// Bellekte yer ayıralım (Adeta bir otel odası tutuyoruz)
LPVOID remoteBuffer = VirtualAllocEx(hProcess, NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 'Zararsız' görünen kodumuzu o odaya yerleştirelim
unsigned char mockPayload[] = { 0x90, 0x90, 0xCC, 0xC3 }; // NOP, NOP, INT3, RET (Zararsız bir durdurma komutu)
WriteProcessMemory(hProcess, remoteBuffer, mockPayload, sizeof(mockPayload), NULL);
// Ve odayı uzaktan tetikleyelim
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL);
CloseHandle(hProcess);
}
Burada gördüğünüz VirtualAllocEx ve CreateRemoteThread ikilisi, güvenlik ekipleri için kıpkırmızı bir bayraktır. Eğer testCompany ağında bir uygulama durduk yere başka bir sürece bellek yazmaya çalışıyorsa, orada bir akşam kahvesi içip olayı incelemek şart demektir.
Kedi-Fare Oyunu: Sandbox ve Evasion
Analizciler zararlıyı 'Sandbox' dediğimiz izole ortamlarda çalıştırır. Ama malware yazarları da boş durmuyor. 'Anti-Analysis' ve 'Anti-VM' teknikleri artık standart paketle geliyor.
Zararlı yazılım sisteme girdiğinde şunları kontrol edebilir:
- Çekirdek Sayısı: 'Eğer sadece 1 veya 2 çekirdeğim varsa kesin bir analiz laboratuvarındayım, çalışma!'
- MAC Adresi: 'Eğer MAC adresim
08:00:27(VirtualBox) ile başlıyorsa hemen kendini sil!' - Kullanıcı Etkileşimi: 'Eğer mouse son 1 dakikadır hiç hareket etmediyse, bu bir insan değil otomatize bir sandbox'tır.'
Bu aşamada biz Red Team ekipleri olarak savunmacılara şunu öğretiyoruz: 'Sadece sandbox çıktısına güvenmeyin, sistemdeki davranışsal anomaliyi takip edin.'
Savunma Hattı: YARA Kuralları ile Avlanmak
Analiz bitti, zararlının karakterini çözdük. Peki bunu tüm kurumda nasıl arayacağız? İşte burada YARA devreye giriyor. YARA, malware analistlerinin İsviçre çakısıdır. Dosyalar içindeki belirli paternleri yakalamamızı sağlar.
Örnek bir 'Detection' kuralı yazalım:
rule Suspect_Injection_Behavior {
meta:
author = "Sedat Ozdemir"
description = "Potansiyel enjeksiyon tekniklerini tespit eden defanged kural"
strings:
$api1 = "VirtualAllocEx"
$api2 = "WriteProcessMemory"
$api3 = "CreateRemoteThread"
$magic_hex = { 4D 5A 90 00 } // Standart MZ header
condition:
$magic_hex at 0 and all of ($api*)
}
Bu kuralı SIEM veya EDR çözümlerinize entegre ettiğinizde, ağınızda dolaşan o sinsice gizlenmiş dosyaları 'Yakala!' diyerek kulağından tutabilirsiniz.
Son Söz Yerine: Gözünüzü Dört Açın
Malware analizi sadece 'disassembly' yapmak değildir; bir saldırganın zihnindeki labirentte yolunu bulmaktır. Teknoloji geliştikçe 'fileless malware' (dosyasız zararlılar) gibi daha karmaşık yapılarla karşılaşacağız. Unutmayın, en iyi savunma, saldırganın ne yapabileceğini bilmekten geçer.
testCompany örneğinde olduğu gibi, her zaman 'Zero Trust' felsefesiyle hareket etmek hayat kurtarır. Eğer bir dosya çok masum görünüyorsa, muhtemelen çok iyi gizlenmiştir. Bir sonraki teknik yazıda, bu canavarların C2 (Command and Control) sunucularıyla nasıl 'fısıldaştığını' inceleyeceğiz. O zamana kadar sistemlerinize iyi bakın, loglarınızı okumayı unutmayın!
