又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析

xiaohui 技术 2017年5月12日发布
Favorite收藏

导语:今年3月开始,FireEye再一次在微软Office产品中陆续发现三个新的零日漏洞,发现时这些漏洞已被野外利用。

microsoft_bug.jpg

早在2015年,FireEye曾发布过两次关于Office的Encapsulated PostScript (EPS)图形文件的漏洞攻击的研究分析,其中一次属于零日漏洞攻击。

今年3月开始,FireEye再一次在微软Office产品中陆续发现三个新的零日漏洞,发现时这些漏洞已被野外利用。

第一个漏洞出现在今年的3月下旬,CVE-2017-0261中描述了Office远程代码执行漏洞(RCE)漏洞,FireEye认为该漏洞已被Turla和一个未知的专门针对金融行业的黑客组织利用过。其中,对该漏洞的利用已经涉及到未进行最新更新的系统中了,而且该漏洞还被用于部署其他恶意软件的受损的JavaScript脚本。

第二个漏洞和第三个漏洞分别出现在4月和5月, CVE-2017-0262中详细描述了Office RCE漏洞,CVE-2017-0263描述了Windows权限升级漏洞。FireEye发现,Turla很可能也参与其中。利用这两个漏洞的攻击目前已被安全专家分别命名为Seduploader、GAMEFISH恶意软件。

其中,Turla和APT28都是俄罗斯的网络间谍组织,他们利用这些零日漏洞对欧洲的外交和军事进行攻击,而那个未知的金融黑客组织则针对中东地区的一些银行进行了攻击。下面我们将对这三个由EPS引起的零日漏洞,和相关恶意软件进行详细介绍。其中每个EPS引起的零日漏洞都会有伴随着零日权限漏洞攻击,在进行权限提升(EoP)时,这些恶意软件会绕过针对EPS处理过的FLTLDR.EXE沙盒检测。

目前已经有恶意文件开始使用这三个漏洞来实施三种不同的有效载荷了。 CVE-2017-0261用于为SHIRIME恶意软件提供有效载荷(Turla组织使用)和NETWIRE恶意软件提供有效载荷(未知的金融黑客组织使用),CVE-2017-0262用于为GAMEFISH恶意软件提供有效载荷(APT28使用)。 CVE-2017-0263用于为GAMEFISH恶意软件提供有效载荷期间的升级权限。

三个漏洞的介绍

在被曝光的攻击事件中,两个零日漏洞与本地提权漏洞以被组合来实现对攻击对象系统的完全控制,目前已发现的组合攻击方法有:CVE-2017-0261 + CVE-2017-0001、CVE-2017-0262 + CVE-2017-0263,CVE-2016-7255+ CVE-2017-0261。

目前以上漏洞相关的技术细节已经完全公开,黑客可能根据这些组合来实施恶意代码执行定向攻击或进行基于文件加密的勒索,鉴于Office软件的流行度,现实威胁已经迫在眉睫。微软已经在2017年5月10日发布的例行补丁包中修复了相应的安全漏洞,强烈建议用户尽快对系统做补丁升级以避免受到影响。

另外,FireEye已经与微软安全响应中心(MSRC)进行协调,负责披露这些漏洞信息。 微软建议所有用户认真阅读FireEye关于这些高级威胁的安全咨询报告——ADV170005中,以应对针对EPS漏洞的深度防御措施。

威胁等级

CVE-2017-0261:高危

CVE-2017-0262:高危

CVE-2017-0263:高危

影响系统及版本

CVE-2017-0261

Microsoft Office 2010 Service Pack 2 (32-bit editions)

Microsoft Office 2010 Service Pack 2 (64-bit editions)

Microsoft Office 2013 Service Pack 1 (32-bit editions)

Microsoft Office 2013 Service Pack 1 (64-bit editions)

Microsoft Office 2016 (32-bit edition)

Microsoft Office 2016 (64-bit edition)

CVE-2017-0262

Microsoft Office 2010 Service Pack 2 (32-bit editions)

Microsoft Office 2010 Service Pack 2 (64-bit editions)

Microsoft Office 2013 RT Service Pack 1

Microsoft Office 2013 Service Pack 1 (32-bit editions)

Microsoft Office 2013 Service Pack 1 (64-bit editions)

Microsoft Office 2016 (32-bit edition)

Microsoft Office 2016 (64-bit edition)

CVE-2017-0263

Windows 10 for 32-bit Systems

Windows 10 for x64-based Systems

Windows 10 Version 1511 for 32-bit Systems

Windows 10 Version 1511 for x64-based Systems

Windows 10 Version 1607 for 32-bit Systems

Windows 10 Version 1607 for x64-based Systems

Windows 10 Version 1703 for 32-bit Systems

Windows 10 Version 1703 for x64-based Systems

Windows 7 for 32-bit Systems Service Pack 1

Windows 7 for x64-based Systems Service Pack 1

Windows 8.1 for 32-bit systems

Windows 8.1 for x64-based systems

Windows RT 8.1

Windows Server 2008 for 32-bit Systems Service Pack 2

Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)

Windows Server 2008 for Itanium-Based Systems Service Pack 2

