1E28FDCB-6279-454A-9EE9-46B0178ACEA8.png

写在前面的话

FireEye旗下的Mandiant公司在周二发布了2017年M-Trends研究报告,这份报告中的数据是基于该公司对真实攻击事件的分析所得出的。报告指出,在过去的几年里随着黑客技术的不断发展,很多以经济利益为目的的黑客团伙变得越来越复杂,而有些犯罪团伙的技术水平已经达到了国家黑客的高度。

在2013年以前,安全专家将大多数网络犯罪分子所进行的黑客活动称之为“smash and grab”攻击,在这种攻击中犯罪分子几乎不会隐藏自己的活动踪迹,并且会持续从目标系统中窃取数据。而2013年以后,以经济利益为目的的攻击者跟国家黑客之间的界限也变得越来越模糊了,而很多犯罪组织的黑客技术水平已经跟国家黑客不相上下了。在此之前,以经济利益为目的的黑客使用的是WebShell、用Perl2Exe编译的恶意代码、以及远程C&C服务器,而现在他们会根据目标系统的特性来开发具有针对性的自定义后门,并利用合法网站来完成C&C通信。

2.png

Mandiant的安全研究人员在2016年发现,很多的攻击活动或多或少都与启用了恶意宏的文件有关。在这些攻击场景中,攻击者会在电子邮件或恶意文件中嵌入指令来尝试诱骗用户开启宏,有些攻击者甚至还会给目标用户打电话并通过社工技术来说服他们启用宏。

其中,零售商成为了他们最大的攻击目标。这不仅是因为攻击者可以从他们身上获取巨额利益,而且他们的网络系统安全系数非常低。由于很多零售商的网络系统没有进行分段隔离,当攻击者成功入侵了PoS系统之后,他们将能够破坏零售商整个PCI环境。

因为攻击者可以从攻击中获利,所以他们自然会在这方面下大功夫。在FireEye调查的一起攻击事件中,黑客团伙利用了一个Windows系统的0 day漏洞攻击了不下一百家企业的计算机系统并成功实现提权。除此之外,他们还利用了非常复杂的技术躲过了安全产品的检测并实现了持久化感染,而其中最有意思的一项技术就是在操作系统启动之前通过修改卷引导记录(VBR)来加载后门。接下来,我们会给大家详细分析一下这个Windows的0 day漏洞以及攻击者所使用的技术。

事件背景

2016年3月,一个以经济利益为目的的黑客团伙针对零售商、餐馆和酒店发动了多次具有针对性的网络钓鱼攻击。经过研究人员的分析,钓鱼邮件中包含嵌入了宏恶意Word文档,当用户启用宏之后便会自动下载并执行恶意文件下载器(报告称其为PUNCHBUGGY)。

PUNCHBUGGY是一个DDL(动态链接库)文件下载器,具有32位和64位两种版本,它可以通过HTTPS获取额外代码。攻击者会通过这个下载器来与受感染的系统交互,并尝试感染同一网络环境下的其他系统。

FireEye发现北美地区已经有超过一百家企业成为了这种攻击的受害者。FireEye对其中多起事件进行了调查,并且发现攻击者利用了一个未知的提权漏洞和POS机内存提取工具(PUNCHTRACK)。

CVE-2016-0167:Windows系统的0 day提权漏洞

在某些攻击场景中,犯罪分子利用了一个此前未知的Windows提权漏洞有选择性地获取到了大量受感染设备的SYSTEM权限。

3.png

我们发现这个问题之后便立刻将漏洞信息上报给了微软,而微软也在2016年4月12日发布了相应的修复补丁(MS16-039)。

攻击者信息

我们认为利用会这个漏洞实施攻击的犯罪组织肯定是以经济利益为主要目的的攻击者。在去年,我们只发现有一个组织使用过这种类似的攻击技术和策略,而且也只有这一个组织使用过下载器PUNCHBUGGY和POS机恶意软件PUNCHTRACK。需要注意的是,PUNCHTRACK是通过一个高度混淆的启动器加载的,而且这个加载器不会在目标系统中保存。

