Windows Güvenlik Olayı Sonrası Sistem Analizi Nasıl Yapılır

Gece 02:30’da telefonun çaldığını düşün. Ekibinden biri “bir şeyler var, loglar çılgına döndü” diyor. Bu senaryoyu yaşayan her sysadmin bilir: panik değil, metodoloji seni kurtarır. Windows ortamında bir güvenlik olayı yaşandığında ne yapacağını, nereye bakacağını ve kanıtları nasıl toplayacağını bilmek, olayı kapatıp kapatamaycağın ile sistemi tamamen kaybetmen arasındaki farkı belirler.

Bu yazıda gerçek dünyadan örnekler ve araçlarla, bir Windows güvenlik olayı sonrasında sistem analizini adım adım ele alacağız.

Önce Sakin Ol, Sonra İzole Et

Bir güvenlik olayının hemen ardından yapılan en büyük hata, sistemi hemen yeniden başlatmak ya da antivirüsü çalıştırıp “temizlendi” yazısı görünce geçip gitmektir. RAM’deki veriler, aktif ağ bağlantıları ve çalışan süreçler kaybolur. Bunlar adli analiz açısından altın değerinde.

Önce şunu yap: sistemi ağdan izole et ama kapat ma. Eğer fiziksel erişimin varsa network kablosunu çek ya da switch portunu devre dışı bırak. Sanal makineyse snapshot al, sonra ağ adaptörünü disconnect et.

Canlı Sistem Analizi (Live Forensics)

Sistem hâlâ ayaktayken toplayabileceğin bilgiler kritik öneme sahip.

Çalışan Süreçleri İncele

Şüpheli bir sistemde ilk bakacağın yer çalışan süreçler olmalı.

# Tüm çalışan süreçleri, yollarıyla birlikte listele
Get-Process | Select-Object Name, Id, Path, StartTime, CPU | 
    Sort-Object CPU -Descending | 
    Format-Table -AutoSize

Bu komut sana hangi sürecin ne zaman başladığını, diskten nereden çalıştığını gösterir. C:UsersPublic veya C:Temp gibi alışılmadık dizinlerden çalışan süreçler hemen dikkat çekiyor olmalı.

# Süreçlerin ağ bağlantılarıyla eşleştir
Get-NetTCPConnection -State Established | 
    Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, 
    @{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).Name}},
    @{Name="ProcessPath";Expression={(Get-Process -Id $_.OwningProcess).Path}} |
    Format-Table -AutoSize

Yukarıdaki komutla hangi sürecin dışarıya bağlantı açtığını görebilirsin. powershell.exe ya da cmd.exe‘nin beklenmedik bir IP adresine bağlandığını görürsen, bu command and control (C2) trafiğinin işareti olabilir.

Zamanlanmış Görevleri Kontrol Et

Saldırganların kalıcılık sağlamak için en çok kullandığı yöntemlerden biri zamanlanmış görevler (Scheduled Tasks).

# Tüm zamanlanmış görevleri detaylı incele
Get-ScheduledTask | Where-Object {$_.State -ne "Disabled"} | 
    Select-Object TaskName, TaskPath, State,
    @{Name="Actions";Expression={($_.Actions | ForEach-Object {$_.Execute + " " + $_.Arguments}) -join "; "}} |
    Where-Object {$_.Actions -match "powershell|cmd|wscript|cscript|mshta|rundll32"} |
    Format-List

mshta.exe, wscript.exe, cscript.exe ile çalışan görevler özellikle şüpheli. Meşru uygulamalar genellikle bu yorumlayıcıları zamanlanmış görev olarak kullanmaz.

Otomatik Başlangıç Noktaları (Autoruns)

# Registry autorun anahtarlarını kontrol et
$runKeys = @(
    "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionRun",
    "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionRunOnce",
    "HKCU:SOFTWAREMicrosoftWindowsCurrentVersionRun",
    "HKCU:SOFTWAREMicrosoftWindowsCurrentVersionRunOnce"
)

foreach ($key in $runKeys) {
    Write-Host "`n[*] $key" -ForegroundColor Yellow
    Get-ItemProperty -Path $key -ErrorAction SilentlyContinue | 
        Select-Object * -ExcludeProperty PS*
}

Bu komutun çıktısında tanımadığın, uzun rastgele isimli ya da base64 içeren girişler varsa bunları not al ve kayıt altına al.

Windows Event Log Analizi

