利用DCOM OXID解析中继Kerberos认证的技术分析

本文深入分析了如何通过操纵DCOM OXID解析过程中的机器名称字段,实现Kerberos认证中继攻击的技术细节,包括SPN格式的特殊处理和实际利用步骤,为Windows域安全研究提供了重要参考。

利用DCOM OXID解析中继Kerberos认证

最近,针对我十年前向微软报告的DCOM认证漏洞出现了新的研究成果。通过诱导DCOM认证,可以将其中继到网络服务(如Active Directory证书服务)来提升权限,在某些情况下甚至可以获得域管理员访问权限。

这项新研究的重要区别在于,通过滥用安全配置变更或过度授权组访问,将DCOM认证滥用从本地访问(如各种Potato攻击)扩展到了完全远程攻击。

OXID解析中的Kerberos中继问题

根据Tianze Ding在黑帽亚洲2024演讲的第36张幻灯片,提到在初始OXID解析器请求期间尝试中继Kerberos认证的问题。幻灯片指出,在OXID解析期间无法中继Kerberos认证,因为无法控制用于认证的SPN - 它总是设置为RPCSS/MachineNameFromStringBinding。

虽然可以在标准OBJREF结构中控制字符串绑定,但RPCSS会忽略安全绑定,因此无法像后续的对象RPC调用那样指定SPN。

突破限制的技术细节

这个描述引起了我的兴趣,因为我认为这并不完全正确。只需要滥用我在原始Kerberos中继博客文章中描述的一个"特性"即可。具体来说,Kerberos SSPI支持一种特殊的SPN格式,其中包含封送的目标信息。

这意味着可以构建形式为CLASS/<SERVER><TARGETINFO>的SPN,而Kerberos将使用CLASS/<SERVER>进行认证。有趣的是,如果<SERVER><TARGETINFO>组件来自我们正在认证的服务器的hostname,那么可以将用于认证的SPN与用于通信的hostname解耦。

这正是我们在这里得到的情况 - MachineNameFromStringBinding来自不受信任的源,即我们指定的OBJREF。我们可以用这种特殊格式指定机器名称,这将允许OXID解析器与hostname为<SERVER><TARGETINFO>的服务器通信,但使用RPCSS/<SERVER>进行认证,而<SERVER>可以是任何我们想要的内容。

技术限制和解决方案

这种方法有几个重要的注意事项:

  1. 机器名称不能包含任何点,因此必须是内网地址。这是因为几乎不可能构建一个表示有效完全限定域名的有效TARGETINFO字符串。

  2. 由于DNS协议的限制,hostname的最大长度限制为63个字符。如果将完全空的CREDENTIAL_TARGET_INFORMATION结构传递给CredMarshalTargetInfo API,会得到最小有效目标信息字符串,长度为44个字符。这只剩下19个字符用于SERVER组件,但这通常不是大问题。

利用步骤

要利用此漏洞,需要执行以下步骤:

  1. 通过将目标SPN的hostname附加到最小字符串"1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA"来构建机器名称

  2. 在域的DNS服务器上将机器名称注册为主机,将记录指向您控制的服务器,并可以在TCP端口135上替换监听服务

  3. 使用机器名称构建OBJREF,并通过首选方法(如滥用IStorage激活)诱导OXID解析

  4. 对诱导的Kerberos认证进行有用操作

实际测试结果

根据这些信息,我自己进行了一些测试,Andrea也使用SilverPotato进行了检查,似乎可以正常工作。当然也有限制,最大的限制是安全绑定被忽略,因此OXID解析器使用Negotiate。这意味着Kerberos认证总是至少启用完整性进行协商,这使得认证在大多数情况下无用,尽管它可以用于ADCS的默认配置。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计