这个黑客组织所进行的一般都是大规模攻击活动,不仅攻击速度非常快,而且效率也很高,他们会根据攻击目标来制定专门的漏洞利用代码,并通过前期侦查来修改发送给目标用户的钓鱼邮件。

漏洞利用细节

Win32k!xxxMNDestroyHandler Use-After-Free

CVE-2016-0167是一个存在于win32k Windows图形子系统中的本地提权漏洞,一个可以实现远程代码执行(RCE)的攻击者将能够利用这个漏洞来实现提权。首先,攻击者需要通过钓鱼邮件附件文档中的恶意宏来完成远程代码执行,然后下载并以STSTEM权限运行CVE-2016-0167的漏洞利用代码。

微软已经在2016年4月12日修复了漏洞CVE-2016-0167,所以攻击者的漏洞利用代码已经无法在已更新的系统中使用了。微软还在2016年5月10日发布了一个额外的更新(MS16-062),并进一步提升系统安全性以防止类似的攻击再次发生。

漏洞分析

首先,漏洞利用代码会调用CreateWindowEx()方法来创建一个主窗口,它会将WNDCLASSEX.IpfnWndProc域的内容传递给一个名叫WndProc的函数。接下来,这个函数会使用SetWindowsHookEx()和SetWinEventHook()方法来安装两个钩子,我们可以把这两个函数钩子称为MessageHandler和EventHandler,也就是消息处理器和事件处理器。

然后,漏洞利用代码会用SetTimer()创建一个计时器(IDEvent0x5678),当计时器timeout之后,WndProc会收到WM_TIMER信息并调用TrackPopupMenuEx()方法来显示一个快捷菜单。之前所设置的事件处理器(MessageHandler)将会从TrackPopupMenuEx()捕捉到EVENT_SYSTEM_MENUPOPUPSTART事件并将相应消息发送给内核。在处理消息的过程中,内核会调用包含漏洞的exxxMNDestroyHandler()函数,而这个函数将会调用内核模式的消息处理器回调函数,此时事件处理器在调用DestroyWindow()时将会触发用后释放(UAF)漏洞。

堆控制

这个漏洞利用代码会通过SetSysColors()来执行Heap Feng Shui(一种用来实现任意代码执行的技术),而这项技术将会修改堆内存空间。在下面这个代码段中,最重要的区域是地址fffff900`c1aaac40,而地址fffff900`c06a0422是窗口内核对象(tagWND)的基地址加0×22所得:

4.png

内存崩溃

用后释放漏洞的触发发生在HMAssignmentUnlock()+0×14的地方,具体如下所示:

5.png

由于RDX中包含tagWND基地址+0×22,因此这个指令还会在win32k!tagWND.state域加上0xffffffff,并将它原来的值0×07004000修改为0x07003fff,原本的0×07004000意味着bServerSideWindowProc标识处于unset状态。完成了修改之后,bServerSideWindowProc标识如下所示:

6.png

恶意代码执行

如果窗口被标记为服务器端(bServerSideWindowProc已设置),那么系统会默认信任IpfnWndProc函数指针,而此时攻击者就可以用它在用户模式下执行shellcode了。内核在调用漏洞利用代码的shellcode时具体情况如下所示:

7.png

接下来,shellcode将会窃取系统进程的token,并对子进程cmd.exe进行提权。

缓解方案

FireEye将这种活动标记为了Exploit.doc.MVX、Malware.Binary.Doc、Malware.Binary.exe和PUNCHTRACK。最新版本的Windows系统已经修复了漏洞CVE-2016-0167,希望广大用户可以尽快更新自己的Windows系统版本。除此之外,个人用户可以禁用Office的宏功能,企业用户可以通过组策略来控制所有Office2016用户的宏执行。关于Office宏攻击的更多内容请参考这篇文章【传送门】。

* 参考来源:fireeyesecurityweek, FB小编Alpha_h4ck编译