原文链接:《CVE-2017-11826 Exploited in the Wild with Politically Themed RTF Document》
最近,FortiGuard Labs
(飞塔防御实验室)发现一起有意思的恶意软件行动,使用了今年10月刚被微软修复的文档漏洞CVE-2017-11826
。
基于这次行动中用来引诱受害者的内容,以及载荷的行为,我们有预感这是并不是一次普通的网络犯罪行动,它甚至可能针对特定设施和地区。出于这个原因,我们决定深入研究一下。
和这类攻击的手法类似,用于本次行动的C2服务器
只在一段很短的时间内存活。这意味着来自动态分析的信息是十分有限的。然而,弄清楚攻击者可以在一个受害者的系统里干什么也是很重要的。这不仅能帮助评估此次行动可能会造成的损失,也可以作为将来针对这类攻击的缓解措施的基础。在这个案例里,关于载荷,我们不得不去求助于静态分析工具,以在某种程度上模拟如果C2服务器活着会发生什么。
此次行动的攻击媒介是一个恶意的富文本文档(RTF),使用针对性的、带有政治主题的内容去诱使一个用户去打开该文档。当RTF文档执行的时候,它会展示一段关于Aqua Mul Mujahidin
,一个主张缅甸若开邦(Rakhine
)武装抵抗的圣战组织。 图1:初始文档
在利用触发后,另一个诱饵文档被展现给用户。这一次的文本是关于在沙特阿拉伯的权利斗争,这显然是从一篇名为Saudi Arabia’s ‘Game of Thobes’
的网上文章中复制的。 图2:诱饵文档
我们并不清楚这两个内容之间有什么关联,但这显然是用来诱使一个对这类事件带有特定兴趣或知识的,认为这个文档是友好的人打开该文档。实际上,利用会用它自己的方式在后台运行,以投递一个能够控制不知情的受害者系统的恶意软件。
通常,一个RTF利用使用OLE以将载荷包含在文档内。下面的分析展示了如何用开源工具去定位和提取利用载荷。Didier Stevens
的RTFdump.py
允许列出RTF文档中的所有控制字。我们感兴趣的特定控制字叫做“\object”
,它被用来定义嵌入的OLE对象。
列表1:使用rtfdump.py
去定位嵌入的对象
图3:从RTF利用文档内发现并抽取的3个不同对象的输出
#1698
这一OLE对象的目的是用来自动加载COM
动态库:C:\Windows\system32\msvbvm60.dll
,方法是通过在“\oleclsid”
关键字内指定CLSID {D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731}
到Microsoft Word的进程地址空间内。这个COM动态库并未开启地址空间布局随机化编译选项。因此,利用经常会利用这一优势为有漏洞的office组件构建一个利用链。另一方面,被dump的#1703
和#1708
对象似乎是Word文档,正如上面“\objclass”
所指的那样。然而,这些OLE对象以16进制字符串展现,所以我们需要将16进制字符串转化为二进制格式,以便阅读它们。为了实现这一点,我们可以使用Decalage
的oletools套件中的rtfobj.py
:
列表2:将Word文档从16进制转化为2进制格式的输出
总结一下,两个被提取的文档都是内嵌DOCX的OLE文件
,它们是以“Package”作为其流名
的,基于XML的压缩文档。我们可以使用Didier Stevens
的oledump.py
来dump Package的内容:
列表3:dump内嵌在DOC文档内的DOCX文档的结果
基于来自oledump.py
的结果,我们可以断定object_1703_Package.docx
是作为一个堆喷射组件,这是一种用攻击者所控制的,利用来自ActiveX对象
的数据(例如:activeX.1
)来申请一大块连续内存地址的技术。我们可以在解压后的docx文档中看到它们:
列表4:#1703
DOCX文档解压后的内容
除此之外,object_1708_Package.docx
包含多个XML文件,你可以在解压这个DOCX文档后轻易看到它们,这个文档是用来被Word解析的。基于我们过去的经验,该文件内应该有能触发CVE-2017-11826
漏洞的被恶意构造的XML文件。由于在一个DOCX文档中往往包含多个XML文件,逐个查看这些XML文件是很费时间的。所以我们决定祭出调试器来找出元凶。
请注意,接下来的分析基于wwlib.dll 14.0.7182.5000
,软件版本为Microsoft Word 2010 32位版本
。
下面的列表5显示了当使用调试器在一个能触发漏洞的winword.exe
中打开object_1708_Package.docx
的崩溃上下文:
列表5:Microsoft Word崩溃上下文
列表6:一个非法的函数调用解引用导致的内容为空的虚表
简而言之,位于0x88888ec
处的一个虚表在执行wwlib!DllMain+3b15
函数后被返回。这个虚表在随后部分的代码中(位于0x68BB962D
地址处)被解引用。当代码通过call指令
解引用一个函数指针时,由于虚表处的内容为空,导致发生一处访问违例,如列表6中所示的那样。
在执行漏洞文件若干次后,我们观察到相同的0x88888ec
地址被上面所说的函数所返回。对该函数的一次快速审视揭示了它基本上会返回一个指向某未知对象的指针。然而,由于微软没有提供Microsoft Office二进制文件的符号
,想要了解被返回的是何种对象需要更多逆向工程方面的努力。因此,我们决定采用另一种可选方法。幸运的是,基于列表5中的栈回溯,我们能够辨认出一些有趣的XML解析函数,例如msxml6!Reader::ParseDocument
和msxml6!Reader::ParseElementN
,这些函数与XML文件的解析相关,正如它们的名字所示的那样。最终,我们能够缩小我们分析的区间(感谢微软提供的msxml6.dll
符号文件!)
在一番逆向工程后,位于Reader::ParseElementN
内的Scanner::GetTokenValueQName
函数映入了我们的眼帘。基本上,它的目的是获取标签名称(例如:标签名称会是w:body
),这是Office Open XML
使用的技术。为了缩短我们的分析时间,我们决定设置一些在函数被调用时可打印标签名的调试断点。 列表7:使用调试断点去发现有问题的XML段名称
如上述列表所示,出现问题的名称似乎是o:idmap
。我们可以马上在DOCX文档中的所有XML文件中查找有问题的名称,以锁定相关的XML文件:
在用document.xml
进行一些试验后,我们能够确定这就是有问题的XML文件。我们将font name
修改如下,然后发现一个不同的地址被(前面提到的函数)所返回:
作为结果,我们在调试器里面得到了如下输出: 列表8:在手动修改w:font
内容后的调试器输出
这一次我们在call指令
前得到了访问违例,因为它解引用了0x410041
地址,这正是我们在修改后的document.xml
中所提供的。因此,我们可以得出结论,漏洞触发的根本原因是o:OLEObject
标签名中嵌入的font标签名
导致了wwlib!DllMain+3b15
函数返回不正确的font对象
,从而造成类型混淆。
正如前面章节所示,通过操纵一个嵌入的font名称的内容,攻击者可以在call指令
中指定任意地址。攻击者选择了静态的0x88888ec
地址,这是我们在初始的document.xml
文档中看到的的font名称被编码成unicode
导致的结果,正如在前面的章节解释的那样。
这时候就轮到堆喷射出场了。如果堆喷射成功执行,activeX1.bin
内的栈置换语句和硬编码的shellcode
就会被写到0x88888ec
地址空间。ShellCode
将会执行下面的步骤:
图4:WinWord进程释放和执行作为下载器的恶意软件
当下载器被执行后,它会连接到http[:]//45.76.36.243/articles
去下载带.html
扩展名的文件,但事实上这些文件包含的是加密数据。 图5:存储着被分解且被加密的后门恶意软件的网站
它首先会下载和解密937933.html
文件,该文件包含一个指向其他html文件
的url列表
。其余5个html文件其实是被分解为5部分的被加密的后门服务端文件。被下载的文件随后被存储到%temp%//svchosts.exe
。加密这些文件块有效地将它们伪装为了非可执行类型的文件。而且,由于网络扫描器对可执行类型的扫描更加严格与细致,这就有效地绕过了在网络中传统的基于文件类型的扫描。甚至在非常不幸的、文件块被解密的情况下,也只会有一部分可执行文件被扫描,这通常没有足够的信息用于检测。 图6:被加密后的后门文件的第一个文件块
这个后门,现在被我们叫做“IRAFAU”
,它来自在分析过程中一段被解密的字符串,看着像是来自一个被修改过的UPX壳
加壳过的文件。尽管如此,脱壳很简单。 图7:UPX
工具识别被修改过的UPX
加壳器
一旦脱壳,后门恶意软件的行为还是不明显的,因为它的字符串仍然被加密,并且用到的API是动态导入的。
所以,该恶意软件做的第一件事是去初始化一个用来存储被解密的字符串的结构体,这个结构体会在接下来的函数调用中被使用。其中包括命令控制服务端(C2
)的字符串,函数指针,和将会在整个执行过程中被用到的动态导入的API
。这个结构体作为一个参数传给调用的子函数。
由于在分析时C2服务器
已经无法访问,识别这个结构体有助于去通过静态分析模拟恶意软件的下一步操作。 图8:复制的恶意软件结构体
在连接位于saudiedi.toh.info
的C2服务器
前,这个恶意软件会在被感染的系统里面搜集下列信息,然后将这些信息通过HTTP POST
的方式发送给C2服务器
。
然后它会通过计算被感染系统{computer name}:{mac address}
的MD5
来生成受害者ID
。 图9:样本与C2服务器
的网络通信
被搜集的信息随后被加密并使用下列参数通过HTTP POST
发送到C2服务器
:
<center>saudiedi.toh.info/search?q=%{hex}%{hex}%{hex}%{hex}&cvid={numbers}
</center>
正如前面所提到的,在写本文的时候C2服务器
已无法访问,模拟来自服务器的响应将会花很长时间。所以我们转而选择使用前面提及的结构体,去揭示攻击者的选项将会是什么: 图10:来自后门命令函数的代码片段
最终,我们发现发现服务器将会发送一个包含命令类型和参数的被加密的数据结构。基于命令类型,后门恶意软件将会执行任意下面的功能:
基于这次行动使用的带有政治主题的社会工程学,我们相信这并不是一款简单地攻击在互联网上的任何人的网络犯罪恶意软件。然而,就这一点而言,我们没有(掌握)哪些设施成为攻击目标的(进一步)数据。
这篇文章也证明了如何使用开源工具去帮助进行利用分析,同时也展示了如何利用静态分析去辅助分析一个已经不可访问C2服务器
的后门恶意软件。
CVE-2017-11826
是一个公布时间还非常短的漏洞,可以肯定的是,这次的恶意软件只是利用这个新的攻击媒介的众多行动之一。
更新于2017/11/30
– 感谢Dider Stevens
(@DiederStevens) 修正shellcode
的长度
-= FortiGuard Lion Team =-
(飞塔狮子团队)
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2018-3-26 14:40
被银雁冰编辑
,原因:
上传的附件: