导语:本文分析了Outlook漏洞CVE-2018-0950的形成原因及可能导致的危害,并给出了缓解措施。
早在2016年,我的一位同事正在使用CERT BFF,他在考虑如何将Microsoft Office中看起来可利用的崩溃转化为运行calc.exe的poc。鉴于现在Windows平台上的地址空间布局随机化(ASLR),因此这并不会像以前那么容易。在某些情况下,可以绕过ASLR的一种策略是利用内存泄漏来公开内存地址。另一种有可能的策略是暴力攻击漏洞,使ASLR无关紧要。在这种情况下,最好的方法是简单地使用Rich Text Format(RTF)内容来利用对象链接和嵌入(OLE)加载未使用ASLR的库。
当我开始抓取RTF和OLE的线程时,我发现了比绕过ASLR更严重的漏洞。下面我们看看如何导致Windows系统崩溃和密码被盗。
一、OLE
OLE是Microsoft于1990年发布的一项技术,它允许将来自一个程序的内容嵌入到另一个程序处理的文档中。例如,在Windows 3.x中,Microsoft Write提供了嵌入“图片”对象以及“声音”或“Package”的功能。这些是可以插入Write文档中的三个可用的OLE对象:
一旦插入,就有了一个嵌入画笔图片的Write文档。
二、SMB
SMB是一种协议,它扩展了用于本地文件访问的DOS API(中断21h)来包含网络功能。也就是说,访问远程服务器上的文件,就像访问本地驱动器上的文件一样。微软在Windows for Workgroups 3.1中引入了SMB,该版本于1992年发布。
三、Microsoft Outlook
Microsoft Outlook是Microsoft Office附带的电子邮件客户端。Outlook包括了发送RTF电子邮件的功能。这些消息中可以包含OLE对象。
使用Microsoft Outlook客户端查看时,这些RTF电子邮件将以RTF形式显示。
四、三合一
总结一下到目前为止所了解的内容:
1.Microsoft Outlook可以创建和呈现RTF电子邮件。
2.RTF文档(包括电子邮件)可以包含OLE对象。
3.由于SMB,OLE对象可以位于远程服务器上。
五、Microsoft Outlook行为
因特网上的HTML电子邮件比RTF电子邮件更常见。因此,首先来看一下在当浏览包含位于Web服务器上图片的HTML消息时,Microsoft Outlook的行为:
可以看到远程图片没有自动加载。为什么会这样?原因是因为如果Outlook允许远程图片自动加载,就可能会泄露客户端的IP地址和其他元数据,例如查看电子邮件的时间。此限制有助于防止电子邮件中使用的web bug。
现在尝试一下类似的信息,除了RTF格式。不是远程图片文件,它是从远程SMB服务器加载的OLE文档:
这是意料之外的。由于web bug的隐私风险,Outlook会阻止远程Web内容。但是,如果使用RTF电子邮件,则OLE对象将被加载而无需用户交互。让我们看一下Wireshark中的流量,看看由于这种自动远程对象加载究竟泄露了什么:
可以看到,SMB连接正在自动协商。触发此协商的唯一操作是Outlook预览发送给它的电子邮件。在上面的屏幕截图中,可以看到泄露了以下内容:
1.IP地址
2.域名
3.用户名
4.主机名
5.SMB会话密钥
RTF电子邮件中的远程OLE对象功能类似于steroids上的web bug!在2016年末,我通知了微软这个问题。
六、OLE Web Bug的影响
这个bug会导致两个主要问题,如下所述。
(一)客户端崩溃
我们知道这一点,可以触发Outlook启动到任意主机的SMB连接。2017年2月1日,披露了Windows SMB客户端漏洞(VU#867968)。连接到恶意SMB服务器时,Windows会崩溃。如果在Outlook中创建了RTF电子邮件,但指向利用此漏洞的SMB服务器,会发生什么?
一旦Outlook预览了这样一封电子邮件,Windows就会崩溃,并出现蓝屏死机(BSOD),如上所述。除此之外,每次遇到这种情况后Outlook都会启动,Windows将再次崩溃,因为Outlook会记住最后一封打开的电子邮件,这相当于拒绝服务攻击。我与微软分享了攻击细节。最终,微软解决了这个SMB漏洞,幸运的是,我们没有听说任何基于此的大规模电子邮件攻击。
(二)收集口令Hash
除了SMB漏洞之外,我决定深入挖掘客户端启动SMB连接到攻击者服务器的风险。根据在Wireshark中看到的,我知道它泄露的不仅仅是受害者的IP地址。这次我使用了Responder 和John the Ripper。
首先,我发送了一个RTF电子邮件,该电子邮件具有指向运行Responder的系统的远程OLE对象。在Responder上,我在Outlook中预览电子邮件后立即看到以下内容:
[SMB] NTLMv2-SSP Client : 192.168.153.136 [SMB] NTLMv2-SSP Username : DESKTOP-V26GAHF\test_user [SMB] NTLMv2-SSP Hash : test_user::DESKTOP-V26GAHF:1122334455667788:571EE693342B161C50A73D502EB49B5A:010100000000000046E1992B4BB2D301FFADACA3241B6E090000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D004200310032000800300030000000000000000100000000200000D3BDB30B62A8937256327776471E072C7C6DE9F4F98458D1FEA17CBBB6AFBA770A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100350033002E003100330038000000000000000000
我们得到一个NTLMv2 Hash,将它交给John the Ripper。如下所示,将Hash复制并粘贴到名为test_user.john的文件中:
john test_user.john Using default input encoding: UTF-8 Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64]) Will run 24 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status test (test_user) Session completed
大约1秒就能够确定打开我的RTF电子邮件的用户test_user的密码是test。强密码的Hash(更长和更多类型的字符)需要更长时间才能破解。我已做了一些基本的测试,在单个中档GPU(NVIDIA GTX 960)上破解8个字符密码的全空间需要多长时间:
· 小写字母——16分钟
· 混合字母——3天
· 混合大小写字母和数字——12天
· 混合大小写字母,数字和符号——1年
以上统计数据是暴力破解随机密码的最坏情况。任何文字(比如test)或模式(比如asdf)的密码比随机密码更容易破解,因为大多数破解工具都有规则来检测这些事情。
另外,攻击者可以使用多个高端GPU的系统,这些GPU可以将时间缩减为上述数字的一小部分。不过,添加到密码长度的每个字符对暴力破解所需的时间都有指数效应。例如,虽然我的中档GPU需要1年时间才能穷尽8个字符的密码(混合大小写字母,数字和符号)的全空间,但将密码长度增加到9个字符穷尽全空间的时间将多达84年!
七、微软补丁
微软针对Outlook自动加载远程OLE(CVE-2018-0950)的漏洞发布了一个补丁程序。一旦安装了此补丁程序,预览的电子邮件将不再自动连接到远程SMB服务器。此修复有助于防止上面列出的攻击。很重要的一点,即使打上这个补丁,用户仍然只需点击一下即可成为上述攻击类型的受害者。例如,如果电子邮件消息具有以“\\”开头的UNC链接,则单击此链接会启动到指定服务器的SMB连接。
其他详细信息可在CERT漏洞注释VU#974272中找到。
八、结论和建议
在Windows平台上,有几种方法可以使客户端启动SMB连接。每当启动SMB连接时,客户端的IP地址、域名、用户名、主机名和口令Hash都可能泄漏。为防止涉及导致受害者机器启动SMB连接的攻击,请考虑以下缓解措施:
· 安装Microsoft update CVE-2018-0950。此更新防止在预览RTF电子邮件时自动获取Microsoft Outlook中的远程OLE对象。但是,如果用户单击SMB链接,此行为仍会导致口令Hash泄漏。
· 在网络边界处阻止入站和出站SMB连接。这可以通过阻断端口445/tcp, 137/tcp, 139/tcp以及137/udp和139/udp来完成。
· 按照Microsoft Security Advisory ADV170014中的规定,禁止NTLM单点登录(SSO)身份验证。从Windows 10和Server 2016开始,如果创建EnterpriseAccountSSO注册表值并将其设置为0,则将禁用外部和未指定网络资源的SSO身份验证。通过此注册表更改,仍然允许访问SMB资源,但外部和未指定的SMB资源将需要用户输入凭据,而不是自动使用当前登录用户的Hash。
· 假设客户端系统在某个时候会尝试与攻击者的服务器建立SMB连接。因此,请确保任何Windows登录名都有足够复杂的密码,以防止破解。以下两种策略可以帮助实现这一目标:
1.使用密码管理器来帮助生成复杂的随机密码。此策略可以帮助确保跨资源使用唯一密码,并确保密码具有足够的复杂性和随机性。
2.使用更长的密码(使用混合大小写字母,数字和符号)。这种策略足以生成令人难忘的凭证,无需其它软件来存储和生成。