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

active-directory

Kabuk Aldın, Peki Ya Sonra? İç Ağın Karanlık Labirentlerinde Sessizce İlerlemek

Sızma testlerinde 'shell' almak işin sadece başlangıcıdır. Gerçek oyun, o kısıtlı yetkili kullanıcıdan domain adminliğine uzanan o ince ve riskli yolda başlar.

Sedat Özdemir
· 4 dk okuma

mimikatz.exe "privilege::debug" "lsadump::lsa /inject" komutunu bastığın an SOC ekibinin ekranında kırmızı alarmlar yanmıyorsa, o şirket için asıl sorun yeni başlıyor demektir. Birçok pentest raporunda 'sisteme sızıldı' maddesini görürsün ama sızdıktan sonra içeride ne kadar kalındığı ve nelerin manipüle edilebildiği asıl yetkinliği gösterir. Bugün, o ilk girişi (initial access) yaptıktan sonra iç ağda nasıl hayalet gibi dolaşılır ve savunma ekipleri bu hayaletleri nasıl yakalar, onu konuşacağız.

İlk Durak: Neredeyim ve Kimim?

Bir sisteme sızdığında genelde elinde olan şey düşük yetkili bir servis hesabı veya dikkatsiz bir kullanıcının oturumudur. whoami /all komutu sana sadece kim olduğunu söyler ama testCompany.local domain'i içinde nerede durduğunu söylemez. İlk yaptığımız hata hemen nmap ile bütün ağa 'çullanmak' oluyor. Yapma. Bu, kütüphanede bağırmaya benzer.

Bunun yerine, sistemin üzerindeki mevcut konfigürasyonları koklamalısın. Örneğin, cmd.exe üzerinden şu basit ama etkili sorguyla ağdaki diğer makineleri ve potansiyel hedefleri sessizce görebilirsin:

# Zararsızlaştırılmış ağ keşif denemesi
net view /domain
net group "Domain Admins" /domain
# DNS kayıtlarını kurcalayarak kritik sunucuları bulma
nslookup -type=any internal-service.example.com 127.0.0.1

Lateral Movement: Kapı Kapı Dolaşmak

Yanal hareket (lateral movement), sızma testinin en sanatsal kısmıdır. Bir makineden diğerine geçerken iz bırakmamak neredeyse imkansızdır ama o izi kalabalığın içinde gizlemek mümkündür. Eskiden PsExec kullanıp her yere System olarak zıplardık. Şimdi ise modern EDR'lar (Endpoint Detection and Response) PsExec servisinin oluşturduğu o spesifik Service Control Manager loglarını saniyesinde yakalıyor.

Artık daha 'zarif' yöntemlerimiz var. Mesela WinRM (Windows Remote Management). Eğer hedef makinede 5985 veya 5986 portları açıksa ve elinde bir NTLM hash varsa, Evil-WinRM gibi araçlarla veya Invoke-Command ile PowerShell üzerinden akabilirsin.

# Defanged WinRM bağlantı mantığı
$session = New-PSSession -ComputerName "target-workstation" -Credential $cred
Invoke-Command -Session $session -ScriptBlock { Get-Process }

Buradaki en büyük savunma hattı 'Privileged Access Management' (PAM) ve ağ segmentasyonudur. Eğer bir muhasebecinin bilgisayarı, sistem yöneticisinin sunucusuna WinRM ile bağlanabiliyorsa, orada büyük bir mimari hata vardır. Biz Red Team tarafında bu hataları severiz, ama savunma tarafında bunlardan nefret etmelisin.

Active Directory'nin Zayıf Karnı: Kerberoasting

Domain ortamında en sevdiğim ve hala tıkır tıkır çalışan tekniklerden biri Kerberoasting. Neden mi? Çünkü bu saldırı türü neredeyse hiç 'gürültü' çıkarmaz. Hedefimiz, servis hesaplarına (Service Principal Names - SPN) ait biletleri (TGS) istemek. Bu biletler, servis hesabının parolasının hash'i ile şifrelenmiştir. Biz bu bileti kendi makinemize indirip, offline olarak kırmaya çalışırız.

# Zararsızlaştırılmış TGS isteme simülasyonu
GetUserSPNs.py -dc-ip 127.0.0.1 testCompany.local/user:password -request

Burada saldırganın ağda aktif bir tarama yapmasına gerek yoktur. Sadece geçerli bir domain kullanıcısı olması yeterlidir. Savunmacı dostum, eğer SIEM ekranında bir kullanıcının kısa süre içinde onlarca farklı servis için TGS bilet talebinde bulunduğunu görmüyorsan, o dashboard'u bir daha gözden geçir.

Kalıcılık (Persistence): 'Gittim Ama Yine Geleceğim'

Sızma testi biter, rapor yazılır ama gerçek bir saldırgan asla gitmek istemez. Kalıcılık sağlamak için Registry anahtarları, Scheduled Tasks veya WMI Event Subscriptions gibi yerler kullanılır. Ancak en 'geek' yöntemlerden biri, 'GPO (Group Policy Object)' manipülasyonudur. Eğer Domain Admin yetkisine bir kez dokunduysan, tüm organizasyona yeni bir 'yazılım yükleme' veya 'script çalıştırma' kuralı basabilirsin. Bu, binlerce makineye aynı anda arka kapı (backdoor) bırakmak demektir.

<!-- Zararsızlaştırılmış GPO Görev Örneği -->
<ScheduledTasks>
    <Task name="SystemMaintenance" runAs="System">
        <Command>powershell.exe</Command>
        <Arguments>-ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -EncodedCommand [BASE64_MOCK_DATA]</Arguments>
    </Task>
</ScheduledTasks>

Savunma: Nasıl Hayatta Kalınır?

Bu kadar teknik anlattık, peki ne yapacağız? 'Korumak imkansızdır' demeyeceğim ama 'her şeyi loglamak' da çözüm değil. Çözüm, bağlamsal analizde.

  1. Tiered Administration (Kademeli Yönetim): Domain Admin'ler asla sıradan workstation'larda oturum açmamalı. Eğer açarlarsa, o makinedeki lsass.exe içinde admin'in hash'i kalır. Bir 'Pass-the-Hash' saldırısı ile tüm domain gider.
  2. SMB Signing: Ağdaki 'Relay' saldırılarını engellemek için SMB signing'i zorunlu tutun. Basit bir GPO ayarı hayat kurtarır.
  3. LAPS (Local Administrator Password Solution): Her makinenin yerel admin şifresi farklı ve dinamik olsun. Bir makine düşerse, hepsi düşmesin.
  4. Honey-Tokens: Ağın ortasına ballı bir 'Admin' hesabı bırakın. Kimse dokunmamalı. Eğer o hesapla bir giriş denemesi gelirse, bilin ki içeride bir misafir var.

Sızma testi sadece açık bulmak değil, o açığın nelere yol açabileceğini simüle etmektir. testCompany örneğinde gördüğümüz gibi, bir açık bazen sadece bir kapı aralar; önemli olan o kapıdan geçip geçmeyeceğindir. Bir sonraki sızma testinde, sadece 'bulguları' değil, 'yolları' da raporla. Çünkü yöneticiler zafiyeti, ama mühendisler o zafiyetin ağdaki yankısını anlamak zorundadır.

Şimdi git ve o logları kontrol et. Event ID 4624 (Logon) ve 4625 (Failed Logon) arasındaki o garip ilişkiyi gördüğünde ne demek istediğimi anlayacaksın. Görüşmek üzere.

İlgili yazılar