Windows Server 2008 for x64-based Systems Service Pack 2

Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)

Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1

Windows Server 2008 R2 for x64-based Systems Service Pack 1

Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)

Windows Server 2012

Windows Server 2012 (Server Core installation)

Windows Server 2012 R2

Windows Server 2012 R2 (Server Core installation)

Windows Server 2016

Windows Server 2016 (Server Core installation)

临时处理方案

如果短期内无法更新Windows安全补丁,请不要打开任何不明来源的Office文件,包括且不仅限于邮件附件、网上下载、即时通信等来源。

修复建议

微软官方已在最近的安全更新中修复了本通告相关的漏洞,请安装补丁并重启系统。

CVE-2017-0261的漏洞利用过程

打开Office文档后,FLTLDR.EXE用于渲染包含该漏洞的嵌入式EPS映像。 EPS文件是一个PostScript程序,它利用操作数据的还原过程来找到该漏洞。

由于本地虚拟机中的分配和现有对象的修改都受到保存和恢复的功能的限制,所以要用PostScript调用它的操作符来命名。保存并恢复其本地虚拟机活动只是EPS语言程序的一部分。如果使用该漏洞,则会在本地虚拟机中恢复已经取消的分配对象,并撤消已经创建的修改。

当与forall运算符组合时,黑客就可以实施类似Use-After-Free的漏洞攻击了,Use-After-Free漏洞是一种内存数据破坏缺陷,是由程序试图访问或操作已经被释放的内存引起的。该类型漏洞通常会导致程序崩溃、任意代码执行等危害。下图显示了黑客如何利用保存和恢复操作中的伪代码。

1.png

以下7个操作允许伪代码泄漏元数据,从而实现读写原语:

1.forall_proc数组是使用还原过程的单个元素创建的

2.EPS状态保存到eps_state

3.uaf_array是在保存后创建的

4.forall操作符遍历uaf_array的元素,为每个元素调用forall_proc

5.uaf_array的第一个元素传递给restore_proc的调用,该过程包含在forall_proc中

6.restore_proc下的操作

恢复初始状态,释放uaf_array

alloc_string过程回收释放的uaf_array

forall_proc更新为调用leak_proc

7.forall操作员的后续调用,在回收的uaf_array的每个元素上调用leak_proc,这些元素现在包含alloc_string过程。下图就是在回收后使用的uaf_array调试日志:

2.png

通过保存之后的操作,攻击者能够操纵内存布局,并创建读写原语。下图就显示了经过读写之后的假的字符串,长度设置为0x7fffffff,基数为0:

3.png

利用阅读和写入任意用户内存的能力,EPS程序可以继续搜索用来构建ROP链的gadget,并创建一个文件对象。下图就是在内存中伪造的文件对象:

Fig4.png

通过伪造的文件对象调用closefile操作数,漏洞利用ROP技术启动shellcode。下图显示了closefile操作数处理程序的反汇编程序中的一部分:

Fig5.png

一旦执行完成,恶意软件就会使用ROP链来改变包含shellcode的内存区域的执行保护。此时,shellcode正在执行对FLTLDR.EXE检测的沙盒中运行,所以需要升级特权来绕过沙盒的检测。

FireEye检测到利用此漏洞的EPS程序的两个不同版本。第一个是st07383.en17.docx,该版本继续使用32或64位版本的CVE-2017-0001来升级权限,然后称为SHIRIME的恶意软件就会执行包含该权限的JavaScript有效载荷。 SHIRIME是Turla使用的自定义的JavaScript恶意软件之一,SHIRIME作为初步分析目标系统并执行命令和控制的第一阶段有效载荷。自2016年初以来,FireEye就观察到在野外使用的SHIRIME的多次变异版本,本次在CVE-2017-0261的零日漏洞中就使用了最新版本(v1.0.1004)

第二个是, Confirmation_letter.docx文档继续使用32或64位版本的CVE-2016-7255来升级权限,然后称为NETWIRE的恶意软件机会执行有效载荷。Confirmation_letter.docx文档中包含的EPS程序会包含不同的逻辑来构建ROP链和shellcode。如下图所示,NETWIRE对文档中的shellcode进行了混淆:

Fig6.png

CVE-2017-0262的漏洞利用过程

CVE-2017-0262是由forall操作符而引起的类型混淆的漏洞,黑客可以利用该漏洞改变执行流程,将值控制到操作数的堆栈上,此漏洞位于名为“Trump's_Attack_on_Syria_English.docx”的文档中。

在触发漏洞之前,EPS程序使用预定义的数据对内存进行喷射,以占用特定的内存地址并便于以后利用。下图就是使用字符串喷射内存的PostScript代码片段:

Fig7.png

这样,字符串所占的内存地址为0x0d80d000,从而形成下图中那样的内存布局。利用此这样的内存布局和内容就可以进行类型混淆了,并把需要少用的操作代码存储为预定义值,并喷涂为黄色: 

Fig8.png

