Pass-the-Hash Saldırılarını Engelleme Yöntemleri

Bir Windows ortamında çalışıyorsanız ve güvenlik üzerine kafa yoruyorsanız, Pass-the-Hash (PtH) saldırıları muhtemelen en çok endişelenmeniz gereken konuların başında geliyor. Özellikle Active Directory ortamlarında bu tür saldırılar, saldırganlara domain’in tamamını ele geçirme fırsatı tanıyabiliyor. Bu yazıda PtH saldırılarının nasıl çalıştığını, gerçek dünya senaryolarıyla neden bu kadar tehlikeli olduğunu ve en önemlisi bunu nasıl önleyeceğinizi detaylıca ele alacağız.

Pass-the-Hash Nedir ve Nasıl Çalışır?

Windows, kullanıcı parolalarını düz metin olarak saklamak yerine NTLM hash formatında depolar. PtH saldırısında saldırgan, parolanın kendisini değil bu hash değerini ele geçirerek kimlik doğrulaması yapabiliyor. Yani parolayı bilmenize gerek yok, sadece hash yeterli.

Saldırının tipik akışı şu şekilde işliyor:

  • Saldırgan bir makineye erişim sağlar (phishing, exploit vb.)
  • LSASS process’inden hash dump’ı alır
  • Bu hash ile ağdaki diğer sistemlere lateral movement yapar
  • Yüksek yetkili hesapların hash’ini ele geçirirse domain admin seviyesine ulaşır

Gerçek dünyada bu senaryoyu çok sık görüyoruz. Bir muhasebe çalışanının makinesi phishing ile ele geçiriliyor, o makinede daha önce IT personeli uzak bağlantı yapmış ve hash bellekte kalmış. Saldırgan bu hash ile IT sunucularına erişiyor ve oradan domain controller’a ulaşıyor. Tüm bu süreç bazen birkaç saat içinde gerçekleşebiliyor.

Temel Savunma Katmanları

PtH saldırılarına karşı tek bir sihirli çözüm yok. Katmanlı güvenlik yaklaşımı şart. Aşağıdaki adımları sırayla ve birlikte uygulamanız gerekiyor.

1. Protected Users Security Group Kullanımı

Windows Server 2012 R2 ile gelen Protected Users güvenlik grubu, yüksek yetkili hesaplar için kritik bir koruma sağlıyor. Bu gruba eklenen hesaplar için:

  • NTLM kimlik doğrulaması devre dışı kalıyor
  • Credential caching engelliyor
  • Kerberos için DES veya RC4 encryption kullanılamıyor
  • Kerberos TGT süresi maksimum 4 saat ile sınırlanıyor

Domain admin hesaplarını bu gruba eklemek için:

# Protected Users grubuna hesap ekleme
Add-ADGroupMember -Identity "Protected Users" -Members "domain_admin_hesabi"

# Grubun mevcut üyelerini kontrol etme
Get-ADGroupMember -Identity "Protected Users" | Select-Object Name, SamAccountName

# Birden fazla admin hesabını toplu ekleme
$adminAccounts = @("admin1", "admin2", "svc_account1")
foreach ($account in $adminAccounts) {
    Add-ADGroupMember -Identity "Protected Users" -Members $account
    Write-Host "$account Protected Users grubuna eklendi" -ForegroundColor Green
}

Dikkat: Servis hesaplarını bu gruba eklemeden önce mutlaka test edin. NTLM’e bağımlı servisler çalışmayı durdurabilir.

2. Credential Guard Yapılandırması

Windows 10/11 ve Windows Server 2016+ sistemlerde Credential Guard, LSASS’ı sanallaştırma tabanlı güvenlik (VBS) ile izole ediyor. Bu sayede hash dump araçları LSASS’a erişemiyor.

Group Policy üzerinden etkinleştirme:

Computer Configuration > Administrative Templates > System > Device Guard
> Turn On Virtualization Based Security

PowerShell ile durumu kontrol etme:

# Credential Guard durumunu kontrol et
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace rootMicrosoftWindowsDeviceGuard | 
    Select-Object SecurityServicesRunning, SecurityServicesConfigured

