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:
|
|
如前一节所述,我们寻找授予低权限用户危险权限的证书模板,特别是那些允许他们修改模板配置的权限。
在查看Certipy输出时,我们重点关注"对象控制权限"部分,密切关注哪些主体拥有哪些权限。
2. 保存旧模板
在修改模板之前,保存旧配置非常重要,这样我们可以在完成攻击后恢复更改。在内部渗透测试期间,我们不希望在客户环境中引入额外的漏洞。
Certipy有一个标志用于此目的。在v4.8.2版本中,它被称为-save-old
,在v5.0.2中,它被重命名为-save-configuration
。此标志将模板配置保存为JSON文件,以便我们以后在准备恢复更改时可以恢复它。
|
|
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配置应用于证书模板:
|
|
4. 作为模拟用户请求证书
现在我们可以通过指定其用户主体名称(UPN)来请求证书以冒充其他用户(如DA):
|
|
5. 转储模拟账户的NT哈希
使用auth命令以administrator身份进行身份验证并获取NT哈希:
|
|
6. 访问域控制器
我们现在可以使用SMB或WMI访问DC。在这种情况下,我们将使用impacket-wmiexec:
|
|
7. 恢复模板配置
要恢复原始模板配置,我们将使用备份文件ESC4-original.json恢复我们所做的更改:
|
|
8. 验证更改
恢复配置后,再次运行find命令以确认模板已正确恢复:
|
|
B. Windows方法
1. 识别易受攻击的模板
我们以与Linux端相同的步骤开始:识别可用于滥用ESC4的证书模板。与Certipy不同,Certify不会明确标记易受攻击的模板,因此我们需要手动查看模板权限以确定它们是否可利用。
最简单的方法是将输出保存到文件中并离线查看权限:
|
|
2. 保存模板
Certify没有像Certipy那样内置保存证书模板配置的方法,因此我使用PowerShell和ADSI找到了一个解决方法。
该脚本将模板备份到两个文件中:
- 一个包含所有属性的.xml文件
- 一个包含ACL(安全描述符)的.acl.xml文件(二进制格式)
要备份配置,我们将使用备份模式:
|
|
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)名称:
|
|
5. 转换证书
Certify生成的证书为.pem格式,其中包括私钥和证书。在使用其他工具之前,我们需要使用OpenSSL将其转换为.pfx:
|
|
6. 证书认证
现在我们可以使用Rubeus和我们生成的证书进行身份验证。我们将使用asktgt命令,指定模拟用户(administrator)、证书文件admin.pfx和/getcredentials标志以提取NT哈希:
|
|
7. 恢复更改
现在我们将使用在备份步骤期间保存的XML文件恢复原始模板配置:
|
|
然后,再次运行Certify.exe find命令以验证模板配置是否已恢复。
通过计算机主体滥用ESC4
如果证书模板允许域计算机或特定计算机账户修改它,我们可以按照"通过用户主体滥用ESC4"中的相同步骤操作,但需要进行一些调整。
有两种路径可以选择:
- 创建新的计算机账户
- 使用被入侵的计算机账户
选项1:创建新的计算机账户
如果模板授予域计算机具有GenericAll、WriteDacl或WriteProperty权限的控制权,我们可以创建一个我们完全控制的新计算机账户。这假设环境允许这样做。
默认情况下,标准域用户可以在Active Directory中创建最多10个计算机账户。但是,某些环境通过修改ms-DS-MachineAccountQuota属性将此值减少到0以防止此类滥用。
我们可以使用nxc和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