我喜欢的一件事是当我认为我很好地理解了一个话题,然后有人证明我完全错了。当 James Forshaw 发表一篇关于 Kerberos 中继的博客时,或多或少发生了这种情况,这反驳了我几年前不能中继 Kerberos 的结论. James 表明,有一些技巧可以使 Windows 对不同的服务主体名称 (SPN) 进行身份验证,而不是通常从客户端连接到的主机名派生的名称,这意味着 Kerberos 并不像我假设的那样完全防中继。这促使我研究了一些替代的滥用路径,包括我几年前研究过但永远无法工作的东西:中继 DNS 身份验证。当您能够使用 mitm6 通过 DHCPv6 欺骗来欺骗 DNS 服务器时,这一点尤其重要。在这种情况下,您可以让受害机器使用 Kerberos 及其机器帐户可靠地向您进行身份验证。此身份验证可以中继到任何不强制完整性的服务,例如基于 Active Directory 证书服务 (AD CS) http(s) 的注册,AD CS 中继。与使用 mitm6 中继 WPAD 身份验证相比,此技术更快、更可靠且侵入性更小,但当然需要使用 AD CS。这篇博客描述了这项技术的背景以及我对 krbrelayx 所做的更改,以支持这次真正的 Kerberos 中继。
基于 DNS 的 Kerberos
如果您熟悉 Kerberos,您就会知道 DNS 是拥有有效的 Kerberos 基础架构的关键组件。但是您知道 Active Directory 中的 DNS 还支持使用 Kerberos 在 DNS 上进行身份验证的操作吗?这是“安全动态更新”操作的一部分,用于使具有动态地址的网络客户端的 DNS 记录与其当前 IP 地址保持同步。下图显示了动态更新过程中涉及的步骤:
基于 DNS 的 Kerberos
步骤如下(按照上面的数据包从上到下)。在此交换中,客户端是 Windows 10 工作站,服务器是具有 DNS 角色的域控制器。
客户端查询其名称的授权开始 (SOA) 记录,该名称指示哪个服务器对客户端所在的域具有权威性。
服务器使用授权的 DNS 服务器进行响应,在本例中为 DC icorp-dc.internal.corp。
如果我们能够拦截 DNS 查询,就有可能欺骗受害客户端向我们发送真实 DNS 服务器的 Kerberos 票证。这种拦截可以在默认的 Windows 配置中由同一 (V)LAN 中的任何系统使用mitm6 完成。mitm6 将自己宣传为 DNS 服务器,这意味着受害者将发送SOA到我们的假服务器,如果我们拒绝他们的动态更新,则使用 Kerberos 进行身份验证。现在这有点棘手。通常 DNS 服务器角色将在域控制器上运行。因此,DNS 服务的服务票证已经适用于在 DC 上运行的服务,因为它们使用相同的帐户,我们可以更改票证中的服务名称。这意味着我们可以将此票证中继到例如 LDAP。但是,如果我们仔细查看 TKEY 查询中的身份验证器,我们会看到设置了请求完整性(签名)的标志。
客户端专门请求他们在其 Kerberos 票证请求中使用的 SPN 中的“dns”服务类。此 SPN 仅在实际的 DNS 服务器上设置,因此要中继到的合法主机的数量非常少。
在阅读了 James 的博客后重温这一点,我意识到这些都不是当今知识的问题:
由于 AD CS 研究是由 Lee Christensen 和 Will Schroeder发表的,因此我们有一个高价值的端点,它存在于大多数 AD 环境中,并为受害者提供代码执行可能性,如我在上一篇关于 AD CS 中继的博客中所述。
正如 James 在他的博客中所描述的,许多服务类实际上会隐式映射到 HOST 类。事实证明,这包括 DNS,因此当我们的受害者请求 DNS 服务的票证时,这实际上适用于具有 HOST SPN 的任何帐户。这是默认在域中的所有计算机帐户上设置的,因此可以针对在这些帐户下运行的任何服务。
解决了这两个问题后,没有什么能真正阻止我们将我们在假 DNS 服务器上收到的 Kerberos 身份验证转发到 AD CS。完成后,我们可以为我们转发的计算机帐户申请证书,并使用我在之前的博客中谈到的 NT 哈希恢复技术或 S4U2Self 技巧。使用这些技术,我们可以SYSTEM访问受害计算机,这有效地使其成为可靠的 RCE,只要 AD CS http 端点可用于中继。
评论