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

cyber-security

Kum Havuzunda Kim Var? Zararlı Yazılım Analizinin Labirentleri ve O Bitmek Bilmeyen 'Kedi-Fare' Oyunu

Zararlı yazılım analizi artık sadece 'strings' komutuyla çözülmüyor. EDR'ları atlatan, sandbox'ı fark eden o sinsi kodların peşine düşüyoruz.

Sedat Özdemir
· 4 dk okuma

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.

  1. 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
    }
    
  2. 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.exe gidip de powershell.exe üzerinden uzak bir IP'ye bağlanmaya çalışıyor?' sorusunu sistemin sormasını sağlamalıyız.

  3. 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 AppData klasö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!

İlgili yazılar