开卷有益 · 不求甚解
前言
在我们之前的文章中,我们介绍了一个需要执行 ESC7 攻击以通过滥用 Active Directory 证书服务 (AD CS) 来提升权限的活动。在这次红队演习期间,进行了详细的研究,并导致发布了几个 Certify 模块,这些模块允许滥用原始论文中建议的 ManageCA 和 ManageCertificates 权限。
自文章发表以来,我们继续进行这项研究,这使我们发现了两种通过滥用 ManageCA权限来破坏 CA服务器(证书颁发机构)本身的新方法。这些攻击在不同的情况下可能很有用:
-
当没有可供我们控制的用户可用的证书模板时,防止执行 ESC6 和 ESC7 攻击。
-
在无法完成 SpecterOps 提出的任何攻击场景的情况下,由于无法使用证书在域中进行身份验证。我们在上一篇文章中解释的参与中遇到了这个问题。
-
在目标是 CA 服务器和存储在其中的信息的任何情况下。
因此,在本文中,我们公开了以下通过滥用 CDP 扩展来破坏 CA 的方法:
-
强制 CA 对远程服务器进行身份验证,从而为NTLM 中继攻击等 打开了大门。 -
通过编写 webshell 获取CA 服务器上的远程代码执行。
此外,我们将发布两个新的 Certify 模块,以允许自动利用这些新的攻击向量。
滥用 CRL 分发点 (CDP)
CRL(证书撤销列表)是一个文件**,其中包含已被撤销**且不再有效的证书的标识符。CA 必须定期在可访问的路径中发布 CRL,以便客户端可以检查证书的有效性。这可以通过在其配置中指示一个或多个 CDP 来完成:
CDP 扩展设置
在设置新的 CDP 时,我们可以使用多种网络协议(HTTP、LDAP、FTP 或 SMB)指定本地或远程路径。此外,我们必须选择 CDP 是用于读取、写入还是两者兼有:
-
用于读取的 CDP(使用“包含在已颁发证书的 CDP 扩展中”选项):该路径将添加到已颁发证书的 CDP 扩展中,以指示客户端在哪里可以找到 CRL。只有三种协议可用于指定读取 CDP,它们是 HTTP、FTP 和 LDAP。 -
用于写入的 CDP(通过选项“将CRL 发布到此位置”):将发布 CRL 的本地或远程路径。要指定远程路径,仅支持 LDAP 和 SMB 协议,并且 CA 服务器必须对提供的远程位置具有写入权限。
由于正常的 CRL 在其发布之前包含所有已撤销证书的标识符(称为Base CRL),因此这些文件的大小在一段时间后会显着增加,这可能会导致网络流量显着增长,因为客户端下载它们只是为了验证一个证书。
为了优化这个过程,可以使用Delta CRL,它只包含自上次 CRL 发布以来被撤销证书的标识符。此外,为确保验证者找到 Delta CRL,CA 允许将它们的位置包含在Base CRL文件中(使用“包含在 CRL 中”检查)。在利用我们接下来要讨论的攻击向量之一时,此选项将很重要。
强制远程身份验证
正如我们已经提到的,可以在 CA 中定义一个 CDP,以便使用语法通过 SMB 协议进行写入file://remote.server/folder/file.crl
。这允许将托管在远程计算机上的共享文件夹添加为 CRL 的发布路径,即使它不是域的一部分。这种行为是有意义的,因为证书可能需要在 Active Directory 的限制之外进行验证。
如果共享文件夹需要身份验证,CA 服务器将尝试进行身份验证以访问该文件夹(使用 NTLM 或 Kerberos,具体取决于 UNC 路径是使用 IP 还是主机名作为其 CDP)。这意味着具有 ManageCA 权限的用户可以从打开NTLM 中继攻击之门的服务器检索 NTLM 质询。同样,如果您控制了一个启用了Kerberos 无约束委派的帐户,则可以为 CA 服务器获取有效的 TGT。
设置 CDP 以强制对任意服务器进行 NTLM 身份验证
由于 Microsoft 发布了MS16-075补丁,将 NTLM 身份验证中继到同一台机器已不再可能(甚至是跨协议),因此该原语不能用于中继到同一 CA 的 Web 登记服务以请求新证书(与ESC8相关的攻击路径)。但是,如果环境中有更多可用的 CA,您可以成功中继到另一个 CA 的 Web 注册服务并为易受攻击的 CA 获取有效证书:
NTLM 从一个 CA 中继到另一个
虽然这种滥用情况需要多个 CA 的存在,但我们认为这在多个 CA 或SubCA可能共存的大型环境中并不罕见。
这种强制身份验证的方法也作为coerceauth
Certify 的新模块 ( ) 实现:
使用 Certify 强制 CA 服务器针对远程 IP 进行身份验证
触发连接后,该模块将恢复之前的配置,避免留下一个不存在的 CDP。
通过 webshell 部署执行代码
由于下载和使用 CRL 的推荐方法是通过 HTTP 协议,因此研究期间提出的假设之一是滥用 CDP部署 webshell。此外,当我们意识到 CDP 可以写入具有任何扩展名的文件时,这一假设变得更加强大,而不是预期的 ( .crl
)。
主要挑战是可靠地控制所创建文件的某些内容,尤其是因为 webshell 代码经常使用有问题的字符,例如<
,%
或>
.
我们的第一种方法是请求在不同字段中插入恶意内容的证书,希望当证书被撤销时,此信息将被插入到 CRL 中。但是,我们在证书中没有发现任何足够大且具有延展性的字段能够执行此过程。
经过多次尝试,我们回忆起前面提到的选项,该选项允许我们在 Base CRL 中添加 Delta CRL 的路径。我们意识到通过这种方式可以部分控制已发布 CRL 的内容。
使用这个特性,我们可以通过以下步骤成功部署一个 webshell:
-
创建第一个 CDP以在所需路径中写入 CRL,并添加适当的扩展名(例如
.asp
)。 -
使用 webshell 有效负载作为路径指定第二个恶意 CDP,该路径将插入第一个 CDP 生成的 CRL 中。
部分文件写入
作为第一次尝试,我们尝试在本地 web 目录中编写一个最小的 ASP webshell C:inetpubwwwroot
,它是在安装 Active Directory 证书服务 (AD CS) 中可用的任何 web 角色时创建的,我们将在后面讨论。
使用百分比符号时出错
在执行此测试时,由于%
在插入恶意 CDP 时使用了该字符,我们收到了错误。这是因为 CDP 使用称为替换标记的功能,它是由百分比符号后跟索引号组成的字符串。根据该索引,它们被替换为不同的值,因此允许创建动态 CDP。
如果我们将 CA 的默认 CDP 与相应注册表项HKLM:SYSTEMCurrentControlSetServicesCertSvcConfiguration<CAName>
CRLPublicationURLs
中存储的值 (由 CA。
默认 CDP 与存储在注册表中的值之间的相关性
在对 AD CS 服务进程 (certsrv.exe) 进行逆向工程后,我们能够确定该certsrv.exe!myFormatCertsrvStringArray
函数生成了一个包含替换令牌值的数组。然后,在调用certsrv.exe!myFormatMessageFromSource
它之后最终调用FormatMessageW函数来生成最终路径。在内部,此函数是用存储在数组中的相应值执行替换标记出现的函数。此外,CA还利用InternetCanonicalizeUrlW函数来完成对插入路径的过滤和规范化过程。
来自反编译的 certsrv.exe!myFormatCertsrvStringArray 函数的片段
值得注意的是,该函数通过使用语法FormatMessageW
允许使用格式字符串。%n!format string!
我们可以承认这种行为,例如,通过在 CRL 中打印数组内第一个元素的内存地址(例如%1!p!
):
使用格式字符串扩展打印的内存地址
虽然这可能会为格式化字符串攻击或内存损坏打开大门,但我们还没有看到任何引入不可打印字符的方法。也就是说,通过指定具有扩展为大于2^16大小的格式字符串的 CDP (例如) ,可能会在 CA 中导致拒绝服务。%1!65536s!
在确定 CA 完成的格式化和过滤 URL 的过程之后,有必要使用转义某些特殊字符%
,以便它们在 FormatMessageW 进行替换后不会消失。另一方面,我们还注意到%n
在 CDP 开头添加换行符 ( ) 会绕过函数 执行的部分过滤。InternetCanonicalizeUrlW
考虑到上述所有情况,我们决定实现一个新的 Certify 模块,该模块允许通过 CDP 扩展将任意文件写入本地或远程路径。我们再次使用 ICertAdmin2::SetConfigEntry
DCOM 方法来修改CRLPublicationURLs注册表项的值:
使用 Certify 编写使用本地 ASP 文件作为输入的 webshell
此外,如果没有通过/input
标志指定输入文件,则根据目标路径的扩展名编写默认的 ASP 或 PHP webshell:
未指定输入文件时生成的默认 webshell 示例
这样,具有ManageCA权限的用户可以在 CA 服务器上的任何本地路径或该服务器具有写入权限的任何远程路径上执行任意文件写入。此外,我们设法部分控制了该文件的内容及其扩展名,使我们能够通过部署 webshell 来获得远程代码执行。默认情况下,webshell 在应用程序池身份(DefaultAppPool 用户)的上下文中执行,因此可以通过滥用SeImpersonate
权限将权限提升到 SYSTEM。
同样,应注意 CA 本身负责编写 CRL,该过程以NT AUTHORITYSYSTEM
特权执行。这意味着我们可以写入任何本地路径并覆盖系统上的任何文件。尽管这可以用于我们尚未检测到的其他方式,但无法完全控制 CRL 的内容并且无法插入二进制内容的事实减少了被利用的机会。无论如何,此攻击向量可用于通过覆盖系统文件 来远程破坏 CA 服务器。
在这一点上,我们可能面临的主要问题是在 CA 中缺少一个 Web 服务器来托管我们的 Webshell。因此,我们在实验室中验证了任何不同 AD CS Web 角色的安装都包括安装 IIS 服务器,其中默认 Web 目录位于C:inetpubwwwroot
.
根据安装的角色,将支持 ASP 或 ASPX 文件,我们可以根据可用的端点检测安装了哪些角色:
在我们的测试中,我们检测C:WindowsSystem32
到 Windows Defender 会立即检测到写入 webshell。
如果 CA 服务器上没有安装 Web 服务,则可能存在已配置的 CDP 指向外部 Web 服务器,可以在其中编写 Webshell。这篇Microsoft 文章解释了几种可能需要使用单独服务器的场景,这也是新 Certify 模块允许指定本地或远程路径的原因。
为了检测 CA 已经发布 CRL 并因此具有写入权限的潜在远程 Web 目录,已在命令中/readonly
添加了一个标志writefile
,以便读取 CA 的 CDP 列表而不会弄乱它们:
使用 Certify 列出当前 CDP 列表
检测
在检测这些攻击方面,最好的选择是启用对 AD CS 相关事件的审计,如原始论文中所述。启用后,我们可以监控以下事件:
-
事件 4871(“证书服务收到发布证书撤销列表的请求”):由于 CRL 的发布通常是 CA 配置中设置的每个特定时间发生的自动活动,因此在这些时间段之外生成此事件可能是本文中描述的恶意活动的指标。 -
事件 4872(“证书服务发布了证书吊销列表 (CRL) ”):分析 CDP 的 URL 和扩展名可以检测与编写恶意 CRL 文件相关的可疑活动。
发布 CRL 时生成的事件 4872
结论
第二篇专门针对 AD CS 的文章让我们发现了具有 ManageCA 权限的用户可以利用 CDP 扩展破坏 CA 服务器的新方法。
另一方面,我们向 Certify 添加了两个新模块,允许自动利用本文中解释的攻击向量。这些功能以及上一篇文章中发布的功能都可以在BlackArrow 存储库中找到。
译文申明
-
文章来源为 近期阅读文章
,质量尚可的,大部分较新,但也可能有老文章。 -
开卷有益,不求甚解
,不需面面俱到,能学到一个小技巧就赚了。 -
译文仅供参考
,具体内容表达以及含义,以原文为准
(译文来自自动翻译) -
如英文不错的, 尽量阅读原文
。(点击原文跳转) -
每日早读
基本自动化发布(3-7天会删除),这是一项测试
最新动态: Follow Me
微信/微博:
red4blue
公众号/知乎:
blueteams
原文始发于微信公众号(甲方安全建设):译文 | AD CS:从 ManageCA 到 RCE (Webshell)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论