利用CVE-2018-0950漏洞自动窃取Windows密码
0×00 前言
记得还在2016年的时候,我的一个同事那时还在使用CERT BFF(自动化模糊测试工具),他向我询问到如何将微软办公软件中看起来可利用的漏洞转化成可以运行的病毒程序并进行概念论证。考虑到现代微软平台中所使用的随机空间地址分配策略(ASLR),这项工作的实施并不像从前那么容易。在某些情况下,可以绕过随机空间地址分配的一种策略是利用内存泄漏来公开内存地址;另一种方法便是通过漏洞进行暴力破解从而使得随机空间地址分配策略无法发挥作用。然而,在这种情况下,阻力最小的方法便是使用Rich Text Format(RTF)内容来利用对象链接和嵌入技术加载未选择使用ASLR的库。
当我开始加入富文本格式和对象链接和嵌入技术时,我发现了比ASLR旁通更严重的漏洞。在下文中,随着我的研究,你将会发现这一缺陷能够导致Windows系统崩溃和密码被盗等情况的发生。
在继续深入分析我的研究之前,先介绍一下相关基础知识:
0×01 对象连接与嵌入(OLE)
OLE是Microsoft于1990年发布的一项技术,它允许将来自一个程序的内容嵌入到另一个程序处理的文档中。 例如,在Windows 3.x中,Microsoft Write提供了嵌入“画笔图片”对象以及“声音”或“包”的功能。 这些是可以插入Write文档中的三个可用的OLE对象:
一旦插入,我们就有一个嵌入了画笔内容的文档。
0×02 服务器报文块协议(SMB)
SMB是一种协议,它扩展了用于本地文件访问的DOS API(中断21h)以包含网络功能。也就是说,操作者可以像访问本地驱动器上的文件一样访问远程服务器上的文件。微软在Windows for Workgroups3.1中包含了SMB功能,该版本于1992年发布。
2.1 Microsoft Outlook
Microsoft Outlook是Microsoft Office附带的电子邮件客户端。 Outlook包括发送富文本(RTF)电子邮件的功能。 这些消息可以包含OLE对象。
当使用Microsoft Outlook客户端查看电子邮件时,富文本电子邮件将会以更为酷炫的方式展现邮件内容。
0×03 前述内容小结
你可能已经知道我的想法了,如果仍不明晰,就让我们总结一下目前为止所了解到的内容:
1.Microsoft Outlook可以创建和呈现RTF电子邮件。
2.RTF文档(包括电子邮件消息)可以包含OLE对象。
3.由于SMB,OLE对象可以位于远程服务器上。
3.1 观察Microsoft Outlook行为
互联网上的HTML电子邮件比富文本电子邮件更为常见,因此,让我们首先查看在Web服务器上具有远程图像的HTML消息时Microsoft Outlook的行为:
在这里我们可以看到远程图像没有自动加载。为什么会出现这样的情况?原因是如果Outlook允许远程映像自动加载,它可能会泄露客户端系统的IP地址和其他元数据,例如查看电子邮件的时间。 此限制有助于防止电子邮件中使用的网络错误。现在让我们以富文本格式的形式来查看同样的内容,现在它并不是远程图像文件,而是从远程SMB服务器上加载的OLE文档:
这种现象是意料之外的。由于网络错误的隐私风险,Outlook会阻止远程Web内容。 但是,如果使用富文本电子邮件,则OLE对象将被加载而没有用户交互。让我们看一下Wireshark(网络封包分析软件)中的流量来弄清由于这种自动远程对象加载泄露了什么内容:
在这里我们可以看到,SMB连接正在自动协商。触发此协商的唯一操作是Outlook对发送给它的电子邮件进行了预览操作。 在上面的屏幕截图中,我可以看到以下内容正在泄露:
1、IP地址
2、域名
3、用户名
4、主机名
5、SMB会话密钥
富文本电子邮件中的远程OLE对象的作用就类似于网络错误中的兴奋剂。在2016年末的分析中,我通知了微软这个问题。
0×04 OLE网络错误的影响
这个错误将导致两个主要的问题,如下所述:
4.1 客户端崩溃
我们知道在这一点上,我们可以出发Outlook启动到任意主机的SMB连接。2017年2月1日,披露了Windows SMB客户端漏洞(VU#867968)。 连接到恶意SMB服务器时,Windows会崩溃。如果我们在Outlook中创建了富文本电子邮件,但指向利用此漏洞的SMB服务器,该怎么办?
如上所述,一旦Outlook预览了这样一封电子邮件,Windows就会崩溃,出现蓝屏死机(蓝屏)。除此之外,每次遇到这种情况后Outlook都会启动,Windows将再次崩溃,因为Outlook会记住最后一封打开的电子邮件。这相当于拒绝服务攻击行为。在这一点上,我与微软分享了攻击细节。最终,微软解决了这个SMB漏洞,幸运的是,我们没有听说任何基于邮件的大规模电子邮件攻击。
4.2 收集密码哈希值
除了SMB的漏洞之外,我决定深入挖掘客户端试图启动SMB连接到攻击者服务器的风险。 根据我在Wireshark(网络封包分析软件)中看到的,我已经知道它泄露的不仅仅是受害者的IP地址。这次我同时使用了Responder)(响应系统)和John the Ripper(快速密码破解工具)。
首先,我发送了一个富文本电子邮件,该电子邮件具有指向运行响应程序的系统的远程OLE对象。在响应系统上,我在Outlook中预览电子邮件后立即看到以下内容:
[SMB] NTLMv2-SSP Client : 192.168.153.136[/size]
[size=3][SMB] NTLMv2-SSP Username : DESKTOP-V26GAHF\test_user[/size]
[size=3][SMB] NTLMv2-SSP Hash : test_user::DESKTOP-V26GAHF:1122334455667788:571EE693342B161C50A73D502EB49B5A:010100000000000046E1992B4BB2D301FFADACA3241B6E090000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D004200310032000800300030000000000000000100000000200000D3BDB30B62A8937256327776471E072C7C6DE9F4F98458D1FEA17CBBB6AFBA770A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100350033002E003100330038000000000000000000
这里我们有一个NTLMv2哈希,我们可以将它交给John the Ripper(快速密码破解工具)。 如下所示,我将哈希复制并粘贴到名为test_user.john的文件中:
john test_user.john[/size]
[size=3]Using default input encoding: UTF-8[/size]
[size=3]Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])[/size]
[size=3]Will run 24 OpenMP threads[/size]
[size=3]Press ‘q’ or Ctrl-C to abort, almost any other key for status[/size]
[size=3]test (test_user)[/size]
[size=3]Session completed
在不到1秒的时间内,我就可以确定打开我富文本电子邮件的用户“test_user”的密码是“test”。 更强密码的散列(更长和更多类型的字符)需要更长时间才能破解。我已经做了一些基本的测试,在单个中档GPU(NVIDIA GTX 960)上破解8字符密码的整个解决方案空间需要多长时间:
1、小写字母 – 16分钟
2、混合大小写字母 – 3天
3、混合大小写字母和数字 – 12天
4、混合大小写字母,数字和符号 – 1年
以上统计数据是暴力破解随机生成密码的最坏情况。任何文字(比如“test”)或模式(比如“asdf”)的密码比随机生成的密码更容易破解,因为大多数破解工具都有规则来检查这些事情。
另外,攻击者可以访问具有多个高端GPU的系统,这些GPU可以将他们的时间缩减为上述数字的一小部分。不过,添加到密码长度的每个字符对暴力破解密码所需的时间都有指数效应。例如,虽然我的中档GPU需要1年的时间才能耗尽8个字符的密码(混合大小写字母,数字和符号)的整个解决方案空间,但将密码长度增加到9个字符也会增加耗时,将需84年来获取全部解决方案空间!
0×05 微软的修复
微软针对Outlook自动加载远程OLE内容(CVE-2018-0950)的问题发布了一个修复程序。一旦安装了此修复程序,预览的电子邮件将不再自动连接到远程SMB服务器。 此修复有助于防止上面列出的攻击。但意识到即使使用这个补丁,用户仍然只需点击一下即可成为上述攻击类型的受害者,这一点很重要。例如,如果电子邮件消息具有以“\\”开头的UNC样式链接,则单击此链接会启动到指定服务器的SMB连接。
其他详细信息可在CERT漏洞注释VU#974272中找到。
0×06 结论与建议
在Windows平台上,有几种方法可以使客户端启动SMB连接。 任何时候SMB连接启动时,客户端的IP地址,域名,用户名,主机名和密码哈希都可能泄漏。 为了防止涉及导致受害者机器启动SMB连接的攻击,请考虑以下缓解措施:
安装Microsoft更新CVE-2018-0950。此更新防止在预览富文本电子邮件时自动检索Microsoft Outlook中的远程OLE对象。 但是,如果用户单击SMB链接,此行为仍会导致密码散列泄漏。
在您的网络边界处阻止入站和出站SMB连接。这可以通过阻止端口445/tcp,137/udp,139/udp以及137/udp和139/udp来完成。
按照Microsoft安全通报ADV170014中的规定,阻止NTLM单点登录(SSO)身份验证。从Windows10和Server2016开始,如果创建EnterpriseAccountSSO注册表值并将其设置为0,则将禁用外部和未指定网络资源的SSO身份验证。通过此注册表更改,仍然允许访问SMB资源,但外部和未指定的SMB资源将需要用户输入凭据,而不是自动尝试使用当前登录的用户的散列。
假设您的客户端系统在某个时候会尝试与攻击者的服务器建立SMB连接。 因此,请确保任何Windows登录名都有足够复杂的密码,以防止破解。以下两种策略可以帮助实现这一目标:
1.使用密码管理器来帮助生成复杂的随机密码 此策略可以帮助确保跨所用资源使用唯一密码,并确保密码具有足够的复杂性和随机性。
2.使用更长的密码(使用混合大小写字母,数字和符号)而不是密码。这种策略可以产生令人难忘的凭证,不需要额外的软件来存储和检索。
- 作者:Will Dormann
- 翻译:i春秋翻译小组
- 责任编辑:F0rmat、浅安
- 发表于Vulnerability Discovery
- 转载请注明来自bbs.ichunqiu.com
- 参考来源:(https://insights.sei.cmu.edu/cer … utlook-and-ole.html),
利用CVE-2018-0950漏洞自动窃取Windows密码的更多相关文章
- 利用C&C漏洞来查看恶意软件Dridex的操作流程
利用C&C漏洞来查看恶意软件Dridex的操作流程 据了解,安全研究人员已经获取到了银行恶意软件Dridex的C&C的访问权限了.这也就意味着,安全研究人员可以了解到网络犯罪分子到底窃 ...
- vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸
转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...
- 利用DNS Zone Transfers漏洞工具dnswalk
利用DNS Zone Transfers漏洞工具dnswalk DNS Zone Transfers(DNS区域传输)是指一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.当主服 ...
- Ubuntu12.04开机自动挂载windows分区
最近使用Ubuntu12.04时不知到怎么搞的原本能自动识别的Windows的C .D .E盘突然间无法识别了,于是上网搜了一下Ubuntu12.04下自动挂载Windows NTFS分区的方法. 还 ...
- Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码
Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用 ...
- [转]Ubuntu 12.04开机自动挂载Windows分区
[转]Ubuntu 12.04开机自动挂载Windows分区 http://www.cnblogs.com/A-Song/archive/2013/02/27/2935255.html 系统版本:Ub ...
- Ubuntu开机自动挂载Windows分区
转自Ubuntu 12.04开机自动挂载Windows分区 1.查看系统磁盘号 sd2,sd5,sd7分别对应我windows的C,D,F盘,也是本次要添加到开机挂载的,E盘为wubi安装盘. 2.查 ...
- Linux开机自动挂载Windows分区
使用Linux的朋友肯定都不会对本文所谈的内容陌生,在Linux系统里,通常不会开机自动挂载Windows文件系统下的分区.Ubuntu系统下要点击Windows分区才会挂载,Fedora下则甚至要输 ...
- ubuntu自动挂载windows分区和开机自动启动wallproxy
1. 自动挂载windows分区 ubuntu默认是要点一下相应的盘符才会挂载windows分区的. 今天发现了ubuntu下最简单的自动挂载windows分区的办法.... :) 参考如下方法:ht ...
随机推荐
- 【轻松前端之旅】<!DOCTYPE>标签
前端学习,先学习HTML,CSS,Javascript HTML - HyperText Markup Language HTML-超文本标记语言,提供了一种标记网页内容的方法. 浏览器怎么知道如何显 ...
- redis2
一.安装redis 1) 下载redis安装包 可去官网http://redis.io ,也可通过wget命令, wget http://download.redis.io/redis-sta ...
- 2018.12.15 poj3415 Common Substrings(后缀自动机)
传送门 后缀自动机基础题. 给两个字符串,让你求长度不小于kkk的公共子串的数量. 这题可以用后缀自动机解决废话 考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话, ...
- EF对应null的处理
原来的代码是 if (string.IsNullOrWhiteSpace(seal)) seal = null; ctx.Terminal.FirstOrDefault(ent=>ent.Sea ...
- 在多台PC之间同步Resharper所有设置的方法
默认情况下Resharper只允许导出CodeStyle的设置,对于其它的设置不能导出,这样在不利用我们在多台PC之间同步Resharper的设置,经过多次尝试和Google找到了一种解决办法: Re ...
- BT1120时序,可以用于自测用
module bt1120_gen #( , , , , , )( input clk, input rst_p, // input [5:0] h_sync_pixcels, // input [5 ...
- C# String字符串
C#(静态String类) C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利.System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字 ...
- js基础学习笔记(一)
* 在js编写过程中,尽量保持统一使用单引号 'XXXX': * 所有变量都要声明 var,避免全局函数调用的冲突: 1.1 输出内容 docment.write(‘aileLi’); 改变某I ...
- Android listview 侧滑 SwipeListView 详解 实现微信,QQ等滑动删除效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28508769 今天看别人项目,看到别人使用了SwipeListView,Goog ...
- codeforces 877e
E. Danil and a Part-time Job time limit per test 2 seconds memory limit per test 256 megabytes input ...