对堆栈的操作代码进行喷涂后,CVE-2017-0262就可以利用1 array 16#D80D020 forall格式调用代码语句。创建Array对象时,1 array 16#D80D020 forall会将过程设置为十六进制数0xD80D020,并调用forall运算符。这样就实现了精确地控制执行流程,并将攻击者的选择值存储到操作数堆栈。下图就是类型混淆时用到的主要代码流:

Fig9.png

如下图所示,在执行forall之后,堆栈中的内容就被黑客所控制了:

Fig10.png

由于操作数堆栈已经被操纵,所以exch的后续操作都是基于来自操纵堆栈的数据来定义对象的,如下图所示,就是从栈中检索数据的后续代码:

Fig11.png

A18是一个字符串类型的对象,其长度字段为0x7ffffff0,基于0.在内存中,代码布局如下图所示:

Fig12.png

A19是一个数组类型的对象,其数组成员的值都是被自定义过的。黑客在进行漏洞攻击时定义了另一个数组对象并将其放入伪造的A19数组中,然后将新创建的对象数组的指针放入A19中。这样,CVE-2017-0262就可以直接从可预测地址0xD80D020 + 0x38中读取值,并泄漏其可扩展和推断的模块基址为EPSIMP32.flt。下图就是EPSIMP32基地址中泄漏的代码片段。

Fig13.png

下图就是调用put操作符的操作数堆栈和完成put操作后的伪造数组A19。

Fig14.png

通过利用读写原始字符串和EPSIMP32的泄漏模块代码,CVE-2017-0262可以继续通过搜索 ROP gadget,创建假文件对象,并通过bytesavailable操作符转发到shellcode。下图就是伪造的文件类型对象被转换为ROP和shellcode。

Fig15.png

shellcode继续和CVE-2017-0263结合来升级权限,以将FLTLDR.EXE从沙箱的检测中转移出来,然后删除并执行GAMEFISH有效载荷,最后只有32位版本的CVE-2017-0263包含在shellcode中。

CVE-2017-0263 : win32k!xxxDestroyWindow Use-After-Free

CVE-2017-0263的权限升级漏洞是通过挂起当前线程以外的所有线程并将线程句柄保存到表中来实现的,如下图所示:

Fig16.png

然后,利用该漏洞进行操作系统版本的检查,并填充版本所需的字段,例如令牌偏移量,系统调用号码等。可执行内存区域被分配并使用内核模式shellcode作为shell代码所需的地址信息。接下来,就是要创建一个新的线程来触发漏洞并进一步控制漏洞利用。

如下图所示,黑客会利用该漏洞创建三个PopupMenus及一个菜单。漏洞利用随机类名创建0x100窗口。 使用User32!HMValidateHandle来泄漏tagWnd地址,该地址可以在整个漏洞利用中进行内核信息泄漏:

Fig17.png

然后,RegisterClassExW用于注册一个WndProc窗口类“Main_Window_Class”,该窗口类会指向一个函数,而该函数会调用EventHookProc创建的窗口表上的DestroyWindow。

在创建的两个窗口中, SetWindowLong会将第二个窗口的WndProc更改为shellcode地址。应用程序定义的钩子,WindowHookProc和事件钩子EventHookProc分别由SetWindowsHookExW和SetWinEventHook安装。 PostMessage用于将0xABCD发送到第一个窗口wnd1。

EventHookProc会等待EVENT_SYSTEM_MENUPOPUPSTART并将窗口的句柄保存到表中。 WindowHookProc查找SysShadow类名,并为相应的窗口设置一个新的WndProc。在这个WndProc内,NtUserMNDragLeave系统被调用,SendMessage把0x9f9f发送到wnd2,调用如下图所示的shellcode:

Fig18.png

Use-Free-Free发生在内核的WM_NCDESTROY事件中,并覆盖wnd2的tagWnd结构,它将被标记为bServerSideWindowProc。使用bServerSideWindowProc,用户模式下的WndProc就可以被视为内核回调,实现内核上下文的调用,此时,wnd2的WndProc就变为了shellcode。

Shellcode会通过检查该代码段是否是在用户模式下生成的,进而检查是否发生内存损坏。另外,Shellcode还会检查发送的消息是否为0x9f9f。验证完成后,shellcode会找到当前进程的TOKEN地址和系统进程的TOKEN(pid 4)。然后,shellcode会将系统进程的令牌复制到当前进程中,最后实现将当前进程权限提升到SYSTEM的级别。

总结

对Office的Encapsulated PostScript (EPS)图形文件的漏洞攻击,已经成了目前很多黑客的是首选。

FireEye发现微软早在今年4月,就已经对这些利用EPS的漏洞进行了升级和修复,但由于黑客使用了不同的恶意软件来利用这3个漏洞,所以到目前为止,FLTLDR.EXE还无法被EMET所检测到。

CVE-2017-0261同时被多个黑客组织所使用,这进一步证据表明,网络间谍活动和犯罪活动其实是处于共享漏洞的生态系统中。

FireEye所检测到的漏洞利用文件

360反馈意见截图16270902513239.png

本文翻译自https://www.fireeye.com/blog/threat-research/2017/05/eps-processing-zero-days.html,如若转载,请注明原文地址: http://www.4hou.com/technology/4713.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论