Event loglar, ne olduğunu anlamanın en güvenilir yoludur. Ancak doğru loglama yapılandırılmamışsa bu kaynaklar yetersiz kalabilir. Gerçek dünya senaryosunda müşterilerden birinin ortamında bir olayı incelerken 4688 (Process Creation) loglarının kapalı olduğunu gördüm. Kritik kanıtların büyük bölümü yoktu. Olaydan sonra değil, önceden audit policy’ni yapılandır.

Kritik Event ID’leri

Hesap ve Kimlik Doğrulama Olayları:

  • 4624: Başarılı oturum açma
  • 4625: Başarısız oturum açma
  • 4648: Açık kimlik bilgileriyle oturum açma girişimi
  • 4672: Yönetici haklarıyla oturum açma
  • 4720: Yeni kullanıcı hesabı oluşturulması
  • 4728 / 4732: Gruba üye eklenmesi (özellikle Administrators grubu)
  • 4756: Universal gruba üye eklenmesi

Süreç ve Komut Olayları:

  • 4688: Yeni süreç oluşturulması (komut satırı dahil)
  • 4698: Zamanlanmış görev oluşturulması
  • 4702: Zamanlanmış görev güncellenmesi
  • 7045: Yeni servis kurulumu

PowerShell Olayları:

  • 4103: Module logging (PowerShell komutları)
  • 4104: Script block logging (PowerShell script içeriği)
# Son 24 saatteki başarısız oturum açma denemelerini say
$startTime = (Get-Date).AddHours(-24)

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = $startTime
} -ErrorAction SilentlyContinue | 
    Group-Object {$_.Properties[5].Value} | 
    Sort-Object Count -Descending |
    Select-Object Name, Count |
    Format-Table -AutoSize
# Yönetici grubuna son eklenen hesapları bul
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4728
} -MaxEvents 50 | ForEach-Object {
    [PSCustomObject]@{
        TimeCreated = $_.TimeCreated
        SubjectAccount = $_.Properties[6].Value
        MemberAccount = $_.Properties[0].Value
        GroupName = $_.Properties[2].Value
    }
} | Format-Table -AutoSize

Bu sorgu ile kimin gruba eklendiğini, kimin eklediğini ve tam zamanını görebilirsin. Bir saldırı senaryosunda bu çıktı sana lateral movement’ın izini verebilir.

Ağ Trafiği ve Bağlantı Analizi

Mevcut Bağlantılar ve Dinleme Portları

# Tüm ağ bağlantılarını süreç bilgisiyle göster
netstat -ano | findstr ESTABLISHED

# Dinleme durumundaki tüm portları listele
Get-NetTCPConnection -State Listen | 
    Select-Object LocalAddress, LocalPort, 
    @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name}},
    @{Name="ProcessPath"; Expression={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Path}} |
    Sort-Object LocalPort

Beklenmedik portlarda (özellikle yüksek port numaralarında, 4444, 8080, 1337 gibi) dinleyen servisler var mı? Metasploit’in default listener portu 4444’tür, bunu unutma.

DNS Sorgu Geçmişi

Windows’ta DNS cache’i incelemek, hangi domainlere bağlantı kurulduğunu gösterir.

# DNS önbelleğini görüntüle
Get-DnsClientCache | 
    Select-Object Entry, RecordName, RecordType, TimeToLive, DataLength, Data |
    Sort-Object Entry |
    Format-Table -AutoSize

DGA (Domain Generation Algorithm) kullanan zararlı yazılımlar genellikle rastgele oluşturulmuş, anlamsız domain adlarına bağlanır. xkjhsd23.ru gibi bir girişi DNS cache’inde görüyorsan bu kırmızı bayrak.

Dosya Sistemi Analizi

Son Değiştirilen Dosyalar

Saldırının zaman dilimini belirledikten sonra o süre içinde değiştirilen dosyalara bakabilirsin.

# Son 48 saatte değiştirilen .exe ve .dll dosyalarını bul
$cutoff = (Get-Date).AddHours(-48)

