正如标题所述,最新版本的Certipy [1]包含许多新功能、技术和改进。这篇博文深入探讨了其中许多的技术细节。
公钥基础设施可能难以设置。用户和管理员通常没有完全意识到勾选单个复选框的含义——尤其是当单个复选框(最终)使事情正常运行时。
自 Certipy 首次发布以来已经快五个月了。那时,Certipy 只是一个用于滥用和枚举 Active Directory 证书服务 (AD CS) 错误配置的小工具。从那时起,我们在Institut For Cyber Risk [2]的进攻团队在我们的参与过程中遇到了许多不同的 AD CS 环境,这需要新的添加和功能。
这些已经实施,Certipy 2.0 [3]现已准备好公开发布。
Certipy 的主要新功能之一是 BloodHound 集成。旧版本有一个简单的功能,可以根据当前用户的组成员身份查找易受攻击的证书模板。但正如我们稍后会看到的,与 BloodHound 集成会更好。
默认情况下,新版本的 Certipy 将以 BloodHound 数据以及文本和 JSON 格式输出枚举结果。我经常发现自己多次运行该工具,因为我想以不同的格式查看输出。
但是,可以通过分别指定一个或多个开关-bloodhound
、-json
或来仅输出 BloodHound 数据、JSON 或文本-text
。
BloodHound 数据保存为 ZIP 文件,可以导入到最新版本的 BloodHound(撰写本文时为 4.1.0)。请注意,Certipy 使用 BloodHound 的新格式,在版本 4 中引入。
新的边和节点意味着新的查询。我创建了 Certipy 支持的最重要的查询。查询可以在存储库[4]中找到并导入您自己的 BloodHound 设置。
Certipy 的 BloodHound 查询
新版本的 Certipy 可以滥用“域升级”类别中列出的所有场景。假设我们已经接管了域用户帐户JOHN
。让我们从第一个查询“从拥有的委托人 (ESC1) 错误配置证书模板的最短路径”开始。
从拥有的委托人 (ESC1) 到错误配置的证书模板的最短路径
这是一条相当简单的路径。但是当我们通过升级查询时,我们可能会看到为什么 BloodHound 更好,因为可以使用导入的 Certipy 数据构建攻击路径。
从拥有的委托人 (ESC4) 到易受攻击的证书模板访问控制的最短路径
白皮书“Certified Pre-Owned” [5]列出了 8 种针对 AD CS (ESC1-ESC8) 中的错误配置的域升级技术。以前,Certipy 只支持 ESC1 和 ESC6,而 Impacket 的ntlmrelayx [6]支持 ESC8 。虽然 ESC1 和 ESC8 是我们看到最多的漏洞,但我们也遇到了其他错误配置,这就是我实现所有这些漏洞的原因,除了 ESC5 过于抽象。
因此,Certipy 现在支持滥用查询中列出的所有升级技术。
从拥有的委托人 (ESC1) 到错误配置的证书模板的最短路径
我们在参与期间看到的最常见的错误配置是 ESC1。本质上,ESC1 是指证书模板允许客户端身份验证并允许登记者提供任意主题备用名称 (SAN)。
Certipy 的先前版本也支持这种技术,但新版本进行了改进,因此,我将演示新版本 Certipy 支持的所有升级技术。
对于 ESC1,我们可以只根据易受攻击的证书模板请求证书,并使用-alt
参数指定任意 SAN。
Certipy 的一个新功能是证书和私钥现在以 PKCS#12 格式存储。这允许我们以标准化格式将证书和私钥打包在一起。
另一个简洁的功能是该auth
命令将尝试从证书中检索域和用户名以进行身份验证。
在大多数情况下,这不起作用,通常是因为无法解析域名。为了解决这个问题,如果需要,可以在命令行上指定所有必要的参数。
自有主体 (ESC2) 错误配置证书模板的最短路径
ESC2 是指证书模板可用于任何目的。“Certified Pre-Owned”白皮书没有提到任何适用于 ESC2 的特定域升级技术。但是由于证书可以用于任何目的,它可以用于与 ESC3 相同的技术,我们将在下面看到。
自有委托人注册代理模板的最短路径 (ESC3)
ESC3 是当证书模板指定证书请求代理EKU(注册代理)时。此 EKU 可用于代表其他用户请求证书。正如我们在上面的路径中看到的,ESC2 证书模板也容易受到 ESC3 的攻击,因为 ESC2 模板可以用于任何目的。
首先,让我们申请一个基于 ESC3 的证书。
-on-behalf-of
使用我们的新证书请求代理证书,我们可以通过指定参数以及我们的证书请求代理证书来代表其他用户请求证书。-on-behalf-of
参数值必须是 的形式,domain\user
而不是域的 FQDN,即corp
而不是corp.local
。
为了更好地衡量,这是与 ESC2 证书模板相同的攻击。
从拥有的委托人 (ESC4) 到易受攻击的证书模板访问控制的最短路径
ESC4 是当用户对证书模板具有写入权限时。例如,这可以被滥用来覆盖证书模板的配置,从而使模板容易受到 ESC1 的攻击。
正如我们在上面的路径中看到的,只有JOHNPC
这些权限,但我们的用户JOHN
拥有. 由于这种技术与证书有关,因此我也实施了这种攻击,称为Shadow Credentials [7]。这是 Certipy检索受害者 NT 哈希的命令的一个小偷偷摸摸的高峰。AddKeyCredentialLink``JOHNPC``shadow auto
我们将在本文后面详细介绍该技术,但现在,我们只需要JOHNPC
.
新版本的 Certipy 可以使用单个命令覆盖证书模板的配置。默认情况下,Certipy 将覆盖配置以使其易受 ESC1 攻击。我们还可以指定-save-old
参数保存旧配置,这对于我们攻击后恢复配置很有用。如果在测试环境之外使用 Certipy,请务必执行此操作。
正如我们在下面看到的,新配置将允许Authenticated Users
完全控制证书模板。此外,新模板可用于任何目的,并且登记者提供 SAN,这意味着它容易受到 ESC1 的攻击。
覆盖配置后,我们可以简单地请求基于 ESC4 模板的证书,就像使用 ESC1 一样。
如果我们想在之后恢复配置,我们可以使用-configuration
参数指定保存配置的路径。您还可以使用此参数设置自定义配置。
ESC5 是指证书模板之外的对象和证书颁发机构本身会对整个 AD CS 系统产生安全影响,例如 CA 服务器的 AD 计算机对象或 CA 服务器的 RPC/DCOM 服务器。这种升级技术尚未在 Certipy 中实现,因为它太抽象了。但是,如果 CA 服务器受到威胁,您可以执行 ESC7 升级。
查找具有用户指定 SAN (ESC6) 的证书颁发机构
ESC6 是 CA 指定EDITF_ATTRIBUTESUBJECTALTNAME2
标志的时候。本质上,此标志允许登记者在所有证书上指定任意 SAN,而不管证书模板的配置。在 Certipy 中,这可以在 CA 的“用户指定的 SAN”属性中看到。如果未显示此属性,则表示 Certipy 无法获取 CA 的安全性和配置。
该攻击与 ESC1 相同,只是我们可以选择任何允许客户端身份验证的证书模板。
从拥有的主体 (ESC7) 到易受攻击的证书颁发机构访问控制的最短路径
ESC7 是当用户对 CA 具有Manage CA
或Manage Certificates
访问权限时。虽然没有任何公共技术可以仅滥用Manage Certificates
域权限提升的访问权限,但我们仍然可以使用它来发布或拒绝待处理的证书请求。
我们已经在我们的一项活动中看到了这种错误配置。白皮书[8]提到,该访问权限可用于启用EDITF_ATTRIBUTESUBJECTALTNAME2
标志执行 ESC6 攻击,但这在 CA 服务 ( CertSvc
) 重新启动之前不会有任何影响。当用户具有Manage CA
访问权限时,允许用户重新启动服务。但是,这并不意味着用户可以远程重启服务,我们也不允许在参与时重启该服务。
在下文中,我将解释我发现的一种不需要任何服务重新启动或配置更改的新技术。
为了使该技术起作用,用户还必须具有Manage Certificates
访问权限,并且SubCA
必须启用证书模板。幸运的是,凭借我们的Manage CA
访问权限,我们可以在需要时满足这些先决条件。
如果我们没有Manage Certificates
访问权限,我们可以将自己添加为新的“官员”。根据MS-CSRA 3.1.1.7 ,官员只是具有Manage Certificates
访问权限的用户的术语**。**[9]
在使用命令运行新的 Certipy 枚举find
并将输出导入 BloodHound 后,我们现在应该看到它JOHN
具有Manage Certificates
和Manage CA
访问权限。
从拥有的主体 (ESC7) 到易受攻击的证书颁发机构访问控制的最短路径
下一个要求SubCA
是启用默认证书模板。我们可以使用参数列出 CA 上启用的证书模板-list-templates
,在这种情况下,SubCA
我们的 CA 上没有启用该模板。
使用我们的Manage CA
访问权限,我们只需SubCA
使用参数启用证书模板-enable-template
。
SubCA
证书模板现已启用,我们已准备好进行新的攻击。
证书模板默认启用,它是一个内置的SubCA
证书模板,这意味着它不能在证书模板控制台 (MMC) 中删除。
SubCA
证书模板很有趣,因为它容易受到 ESC1(Enrollee Supplies Subject and Client Authentication)的攻击。
但是,只有DOMAIN ADMINS
和ENTERPRISE ADMINS
被允许在SubCA
证书模板中注册。
显示证书模板的注册权限
但如果用户拥有Manage CA
访问权限和访问权限,则Manage Certificates
用户可以有效地发出失败的证书请求。
让我们尝试根据SubCA
我们指定 SAN 的证书模板请求证书[email protected]
。
我们收到一个CERTSRV_E_TEMPLATE_DENIED
错误,这意味着我们不允许注册模板。Certipy 会询问我们是否仍要为我们的请求保存私钥,在这种情况下,我们回答“y”(是)。Certipy 还会打印出请求 ID,我们将使用它来颁发证书。
使用我们的Manage CA
andManage Certificates
访问权限,我们可以通过在参数ca
中指定请求 ID 来使用命令发出失败的证书请求。-issue-request
颁发证书后,我们现在可以通过使用请求 IDreq
指定参数来使用命令检索它。-retrieve
现在可以使用证书来获取管理员帐户的密码哈希。
使用 HTTP Web 注册 (ESC8) 查找证书颁发机构
ESC8 是指注册服务已安装并启用 HTTP Web 注册。这种攻击已经在 Impacket 的 ntlmrelayx 中实现,但我认为还有改进和新功能的空间。
在 Certipy 中,可以在 CA 的“Web Enrollment”属性中看到此漏洞。
要启动中继服务器,我们只需运行relay
命令并指定 CA 的 IP。
Machine
默认情况下,Certipy 会User
根据中继的账户名是否以$
. 可以使用-template
参数指定另一个模板。
然后,我们可以使用诸如PetitPotam [10]之类的技术来强制从计算机进行身份验证。在此示例中,我只是dir \\IP\foo\bar
从管理员命令提示符中创建了一个。
Certipy 会将 NTLM 身份验证中继到 CA 的 Web 注册界面,并为用户请求证书。
现在,让我们考虑一个场景,所有证书请求都必须由官员批准,并且我们拥有Manage Certificates
访问权限。
在这种情况下,Certipy 会询问我们是否要为我们的请求保存私钥。在这种情况下,我们回答是。
使用我们的Manage Certificates
访问权限,我们可以根据请求 ID 发出请求。
然后我们再次启动中继服务器,但这一次,我们指定-retrieve
了我们的请求 ID。
Certipy 将根据请求 ID 检索证书,而不是请求新的。这是一个边缘案例,但我认为实现起来很有趣。
BloodHound 4.1.0 中的新优势之一是AddKeyCredentialLink
.
从 JOHN 到 JOHNPC 的路径
该攻击被称为Shadow Credentials [11],可用于帐户接管。如前所述,该技术与证书有关,因此,我在 Certipy 中实现了攻击。当我们对另一个用户拥有“通用写入”权限并且我们不想重置他们的密码时,我们也可以滥用这种技术。
您可能最常使用的命令是auto
我们之前看到的命令。本质上,Certipy 将创建并添加新的 Key Credential,使用证书进行身份验证,然后恢复帐户的旧 Key Credential 属性。如果您只需要受害者帐户的 NT 哈希,这很有用,就像在前面的 ESC4 场景中一样。
如果要手动添加密钥凭据以进行持久性,可以使用该add
操作。这将添加一个新的 Key Credential 并保存证书和私钥,稍后可以与 Certipy 的auth
命令一起使用。
还可以列出帐户的当前密钥凭证。这对于删除或获取有关特定密钥凭据的详细信息很有用。
可以使用info
操作检索有关密钥凭据的信息,其中可以使用-device-id
.
要删除密钥凭据,您可以使用remove
操作并在-device-id
参数中指定密钥凭据。
或者,如果需要,您可以只清除该帐户的所有密钥凭据。
Certipy 的另一个新的主要功能是能够创建“黄金证书”。这是一种在破坏 CA 服务器或域后进行域持久性的技术。它是“金票”的替代方案,但您可以伪造可用于 Kerberos 身份验证的证书,而不是伪造票证。
第一步是获取 CA 的证书和私钥。假设我们已经入侵了域管理员administrator
,并且我们想要检索 CA 的证书和私钥。这可以在 CA 服务器上的证书颁发机构控制台中完成,但我也在 Certipy 中实现了这一点。
本质上,Certipy 将在 CA 服务器上创建一个新服务,它将证书和私钥备份到预定义的位置。然后将通过 SMB 检索证书和私钥,最后从服务器中删除服务和文件。
有了 CA 证书和私钥,我们可以使用 Certipy 的新forge
命令为任意用户创建证书。在这种情况下,我们为JOHN
. 在这种情况下,主题并不重要,只是 SAN。
然后我们可以使用证书进行身份验证JOHN
。
它也适用于域控制器DC$
。
但是,它不适用于禁用帐户,例如krbtgt
帐户。
Certipy 的最新版本还包含一些小的改进和调整。
我们之前看到了如何启用证书模板。如果我们想自己清理,我们可以禁用模板,如下所示。
我们也可以JOHN
作为军官撤职,但我们仍然拥有Manage CA
访问权限。
正如我们在下面看到的,如果我们现在尝试执行 ESC7 攻击,我们会在尝试颁发证书时得到“拒绝访问”。
JOHN
也可以添加另一个经理,例如JANE
。
JANE
然后可以添加第三个经理,EVE
。
JANE
甚至可以解除自己的经理身份。
但随后她将无法解除EVE
经理的职务。
这是一个次要但重要的新功能。在我们的一次合作中,SMB 在 CA 服务器上被防火墙关闭。以前版本的 Certipy 通过命名管道请求证书cert
,当 SMB 被防火墙关闭时,旧版本无法请求证书。
但是,CA 服务实际上也在侦听动态 TCP 端点。如果 SMB 失败,新版本的 Certipy 将尝试连接到动态 TCP 端点。
或者,您可以指定-dynamic-endpoint
参数以首选动态 TCP 端点而不是 SMB。如果您不想在 SMB 被防火墙关闭时等待每个请求的超时,这将非常有用。
对于较慢的连接,例如通过代理,还可以为几乎所有类型的带有-timeout
参数的命令指定比默认 5 秒更长的超时时间。
新版 Certipy 的改进和参数比我在这篇博文中展示的要多得多。如果您发现自己处于不寻常的情况,我建议您探索 Certipy 的新功能和参数。如果您有任何问题或功能请求,我鼓励您在 Github 上提交。我希望您会喜欢新版本的 Certipy。
新版本可以在这里找到:https ://github.com/ly4k/Certipy