# Daha detaylı bilgi için
(Get-CimInstance -ClassName Win32_DeviceGuard -Namespace rootMicrosoftWindowsDeviceGuard).SecurityServicesRunning
# 1 = Credential Guard çalışıyor
# 2 = HVCI çalışıyor

# Registry üzerinden kontrol
Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLSA" -Name "LsaCfgFlags"

Registry üzerinden manuel etkinleştirme (test ortamları için):

# Credential Guard'ı registry üzerinden etkinleştir
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLSA" `
    -Name "LsaCfgFlags" -Value 1 -Type DWord

# UEFI lock ile etkinleştirme (daha güvenli, devre dışı bırakmak daha zor)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLSA" `
    -Name "LsaCfgFlags" -Value 2 -Type DWord

Write-Host "Değişiklikler için sistem yeniden başlatılmalı" -ForegroundColor Yellow

3. NTLM’i Kısıtlama veya Devre Dışı Bırakma

NTLM protokolünün kendisi PtH saldırılarının temel taşıyıcısı. Ortamınızda NTLM kullanımını kısıtlamak veya tamamen devre dışı bırakmak uzun vadeli en etkili çözümlerden biri.

Önce NTLM kullanımını audit edin:

# NTLM audit modunu etkinleştir - önce neyin NTLM kullandığını görelim
$auditPath = "HKLM:SYSTEMCurrentControlSetControlLsaMSV1_0"

# Gelen NTLM trafiğini logla
Set-ItemProperty -Path $auditPath -Name "AuditReceivingNTLMTraffic" -Value 2 -Type DWord

# Giden NTLM trafiğini logla  
Set-ItemProperty -Path $auditPath -Name "RestrictSendingNTLMTraffic" -Value 1 -Type DWord

# Event log'ları kontrol et
Get-WinEvent -LogName "Microsoft-Windows-NTLM/Operational" -MaxEvents 50 | 
    Select-Object TimeCreated, Message | 
    Format-List

Group Policy üzerinden NTLM kısıtlaması:

Computer Configuration > Windows Settings > Security Settings > 
Local Policies > Security Options

Network security: Restrict NTLM: NTLM authentication in this domain
> Deny all

Network security: Restrict NTLM: Incoming NTLM traffic  
> Deny all accounts

Ortamınızda eski sistemler veya NTLM’e bağımlı uygulamalar varsa tümden devre dışı bırakmak yerine whitelist yaklaşımı daha sağlıklı:

# NTLM exception listesi oluşturma (GPO ile de yapılabilir)
$exceptionPath = "HKLM:SYSTEMCurrentControlSetControlLsaMSV1_0"
$allowedServers = "legacyserver01.domain.local`nlegacyserver02.domain.local"

Set-ItemProperty -Path $exceptionPath `
    -Name "ClientAllowedNTLMServers" `
    -Value $allowedServers `
    -Type MultiString

4. Local Administrator Password Solution (LAPS)

PtH saldırılarının en hızlı yayıldığı senaryo şu: Tüm makinelerde aynı local admin parolası kullanılıyor. Saldırgan bir makinenin hash’ini alıyor ve bu hash ile yüzlerce makineye bağlanabiliyor.

Microsoft LAPS, her makinenin local administrator parolasını otomatik olarak benzersiz hale getiriyor ve Active Directory’de şifreli saklıyor.

LAPS kurulumu ve yapılandırması:

# LAPS PowerShell modülünü yükle (Windows LAPS - Server 2019+)
# Eski LAPS için: Import-Module AdmPwd.PS

# Windows LAPS için AD şemasını güncelle
Update-LapsADSchema

# OU bazlı LAPS izinlerini ayarla
Set-LapsADComputerSelfPermission -Identity "OU=Workstations,DC=domain,DC=local"

# IT admins grubunun şifreleri okuyabilmesi için izin ver
Set-LapsADReadPasswordPermission -Identity "OU=Workstations,DC=domain,DC=local" `
    -AllowedPrincipals "DOMAINIT-Admins"

