滥用ESC9通过弱证书映射实现权限提升

本文详细介绍了如何利用ADCS中的ESC9漏洞,通过弱证书映射实现域权限提升。内容包括ESC9的攻击原理、必要条件、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。如果缺失,DC仍可能允许登录(如果用户账户在证书颁发前已存在)
  • 完全强制执行模式(2):仅当证书包含有效objectSid时,DC才允许登录。如果缺失,登录将被拒绝

除非存在错误配置的模板,否则此强制执行是有效的。这就是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设置为客户端身份验证

  3. 不需要管理员批准:模板不应要求任何手动批准

  4. 不需要授权签名:模板不应要求其他用户的额外批准签名

  5. 低权限注册权限:模板应允许低权限用户或计算机注册

  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。

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

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

4. 检索目标用户凭据

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

5. 修改UPN

下一步是将目标用户的UPN修改为我们要冒充的身份(如域管理员)。

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

更新目标用户的UPN并添加影子凭据后,我们现在可以使用易受攻击的模板作为该用户请求证书。

7. 恢复更改

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

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

使用auth命令作为管理员进行身份验证并获取NT哈希。

9. 使用NetExec验证哈希

使用nxc验证NT哈希。

B. Windows方法

1. 识别易受攻击的模板

我们首先识别可被滥用于ESC9的易受攻击证书模板列表。

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

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

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

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

4. 检索目标用户凭据

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

5. 修改UPN

下一步是将目标用户的UPN更改为我们要冒充的身份。

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

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

9. 使用NetExec验证哈希

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

缓解措施

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

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

资源

  • ADCS ESC9 by SpecterOps
  • ADCS Attack Paths in BloodHound — Part 3 by SpecterOps
  • Hack The Box Academy — ADCS Attacks
  • Shadow Credentials
  • Certipy 4.0: ESC9 & ESC10, BloodHound GUI, New Authentication and Request Methods
  • Skidaddle Skideldi — I just pwnd your PKI
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计