ADCS攻击系列:通过弱证书映射滥用ESC9实现权限提升
Active Directory证书服务(ADCS)负责在AD环境中颁发和管理数字证书。这些证书用于加密和验证用户身份等用途。
但与AD中的大多数组件一样,ADCS也有自己的一系列漏洞,可能导致域权限提升和其他严重安全风险。这些错误配置使用"ESC"前缀加数字(如ESC1、ESC2等)进行跟踪引用。
在本系列中,我将逐个分析这些错误配置,并以实用且易于理解的方式进行分解。今天,我们将重点讨论ESC9,这是一个与AD中证书映射相关的错误配置。
理解证书映射
证书映射是AD确定证书属于哪个用户的方式,通常通过检查证书中的UPN、SAN或objectSid等字段。如果我们能欺骗AD认为证书属于其他用户(如域管理员),我们就可以以该用户身份登录。
2023年,微软进行了一些更改以加强证书映射检查:
-
增加了额外验证:证书应包含objectSid,这对每个AD用户都是唯一的。这使得域控制器能够双重检查证书的真正所有者。
-
在域控制器上添加了两个新的注册表键:
- StrongCertificateBindingEnforcement:在身份验证期间验证证书所有权
- CertificateMappingMethods:控制TLS/SSL(Schannel)身份验证的证书映射处理方式
StrongCertificateBindingEnforcement键控制证书验证的严格程度,有三种模式:
- 禁用模式(0):不执行强检查
- 兼容模式(1):DC首先在证书中查找objectSid。如果缺少objectSid,且用户账户在证书颁发前已存在,DC仍可能允许登录
- 完全强制模式(2):仅当证书包含有效的objectSid时,DC才允许登录。如果缺少objectSid,登录将被拒绝
除非存在错误配置的模板,否则此强制措施是有效的。这就是ESC9的用武之地。
ESC9概述
ESC9涉及通过结合三个条件来滥用证书映射:
- 错误配置的证书模板不包含objectSid,这意味着它跳过了有助于将证书绑定到正确用户的安全扩展
- 域控制器的StrongCertificateBindingEnforcement注册表设置为0或1,允许弱证书映射
- 对用户账户的控制权,如GenericWrite、WriteOwner或WriteDacl权限
当满足这些条件时,我们可以更改用户的用户主体名称(UPN)以匹配我们想要冒充的身份。然后,当我们为该用户请求证书时,在身份验证期间它将被映射到被冒充的身份。
ESC9滥用要求
要实施ESC9攻击,我们需要找到满足以下关键条件的证书模板:
-
注册标志:此属性控制CA如何颁发证书。我们要查找的标志是:
- msPKI-Enrollment-Flag: CT_FLAG_NO_SECURITY_EXTENSION 此值告诉CA不要在证书中包含objectSid,这会削弱证书映射强制执行。
-
扩展密钥用法(EKU):EKU定义证书允许执行的操作,如登录系统或作为用户进行身份验证。对于ESC9,我们需要将EKU设置为客户端身份验证。
- 扩展密钥用法(EKU):客户端身份验证
-
不需要管理员批准:模板不应要求任何管理员手动批准。
- 需要管理员批准 = False
-
不需要授权签名:模板不应要求其他用户的额外批准签名。
- 需要授权签名 = 0
-
低权限注册权限:模板应允许低权限用户或计算机注册。
- 注册权限:域用户、Everyone、认证用户或域计算机
-
对目标用户的写入权限:我们需要对我们想要冒充的目标用户至少具有WriteOwner或WriteDACL权限。
所需工具
Linux:Certipy、Impacket、NetExec Windows:Certify、Rubeus、NetExec
通过用户主体滥用ESC9
A. Linux方法
1. 识别易受攻击的模板
我们首先查找易受ESC9攻击的证书模板。为此,我们可以使用Certipy并提供域用户凭据以及域控制器IP。
|
|
查找注册标志设置为"NoSecurityExtension"、EKU包含客户端身份验证且注册权限授予低权限组(如域用户)的模板。
2. 识别我们可以控制的用户
识别易受攻击的模板后,下一步是找到我们具有写入权限(如GenericWrite、WriteDACL或GenericAll)的目标用户账户。
我们将使用BloodHound查找我们具有这些权限的用户。
3. 验证我们对用户的权限
我们可以使用Impacket模块dacledit来验证我们对目标用户james的权限。
|
|
如果我们只对目标用户具有WriteOwner或WriteDACL权限,我们需要先修改DACL以授予自己完全控制权限。
|
|
4. 检索目标用户凭据
对目标用户james具有完全控制权后,我们有几个选项。我们可以重置他们的密码,或使用Shadow Credentials添加额外凭据。
我们将使用Shadow Credentials方法:
|
|
5. 修改UPN
下一步是将目标用户的UPN修改为我们要冒充的身份,在我们的案例中是administrator(DA)。
|
|
6. 作为被冒充用户请求证书
更新目标用户james的UPN并添加shadow credentials后,我们现在可以使用易受攻击的模板以james身份请求证书。
|
|
7. 恢复更改
获取证书后,我们需要将james的UPN恢复为其原始值。
|
|
8. 转储被冒充账户的NT哈希
使用auth命令以administrator身份进行身份验证并获取NT哈希:
|
|
9. 使用NetExec验证哈希
接下来,使用nxc通过以下命令验证NT哈希:
|
|
B. Windows方法
1. 识别易受攻击的模板
我们首先识别可被滥用于ESC9的易受攻击证书模板列表。运行以下Certify命令:
|
|
对于ESC9,我们主要查找msPKI-Enrollment-Flag包含NO_SECURITY_EXTENSION、EKU包含客户端身份验证且注册权限授予域用户等组的模板。
2. 识别我们可以控制的用户
就像在Linux部分一样,我们使用BloodHound识别我们可以控制的用户账户。
3. 验证我们对用户的权限
我们可以使用PowerShell ADSI验证我们对用户james的权限。
|
|
如果我们只对目标用户具有WriteOwner或WriteDACL权限,我们需要先修改DACL以授予自己完全控制权限。
|
|
4. 检索目标用户凭据
对目标用户james具有完全控制权后,我们可以使用Whisker /add命令添加新的shadow credentials。
|
|
然后,我们使用Whisker生成的Rubeus命令请求TGT并提取james的NT哈希:
|
|
5. 修改UPN
下一步是将目标用户的UPN更改为我们要冒充的身份——administrator@lab.local。我们可以使用PowerView:
|
|
6-8. 请求证书、恢复更改、转储NT哈希
此时,您可以按照Linux部分中使用Certipy的相同步骤:
- 步骤6:以james身份请求证书(现在映射到administrator@lab.local)
- 步骤7:将UPN恢复以避免映射问题
- 步骤8:使用生成的.pfx进行身份验证并转储administrator的NT哈希
9. 使用NetExec验证哈希
要验证被冒充用户的NT哈希,在Windows上运行NetExec(nxc):
|
|
缓解措施
要缓解ESC9的滥用,我们可以:
- 在所有域控制器上将StrongCertificateBindingEnforcement设置为2,以强制执行objectSid验证。
- 将模板注册权限限制为仅限受信任的组,避免将模板分配给域用户或Everyone等低权限组。
- 审查并收紧用户和计算机对象上的ACL,防止低权限用户获得写入访问权限。
总结
这是通过弱证书映射滥用ESC9冒充特权用户的完整演练。这里的关键不仅仅是找到易受攻击的模板,而是知道如何将其与用户控制结合起来,并理解证书映射在底层实际如何工作。
在实际环境中,这种攻击往往会被忽视,特别是当涉及到过于宽松的ACL时。这是ESC9能够成功的关键条件。