# LAPS politikasını GPO ile dağıt
# Computer Configuration > Administrative Templates > System > LAPS
# Enable local admin password management: Enabled
# Password Settings: Complexity = 4, Length = 20, Age = 30 gün

# Bir makinenin LAPS parolasını okuma
Get-LapsADPassword -Identity "WORKSTATION01" -AsPlainText

LAPS durumunu toplu kontrol etme:

# Hangi makinelerde LAPS aktif, hangilerinde değil
$computers = Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=domain,DC=local" `
    -Properties ms-Mcs-AdmPwdExpirationTime, "msLAPS-PasswordExpirationTime"

foreach ($computer in $computers) {
    $lapsStatus = if ($computer."msLAPS-PasswordExpirationTime" -or 
                      $computer."ms-Mcs-AdmPwdExpirationTime") { 
        "LAPS Aktif" 
    } else { 
        "LAPS YOK - RISK!" 
    }
    
    Write-Host "$($computer.Name): $lapsStatus"
}

5. Restricted Admin Mode ve Remote Credential Guard

Restricted Admin Mode, RDP bağlantılarında kimlik bilgilerinin uzak sistemde önbelleklenmesini engelliyor. Normal RDP bağlantısında kullanıcı adı ve hash uzak sistemin belleğine yazılır, Restricted Admin Mode’da ise bu olmaz.

# Restricted Admin Mode'u etkinleştir (hedef sunucularda)
Set-ItemProperty -Path "HKLM:SystemCurrentControlSetControlLsa" `
    -Name "DisableRestrictedAdmin" -Value 0 -Type DWord

# Remote Credential Guard için (Windows 10/Server 2016+)
# Bu mod Kerberos kullanarak kimlik bilgilerini istemcide tutar

# GPO ile zorunlu kılma:
# Computer Configuration > Administrative Templates > System > Credentials Delegation
# Restrict delegation of credentials to remote servers: Require Remote Credential Guard

Restricted Admin Mode ile RDP bağlantısı:

# Restricted Admin Mode ile bağlanma
mstsc.exe /restrictedAdmin /v:hedef-sunucu.domain.local

# Remote Credential Guard ile bağlanma
mstsc.exe /remoteGuard /v:hedef-sunucu.domain.local

6. Privileged Access Workstation (PAW) Mimarisi

Gerçek dünyada en kritik ama en çok atlanan konu bu. Domain admin hesaplarıyla normal iş istasyonlarından bağlantı kurmak, saldırganlara büyük bir hediye sunuyor.

PAW yaklaşımında:

  • Yönetim işlemleri sadece bu iş istasyonlarından yapılır
  • PAW makineleri internete çıkmaz, e-posta okunamaz
  • PAW’dan sadece yönetim trafiğine izin verilir
  • Normal kullanıcılar bu makinelere erişemez

PAW izolasyonu için Windows Firewall kuralları:

# PAW makinesinde sadece yönetim subnet'ine çıkışa izin ver
$mgmtSubnet = "10.10.1.0/24"  # Yönetim VLAN'ı
$pawIP = "10.10.1.50"         # Bu PAW'ın IP'si

# Giden trafiği kısıtla - sadece DC ve sunucu subnet'lerine izin ver
New-NetFirewallRule -DisplayName "PAW - Allow Management Subnet" `
    -Direction Outbound `
    -RemoteAddress $mgmtSubnet `
    -Action Allow

New-NetFirewallRule -DisplayName "PAW - Block Internet" `
    -Direction Outbound `
    -RemoteAddress "Internet" `
    -Action Block

# Gelen trafiği kısıtla
New-NetFirewallRule -DisplayName "PAW - Allow Inbound from Management Only" `
    -Direction Inbound `
    -RemoteAddress $mgmtSubnet `
    -Action Allow

New-NetFirewallRule -DisplayName "PAW - Block All Other Inbound" `
    -Direction Inbound `
    -Action Block

Write-Host "PAW firewall kuralları uygulandı" -ForegroundColor Green

7. Monitoring ve Detection