Get-ChildItem -Path "C:WindowsSystem32" -Include "*.exe","*.dll" -Recurse -ErrorAction SilentlyContinue |
    Where-Object {$_.LastWriteTime -gt $cutoff} |
    Select-Object FullName, LastWriteTime, Length, 
    @{Name="Hash"; Expression={(Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash}} |
    Format-List

Meşru Windows sistem dosyaları nadiren değişir. System32 içinde yeni veya değiştirilmiş bir dosya görmen DLL hijacking ya da binary replacement saldırısına işaret edebilir.

Prefetch Dosyaları ile Çalıştırılan Programlar

Prefetch, hangi programların çalıştırıldığını kayıt altına tutan bir Windows özelliği.

# Prefetch dosyalarını tarih sırasına göre listele
Get-ChildItem "C:WindowsPrefetch" -Filter "*.pf" |
    Sort-Object LastWriteTime -Descending |
    Select-Object Name, LastWriteTime, Length |
    Select-Object -First 30 |
    Format-Table -AutoSize

Burada tanımadığın araçlar var mı? MIMIKATZ, PSEXEC, WMIEXEC, COBALT gibi string içeren prefetch dosyaları görmek istediğin son şey.

Mimikatz ve Credential Dumping Tespiti

Gerçek bir olay incelemesinde karşılaştığım en yaygın senaryo: saldırgan içeriye giriyor, privilege escalation yapıyor, sonra credential dumping ile domain admin şifresini ele geçiriyor.

# LSASS erişimini loglardan tespit et (Sysmon Event ID 10 gerektirir)
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -ErrorAction SilentlyContinue | 
    Where-Object {$_.Id -eq 10 -and $_.Message -match "lsass"} |
    Select-Object TimeCreated, 
    @{Name="SourceProcess"; Expression={$_.Properties[5].Value}},
    @{Name="TargetProcess"; Expression={$_.Properties[6].Value}},
    @{Name="GrantedAccess"; Expression={$_.Properties[9].Value}} |
    Format-Table -AutoSize

Sysmon olmayan sistemlerde alternatif olarak Security loglarına bakabilirsin:

# LSASS erişim denemelerini Security loglarından bul (Event ID 4656)
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4656
} -MaxEvents 100 -ErrorAction SilentlyContinue | 
    Where-Object {$_.Message -match "lsass"} |
    Select-Object TimeCreated, Message |
    Format-List

PowerShell Loglarını Analiz Etme

Saldırganların büyük çoğunluğu artık “living off the land” yaklaşımıyla PowerShell kullanıyor. Script block logging aktifse bu altın maden.

# Şüpheli PowerShell aktivitelerini tara
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -ErrorAction SilentlyContinue |
    Where-Object {$_.Id -eq 4104} |
    Where-Object {
        $_.Message -match "IEX|Invoke-Expression|DownloadString|WebClient|
        Base64|EncodedCommand|bypass|hidden|noprofile|
        Net.WebClient|System.Net|FromBase64String"
    } |
    Select-Object TimeCreated, @{Name="ScriptBlock"; Expression={$_.Message}} |
    Format-List

