滥用Active Directory证书服务(第1部分):ESC1漏洞利用与防御指南

本文详细介绍了如何利用Active Directory证书服务(ADCS)中的ESC1漏洞进行权限提升,包括使用Certipy工具枚举和攻击错误配置的证书模板,以及防御和检测此类攻击的最佳实践。

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

Active Directory证书服务(ADCS)用于在Active Directory环境中管理公钥基础设施。ADCS广泛用于企业环境中,为系统、用户、应用程序等管理证书。

2021年,SpecterOps发布了一份白皮书,深入探讨了ADCS的错误配置和漏洞,这些漏洞可用于凭据窃取、域权限提升和持久化。本博客文章不会涵盖白皮书中的所有技术,强烈建议读者参考Will Schroeder和Lee Christensen撰写的白皮书和缩短版博客文章。相关链接可在文末资源部分找到。

工具

自白皮书发布以来,已有多款工具被开发用于识别和利用Active Directory证书服务漏洞。同样,也有工具帮助蓝队识别和修复这些问题。

本博客文章是一个短系列的开始,主要使用Certipy(https://github.com/ly4k/Certipy)来演示ADCS攻击。Certipy是一款基于Python的攻击性安全工具,可用于枚举和利用易受攻击的ADCS。以下是一些其他相关工具:

滥用错误配置的模板

证书模板是用于定义证书策略的Active Directory对象。在证书模板中,管理员可以指定主题(身份)、有效期、用途以及授权请求证书的用户等设置。授权用户可以根据模板配置请求证书。

授权用户可以通过证书颁发机构本身和证书模板对象上的描述符来定义。

要枚举目标域的ADCS模板信息,需要有效的域凭据。根据经验,枚举ADCS通常不需要高权限域账户。任何域凭据通常都可以用于查询ADCS模板和配置详情。

在以下示例中,假设我们已初步进入目标公司FOOBAR的内部网络,并攻陷了名为“billy”的用户账户。我们希望枚举内部目标域“foobar.com”的ADCS配置。

使用Certipy枚举ADCS配置,使用find命令。通过指定-enabled-vulnerable标志,可以指示Certipy特别打印出已启用的易受攻击模板。

完整Certipy命令如下:

1
certipy find -u 'billy@foobar.com' -p <password> -dc-ip <DC_IP> -vulnerable -enabled

Certipy以JSON和TXT文件格式输出配置详情,命名约定为“<日期-时间戳>_Certipy”。Certipy还运行BloodHound收集器,输出到遵循相同命名约定的zip文件。BloodHound结果可以导入BloodHound数据库,用于可视化潜在域权限提升路径。BloodHound不在本文讨论范围内,但如果您想利用此功能,请注意:

  • 截至撰写时,Certipy生成的BloodHound数据只能由特定分支(https://github.com/ly4k/BloodHound)处理。
  • 要使用主分支BloodHound(https://github.com/BloodHoundAD/BloodHound),需指定-old-bloodhound标志。

查找易受攻击的模板

使用如“ESC”的搜索词进行grep命令,可以检查生成的TXT文件以发现Certipy找到的权限提升机会。

例如,我们可以检查文件中的ESC1漏洞:

1
grep ESC1 20230602164801_Certipy.txt

ESC1

具有ESC1漏洞的证书模板允许低权限用户代表用户指定的任何域对象注册和请求证书。这意味着任何具有注册权限的用户都可以为特权账户(如域管理员)请求证书。

易受ESC1攻击的模板具有以下配置:

  • 客户端身份验证:True
  • 已启用:True
  • 注册者提供主题:True
  • 需要管理批准:False
  • 所需授权签名:0

在检查Certipy输出文件“20230602164801_Certipy.txt”时,我们注意到Certipy在名为“FOO_Templ”的第一个模板上发现了ESC1漏洞。“FOO_Templ”模板满足了ESC1的所有条件。

ESC1模板

如权限部分所示,易受攻击模板的“权限”部分指出,域用户或认证用户组中的用户可以注册。这意味着任何域用户都可以代表域管理员请求证书。

我们攻陷的用户账户“billy”是域用户组的一部分,因此有权使用易受攻击模板请求证书。我们可以通过将用户主体名称(UPN)设置为DA_Dan@foobar.com来为域管理员Dan请求证书。请求证书所需的Certipy参数如下:

  • u – 用户名
  • p – 攻陷用户密码
  • dc-ip – 域控制器IP地址
  • target – 目标CA(证书颁发机构)DNS名称
  • ca – 短CA名称
  • template – 易受攻击模板名称
  • upn – 目标用户/对象名称

完整Certipy命令如下:

1
2
3
4
5
6
certipy req -u 'billy@foobar.com' \
-p '<PASSWORD>' \
-dc-ip '10.10.1.100' \
-target 'foobar-CA.foobar.com' \
-ca 'foobar-CA' -template 'FOO_Templ'\
-upn 'DA_Dan@foobar.com'

注意:Certipy结果将返回请求ID或对象SID。请记下此信息,因为在测试完成后需要用它来撤销证书。

获取DA_Dan证书

如上图所示,我们的证书和私钥存储在“DA_Dan.pfx”文件中。

2025年4月21日更新

微软最近推送了部分补丁以尝试防止权限提升。补丁链接:https://support.microsoft.com/en-us/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16

如果您收到类似以下的错误:

1
SID不匹配错误

您可以通过在Certipy请求中提供目标UPN的SID来解决此问题,如下所示:

1
2
3
4
5
6
7
8
certipy req -u '<USERNAME>'\
-p '<PASSWORD>' \
-dc-ip '<DC_IP>' \
-target '<CA_HOSTNAME>' \
-ca '<CA_NAME>' \
-template '<VULNERABLE_TEMPLATE_NAME>'\
-upn <DOMAIN_ADMIN>
-sid <DOMAIN_ADMIN_SID>

使用SID标志获取域管理员证书

结束更新

故障排除侧栏

如果此方法无效,并且您收到类似SMB(服务器消息块)SessionError: STATUS_NOT_SUPPORTED的错误,您可以尝试使用Kerberos身份验证代替用户名和密码。Gabriel Prud’homme(vendetce)教了我这个解决方法,如果对您有效,请告诉他他很棒!要获取用户的服务票据,可以使用Impacket的getTGT模块(https://github.com/fortra/impacket/blob/impacket_0_10_0/examples/getTGT.py)。

1
python3 getTGT.py 'foobar.com/billy'

获取TGT

运行上述命令后,系统将提示您输入用户密码,模块将返回一个名为“<用户名>.ccache”的CCache文件。将生成的CCache文件导出到环境变量,如下所示: 确保包含CCache文件的完整路径

1
export KRB5CCNAME=/full/path/to/billy.ccache

要使用Kerberos身份验证请求证书,命令与之前类似,但我们将使用-k表示使用Kerberos身份验证,以及-no-pass。完整Certipy命令如下:

1
2
3
4
5
certipy req -u 'billy@foobar.com' -k -no-pass \
-dc-ip '10.10.1.100' \
-target 'foobar-CA.foobar.com' \
-ca 'foobar-CA' -template 'FOO_Templ'\
-upn 'DA_Dan@foobar.com'

结束侧栏

一旦我们获得证书,就可以使用证书通过Certipy的-auth命令获取目标DA账户的凭据哈希和Kerberos票据,如下所示:

1
certipy auth -pfx DA_Dan.pfx

如下图所示,我们成功检索到了DA_Dan账户的哈希。现在我们可以模拟DA_Dan!

获取DA_Dan凭据

总之,由于过于宽松的ADCS模板,我们能够从普通域账户提升到域管理员账户。

有效期

需要注意的是,获得的证书将在有效期内对DA账户有效,除非证书被显式撤销。让我们再次查看易受攻击模板。如下图所示,模板指定了5年的有效期。

有效期

这意味着我们将在未来五年内拥有对DA Dan账户的访问权限,无论密码如何更改。我们还可以在到期日前续订证书以维持对账户的访问。这意味着此技术不仅是一种方便的权限提升技术,还可以作为持久化手段。

我观察到证书模板的有效期为1-10年。通常看到的是3-5年的模板。这可能是常见做法或默认配置,但仅基于我在各种企业环境测试中的观察。

预防和检测

那么,我们可以做些什么来预防和检测此类攻击?以下是强化证书模板的一些步骤:

  • 清点证书模板,确定所有已启用模板是否当前正在使用。禁用所有不必要的模板。
  • 确保模板权限尽可能严格。仅授予必要组/用户注册权限。
  • 修改“颁发要求”,在可能的情况下要求手动批准颁发的证书。
  • 在可能的情况下禁用“注册者提供主题”标志。
  • 在可能的情况下移除“客户端身份验证”。

监控

通过监控用户的证书注册事件,可以检测账户何时请求证书以及CA何时颁发证书。通过监控证书注册事件,管理员可以警报异常行为并撤销看似恶意或可疑的证书。一些有用的事件ID如下:

  • 4886 – 证书请求
  • 4887 – 证书颁发
  • 4768 – Kerberos票据(TGT)请求

防御资源:

附加资源

本系列更多内容:

  • 滥用Active Directory证书服务(第2部分)
  • 滥用Active Directory证书服务(第3部分)
  • 滥用Active Directory证书服务(第4部分)
  • 检测ADCS权限提升

脚注

[1] https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh831740(v=ws.11) [2] https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf [3] https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf [4] https://posts.specterops.io/certified-pre-owned-d95910965cd2 [5] https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf

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