Önleme kadar önemli olan şey, saldırıyı tespit edebilmek. PtH saldırılarında takip etmeniz gereken event ID’leri:

  • 4624: Başarılı logon (Logon Type 3 = Network, özellikle NTLM ile olanlara bakın)
  • 4625: Başarısız logon denemeleri
  • 4648: Açık credential ile logon girişimi
  • 4672: Admin haklarıyla logon
  • 4776: NTLM credential doğrulaması
# Şüpheli NTLM lateral movement tespiti
# Son 24 saatte farklı makinelerden aynı hesapla logon girişimleri

$startTime = (Get-Date).AddHours(-24)

$suspiciousEvents = Get-WinEvent -ComputerName "DC01" -FilterHashtable @{
    LogName = 'Security'
    Id = 4624
    StartTime = $startTime
} | Where-Object {
    $xml = [xml]$_.ToXml()
    $logonType = $xml.Event.EventData.Data | 
        Where-Object { $_.Name -eq 'LogonType' } | 
        Select-Object -ExpandProperty '#text'
    $authPackage = $xml.Event.EventData.Data | 
        Where-Object { $_.Name -eq 'AuthenticationPackageName' } | 
        Select-Object -ExpandProperty '#text'
    
    # Network logon + NTLM kombinasyonu şüpheli
    $logonType -eq '3' -and $authPackage -eq 'NTLM'
}

# Sonuçları gruplama
$suspiciousEvents | ForEach-Object {
    $xml = [xml]$_.ToXml()
    [PSCustomObject]@{
        TimeCreated = $_.TimeCreated
        UserName = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
        SourceIP = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
        WorkstationName = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq 'WorkstationName' }).'#text'
    }
} | Group-Object UserName | Where-Object { $_.Count -gt 5 } | 
    Select-Object Name, Count | 
    Sort-Object Count -Descending

Proaktif hash dump girişimi tespiti için Sysmon kullanımı öneriyorum. LSASS’a erişim girişimlerini loglamak için:

<!-- sysmon_config.xml - LSASS erişim tespiti için -->
<Sysmon schemaversion="4.82">
  <EventFiltering>
    <!-- LSASS process erişimini izle -->
    <RuleGroup name="LSASS Access Detection" groupRelation="or">
      <ProcessAccess onmatch="include">
        <TargetImage condition="is">C:Windowssystem32lsass.exe</TargetImage>
      </ProcessAccess>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

Sysmon’u bu config ile yüklemek için:

# Sysmon kurulumu
.Sysmon64.exe -accepteula -i sysmon_config.xml

# Sysmon event'lerini kontrol etme (Event ID 10 = Process Access)
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 100 | 
    Where-Object { $_.Id -eq 10 } | 
    Select-Object TimeCreated, Message | 
    Format-List

Tier Model ile Privilege Segregation

Microsoft’un Active Directory Tier Model yaklaşımı PtH saldırılarının yayılmasını kesmek için en güçlü mimari çözümlerden biri.

Katmanlar şu şekilde tanımlanıyor:

  • Tier 0: Domain Controller’lar, AD yönetimi (en kritik)
  • Tier 1: Uygulama sunucuları, veritabanı sunucuları
  • Tier 2: İş istasyonları, son kullanıcı cihazları

Her tier için ayrı admin hesapları ve her tier’ın kendi içine hapsolması prensiple çalışıyor. Tier 2 admin hesabı Tier 1’e giremez, Tier 1 admin hesabı Tier 0’a giremez.

GPO ile tier geçişlerini engellemek için Authentication Policy Silo kullanabilirsiniz:

# Authentication Policy Silo oluşturma
New-ADAuthenticationPolicySilo -Name "Tier0-Silo" `
    -Description "Domain Controller yönetimi için" `
    -Enforce

# Policy oluşturma
New-ADAuthenticationPolicy -Name "Tier0-Policy" `
    -Description "Sadece PAW'lardan giriş" `
    -UserTGTLifetimeMins 60 `
    -Enforce

# Silo'ya policy atama
Set-ADAuthenticationPolicySilo -Identity "Tier0-Silo" `
    -UserAuthenticationPolicy "Tier0-Policy"