Bu sorgu sana encoded komutları, web’den dosya indirme girişimlerini ve execution policy bypass denemelerini gösterecek. Gerçek bir olayda bu logların çıktısını alıp analiz ederken Invoke-Expression (New-Object Net.WebClient).DownloadString( gibi satırlar görmek kasıkları sızlatır.

Kanıt Toplama ve Dokümantasyon

Analiz sırasında bulduklarını kayıt altına almadan ilerleme. Bu hem hukuki süreçler hem de post-mortem raporlama açısından kritik.

# Kapsamlı sistem snapshot'ı al ve dosyaya kaydet
$outputPath = "C:Forensics$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Path $outputPath -Force

# Çalışan süreçler
Get-Process | Select-Object * | Export-Csv "$outputPathprocesses.csv" -NoTypeInformation

# Ağ bağlantıları
Get-NetTCPConnection | Select-Object * | Export-Csv "$outputPathnetwork_connections.csv" -NoTypeInformation

# Zamanlanmış görevler
Get-ScheduledTask | Select-Object * | Export-Csv "$outputPathscheduled_tasks.csv" -NoTypeInformation

# Yüklü servisler
Get-Service | Select-Object * | Export-Csv "$outputPathservices.csv" -NoTypeInformation

# Son güvenlik logları
Get-WinEvent -LogName Security -MaxEvents 5000 | 
    Export-Csv "$outputPathsecurity_events.csv" -NoTypeInformation

Write-Host "Forensic veriler $outputPath altına kaydedildi." -ForegroundColor Green

Topladığın tüm dosyaların SHA256 hash’lerini de kaydet. Bu bütünlük doğrulaması için gerekli.

Sysmon Yoksa Hemen Kur

Eğer ortamında Sysmon yoksa, bir olayı analiz etmeye çalışırken elinin bağlı olduğunu hissedeceksin. Olay sonrası bile olsa hemen kurabilirsin, bir dahaki olaya hazırlıklı olursun.

# Sysmon kurulumu (Sysinternals'tan indirdikten sonra)
sysmon64.exe -accepteula -i sysmonconfig.xml

# Temel bir config ile başlayabilirsin (SwiftOnSecurity config önerilir)
# https://github.com/SwiftOnSecurity/sysmon-config

# Kurulum doğrulama
sc query sysmon64

Sysmon’un sağladığı görünürlük, varsayılan Windows loglamasının çok ötesinde. Özellikle Event ID 3 (Network connections), Event ID 7 (Image loaded) ve Event ID 10 (Process access) olayları credential dumping ve lateral movement tespitinde çok değerli.

Olaydan Sonra Yapılması Gerekenler

Analizi tamamladıktan sonra sıra remediasyon ve önlemlere geliyor.

Acil adımlar:

  • Kompromize olmuş hesapların şifrelerini sıfırla ve oturumlarını sonlandır
  • Tespit edilen zararlı dosyaları karantinaya al (silme, delil olarak sakla)
  • Saldırganın kullandığı C2 IP ve domain adreslerini firewall’da engelle
  • Açıkça tespit edilmiş güvenlik açıklarına patch uygula
  • Yeni oluşturulan kullanıcı hesaplarını ve grup üyeliklerini gözden geçir

Orta vadeli önlemler:

  • Audit policy’yi gözden geçir ve eksik loglama noktalarını kapat
  • PowerShell Constrained Language Mode ve AMSI’yi etkinleştir
  • LAPS (Local Administrator Password Solution) ile local admin şifre yönetimini otomatikleştir
  • Privileged Access Workstation (PAW) konseptini değerlendir
  • EDR çözümü yoksa mutlaka bir tane değerlendir

Uzun vadeli iyileştirmeler:

  • Zero Trust mimarisine geçiş planı hazırla
  • Incident Response playbook’larını yaz ve test et
  • Tabletop egzersizleri ile ekibini hazırla

Gerçek Dünya Senaryosu: Ransomware Öncesi Tespiti

Bir bankacılık sektörü müşterisinde yaşadığımız bir olayda, monitoring sistemi gece yarısı anormal PowerShell aktivitesi alerti üretti. Sisteme bağlandığımızda:

  • C:ProgramData altında ismi rastgele oluşturulmuş bir .exe çalışıyordu
  • Bu süreç, domain controller’a SMB üzerinden bağlanmaya çalışıyordu
  • Zamanlanmış görevler arasında base64 encoded PowerShell komutu içeren yeni bir görev vardı
  • Security loglarında 3 farklı kullanıcı hesabının son 2 saatte brute force ile kırıldığı görünüyordu

Ransomware’in deployment aşamasından yaklaşık 4 saat önce tespit edebildik. Sistemi izole ettik, IOC’leri çıkarttık ve SIEM’e besledik. O gecenin analiz notları 6 aylık bir güvenlik iyileştirme projesinin temelini oluşturdu.

Bu hikayenin dersi şu: görünürlük olmadan güvenlik kör uçuştur.

Sonuç

Bir Windows güvenlik olayı sonrası analiz, panikle değil metodoloji ile yapılır. Önce sistemi izole et ama kapatma. Canlı sistemdeki verilerini topla, event logları incele, ağ bağlantılarını ve süreçleri analiz et. Kanıtları kayıt altına al, hash’le.

Ama asıl mesaj şu: reaktif değil proaktif ol. Sysmon kurulu değilse hemen kur. Audit policy’ler eksikse hemen tamamla. Log retention süren 7 günse bunu artır. Bir olay olmadan önce bu altyapıyı hazırlaman, olayı yaşadıktan sonra “keşke” demeni önler.

Sysadmin olarak en önemli görevlerinden biri, bir şeyler ters gittiğinde eli yüzü düzgün bir soruşturma yürütebilecek altyapıyı önceden hazırlamaktır. Bu yazıdaki araçlar ve komutlar sana başlangıç noktası verir, ancak her ortam farklıdır. Kendi ortamına özgü “normal”i bilmeden “anormal”i tespit edemezsin. Bu yüzden baseline’larını oluştur, izlemeye başla ve hazırlıklı ol.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir