正如我们已经提到的,可以在 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可能共存的大型环境中并不罕见。
此外,如果没有通过/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 配置中设置的每个特定时间发生的自动活动,因此在这些时间段之外生成此事件可能是本文中描述的恶意活动的指标。
评论