# Admin hesabını silo'ya ekleme
Add-ADAccountAuthenticationPolicySilo -Identity "tier0_admin" `
    -AuthenticationPolicySilo "Tier0-Silo"

WDigest Authentication’ı Devre Dışı Bırakma

Eski Windows sistemlerinde WDigest authentication açıksa, parolalar bellekte açık metin olarak saklanıyor. Bu Mimikatz gibi araçlar için hediye paketi demek.

# WDigest'i devre dışı bırak (tüm sistemlerde yapılmalı)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest" `
    -Name "UseLogonCredential" -Value 0 -Type DWord

# Mevcut durumu kontrol et
$wdigestValue = Get-ItemProperty `
    -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest" `
    -Name "UseLogonCredential" -ErrorAction SilentlyContinue

if ($wdigestValue.UseLogonCredential -eq 0) {
    Write-Host "WDigest devre disi - GUVENLI" -ForegroundColor Green
} elseif ($wdigestValue.UseLogonCredential -eq 1) {
    Write-Host "WDigest AKTIF - RISK!" -ForegroundColor Red
} else {
    Write-Host "WDigest registry degeri bulunamadi - varsayilan olarak devre disi olabilir" -ForegroundColor Yellow
}

# Tüm domain bilgisayarlarında toplu kontrol
$computers = Get-ADComputer -Filter * -Properties DNSHostName
foreach ($computer in $computers) {
    try {
        $value = Invoke-Command -ComputerName $computer.DNSHostName -ScriptBlock {
            Get-ItemProperty `
                -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest" `
                -Name "UseLogonCredential" -ErrorAction SilentlyContinue
        } -ErrorAction Stop
        
        $status = if ($value.UseLogonCredential -eq 1) { "RISK" } else { "Guvenli" }
        Write-Host "$($computer.Name): $status"
    } catch {
        Write-Host "$($computer.Name): Erisilemedi" -ForegroundColor Yellow
    }
}

Gerçek Dünya Senaryosu: Bir Saldırıyı Durdurmak

Birkaç yıl önce bir müşterinin ortamında tam bu senaryoyla karşılaştık. Sabah 2’de alarm geldi: Bir finans çalışanının makinesi fidye yazılımı dropper’ı indirmişti. Güvenlik ekibi hızlı hareket etti ve o makineyi izole etti.

Ancak sabah incelediğimizde gördük ki saldırgan o makineye yaklaşık 6 saat önce erişmiş ve bu sürede 3 farklı IT hesabının hash’ini dump’lamıştı. Neyse ki o ortamda Credential Guard aktifti ve hash’ler kullanılamamıştı. LAPS sayesinde de lateral movement girişimleri başarısız olmuştu.

Eğer bu iki kontrol olmasaydı, finans sistemlerine ve Active Directory’nin tamamına erişim büyük ihtimalle gerçekleşirdi. Savunma katmanları hayat kurtardı.

Bu deneyimden çıkan ders şu: Saldırıyı tamamen önleyemeyebilirsiniz, ama yayılmasını engelleyebilirsiniz.

Sonuç

Pass-the-Hash saldırıları, yeterli önlemler alındığında büyük ölçüde engellenebilir veya en azından radius’u sınırlandırılabilir. Özetlemek gerekirse öncelik sırasına göre yapmanız gerekenler:

  • Hemen: WDigest’i kapatın, LAPS’ı dağıtın, Protected Users grubunu kullanın
  • Kısa vadede: Credential Guard’ı etkinleştirin, NTLM audit’i başlatın
  • Orta vadede: PAW mimarisini kurun, Tier Model’e geçin, NTLM’i kademeli kısıtlayın
  • Sürekli: Monitoring kurallarını aktif tutun, anomalileri takip edin

Hiçbir güvenlik önlemi yüzde yüz koruma sağlamaz. Ama saldırganın işini yeterince zorlaştırırsanız, çoğu zaman daha kolay hedeflere geçerler. Derinlemesine savunma yani defense in depth anlayışıyla her katmanı güçlendirmek, PtH saldırılarına karşı en gerçekçi yaklaşım olmaya devam ediyor.

Sorularınız veya farklı senaryolarınız varsa yorumlarda paylaşın, konuyu birlikte tartışalım.

Yorum yapın