滥用Active Directory证书服务 - 第一部分
Active Directory证书服务(ADCS)用于在Active Directory环境中提供公钥基础设施。ADCS在企业Active Directory环境中广泛用于管理系统、用户、应用程序等的证书。
2021年,SpecterOps发布了一份白皮书,深入描述了ADCS以及ADCS的错误配置和漏洞,这些漏洞可用于凭据窃取、域权限提升和持久化。该白皮书深入探讨了ADCS的攻击技术,并提供了预防、检测和响应此类攻击的指导。
本博客文章不会涵盖白皮书中讨论的所有技术。强烈建议阅读由Will Schroeder和Lee Christensen撰写的白皮书和缩短版博客文章。白皮书和SpecterOps博客文章的链接可在本文末尾的资源列表中找到。
工具
自白皮书发布以来,已发布了几种工具来帮助识别漏洞和利用Active Directory证书服务。同样,也发布了工具来帮助蓝队识别和修复这些问题。
本博客文章是一个短系列的开始,将主要使用Certipy(https://github.com/ly4k/Certipy)来介绍ADCS攻击。Certipy是一个基于Python的攻击性安全工具,可用于枚举和利用易受攻击的ADCS。Certipy是我最常使用的工具,但下面列出了一些其他相关工具:
- PKINITtools: https://github.com/dirkjanm/PKINITtools
- PyWhisker: https://github.com/ShutdownRepo/pywhisker
- Certi: https://github.com/zer1t0/certi
- Impacket: https://github.com/fortra/Impacket
- Certify: https://github.com/GhostPack/Certify
滥用错误配置的模板
证书模板是用于定义证书策略的Active Directory对象。在证书模板中,管理员可以指定设置,如主题(身份)、有效期和用途,以及授权请求证书的用户。在模板设置中授权的用户可以根据证书模板中定义的配置请求证书。
授权请求证书的用户可以使用证书颁发机构本身和证书模板对象上的描述符来定义。
要从目标域枚举ADCS模板信息,您需要有效的域凭据。根据我的经验,枚举ADCS通常不需要高权限的域账户。任何域凭据通常都可以用于查询ADCS模板和配置详细信息。
在以下示例中,假设我们已经在我们目标公司FOOBAR的内部网络中获得了立足点,并已攻陷了名为“billy”的用户账户。我们想要枚举内部目标域“foobar.com”的ADCS配置。
要使用Certipy枚举ADCS配置,请使用find命令。通过指定-enabled
和-vulnerable
标志,我们可以告诉Certipy特别打印出已启用的易受攻击的模板。
完整的Certipy命令如下所示:
|
|
Certipy以JSON(JavaScript对象表示法)和TXT文件输出感兴趣的配置详细信息,命名约定为“
- 在撰写本文时,Certipy生成的BloodHound数据只能由此处找到的BloodHound分支使用:https://github.com/ly4k/BloodHound。
- 要使用维护在https://github.com/BloodHoundAD/BloodHound的BloodHound,您需要指定
-old-bloodhound
标志。
查找易受攻击的模板
使用像“ESC”这样的搜索词的简单grep命令可用于检查生成的TXT文件以查找Certipy发现的权限提升机会。
例如,我们可以如下检查文件中的ESC1:
|
|
ESC1
具有ESC1漏洞的证书模板允许低权限用户代表用户指定的任何域对象注册和请求证书。这意味着任何具有注册权限的用户都可以为特权账户(如域管理员)请求证书。
易受ESC1攻击的模板具有以下配置:
- 客户端身份验证:True
- 已启用:True
- 注册者提供主题:True
- 需要管理批准:False
- 所需授权签名:0
在调查Certipy输出文件“20230602164801_Certipy.txt”时,我们注意到Certipy在第一个名为“FOO_Templ”的模板上发现了ESC1漏洞。“FOO_Templ”模板满足了ESC1的所有条件。
ESC1模板
如下图所示,易受攻击模板的“权限”部分指出,域用户或已验证用户组中的用户可以注册。这意味着任何域用户都可以代表域管理员请求证书。
我们被攻陷的用户账户“billy”是域用户组的一部分,因此被授权使用易受攻击的模板请求证书。我们可以通过将用户主体名称(UPN)设置为[email protected]
来为Dan the DA请求证书。请求证书所需的Certipy参数如下:
u
– 用户名p
– 被攻陷的用户密码dc-ip
– 域控制器IP地址target
– 目标CA(证书颁发机构)DNS(域名系统)名称ca
– 短CA名称template
– 易受攻击的模板名称upn
– 目标用户/对象名称
完整的Certipy命令如下所示:
|
|
注意:Certipy结果将返回请求ID或对象SID。请注意这一点,因为在测试完成后您将需要此信息来撤销证书。
获取DA_Dan的证书
如上图所示,我们的证书和私钥存储在“DA_Dan.pfx”文件中。
故障排除侧栏
如果这不起作用,并且您收到类似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)。
|
|
运行上述命令后,系统将提示您输入用户密码,模块将返回一个名为“
确保包含CCache文件的完整路径
|
|
要使用Kerberos身份验证请求证书,命令将与之前类似,除了我们将使用-k
表示使用Kerberos身份验证和-no-pass
。完整的Certipy命令如下所示:
|
|
结束侧栏
一旦我们有了证书,我们可以使用证书通过Certipy的-auth
命令获取目标DA账户的凭据哈希和Kerberos票证,如下所示:
|
|
如下图所示,我们成功检索到了DA_Dan账户的哈希。现在我们可以模拟DA_Dan!
总之,由于过于宽松的ADCS模板,我们能够从普通域账户提升到域管理员账户。
有效期
需要注意的是,获得的证书将在有效期内对DA账户有效,除非证书被明确撤销。让我们再次查看易受攻击的模板。如下图所示,模板指定了5年的有效期。
这意味着我们将在未来五年内拥有对DA Dan账户的访问权限,无论任何密码更改如何。我们还可以在到期日期之前续订证书以保持对账户的访问权限。这意味着这种技术不仅是一种方便的权限提升技术,还可以作为持久化手段。
我观察到证书模板的有效期为1-10年。我通常看到有效期为3-5年的模板。这可能是常见做法或默认配置,也可能不是,这只是基于我在测试过的各种企业环境中观察到的情况。
预防和检测
那么,我们可以做些什么来预防和检测此类攻击?以下是您可以采取的一些步骤来强化您的证书模板:
- 清点您的证书模板,并确定所有已启用的模板是否当前正在使用。禁用所有不必要的模板。
- 确保模板权限尽可能严格。仅授予必要的组/用户注册权限。
- 修改“颁发要求”以在可能的情况下要求手动批准颁发的证书。
- 在可能的情况下禁用“注册者提供主题”标志。
- 在可能的情况下移除“客户端身份验证”。
监控
通过监控用户的证书注册事件,您可以检测账户何时请求证书以及您的CA何时颁发证书。通过监控证书注册事件,管理员可以警报异常行为并撤销看起来恶意或可疑的证书。一些有用的事件ID如下:
- 4886 – 证书请求
- 4887 – 证书颁发
- 4768 – Kerberos票证请求(TGT)
防御资源:
- “Certified_Pre-Owned”的“防御指导”部分
- Microsoft PKI防御指导:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn786443(v=ws.11)
- PKIAudit:https://github.com/GhostPack/PSPKIAudit
其他资源
- https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh831740
- SpecterOps白皮书:https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
- SpecterOps博客文章:https://posts.specterops.io/certified-pre-owned-d95910965cd2
- https://specterops.io/wp-content/uploads/sites/3/2022/06/an_ace_up_the_sleeve.pdf
- https://www.securew2.com/blog/how-to-revoke-certificate-in-windows-ad-cs
- https://www.thehacker.recipes/ad/movement/ad-cs/certificate-templates
- https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
- PKINITtools:https://github.com/dirkjanm/PKINITtools
- PyWhisker:https://github.com/ShutdownRepo/pywhisker
- Certi:https://github.com/zer1t0/certi
- Impacket:https://github.com/fortra/Impacket
- Certipy:https://github.com/ly4k/Certipy
- Certify:https://github.com/GhostPack/Certify
脚注
[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
阅读: 第二部分