看我如何逆向分析韩国常见的HWP恶意文件

前情提要

当今最受网络犯罪分子欢迎的交付恶意软件的方式之一是大量的传播带有恶意附件的钓鱼邮件。这些附件通常包括一些基于脚本的下载器(如WSF、JS或HTA),或者更普遍的是在微软Office文件中嵌入恶意的宏函数。

使用钓鱼邮件分发恶意软件常常会用到社会工程学的技巧,常见的攻击流程概述如下:

1)精心设计邮件内容,获得受害者对发送方和附件的信任;

2)诱使潜在的受害者打开文件;

3)使受害者启用宏函数,默认情况下是禁用的,但这一点对攻击能否顺利进行至关重要。

可以看出,在上边所描述的流程中,对攻击者而言存在一个问题:如果用户拒绝启用宏,攻击将停止。那怎么办?

为了解决这个问题,网络犯罪分子经常利用一些专门的漏洞(尤其喜欢利用文档漏洞),这样做就可以在不需要用户交互(除了打开附件)的情况下完成对受害目标的感染操作,完美地解决了前文中提到的问题。

网络犯罪分子一般通过伪造格式错误的文件来实现这种文件漏洞利用类型的网络攻击,一旦这些恶意文件在存在可利用漏洞的应用程序(如旧版本的浏览器、视频播放器或文档查看器)中打开时,就会触发恶意活动。

文档漏洞利用技术

安全分析人员和研究人员通常使用两种不同的技术来检测和减轻这类文档利用漏洞的威胁。第一种是静态分析方法:发现文档结构和文件格式中的异常;第二种是动态分析方法:在一个被监控的虚拟化环境或沙箱中执行该文件。

这两种方式都存在一定都局限性,静态分析方法只能检测已知的异常,而动态分析方法要求系统安装特定版本的易受攻击的软件,因为有些恶意程序是在满足特定条件下才会运行,但构建的沙箱或虚拟环境不可能安装每个应用程序的所有可能的版本。

幸运的是,结合静态和动态的分析方法以及深层内容检查和高级分析,安全分析人员可以克服上述弱点来检测和阻止文档利用漏洞的攻击。

在本文中,我们将深入了解一个恶意的韩文文字处理器(Hangul Word Processor,HWP)文件,并介绍如何利用先进的技术来检测攻击者使用的加密、逃逸、恶意代码注入等功能。


*注释:HWP格式是韩国特有的一种文件格式,类似中国的WPS文件格式,具有很强的民族特色,在韩国大多数企业和政府机关都使用HWP格式处理相关文档资料,在韩国的使用相当广泛。


HWP文件

我们之所以对HWP文件感兴趣,有几方面的原因:首先,由于HWP类型文件的使用具有很强的地域属性,那么针对HWP的攻击,也大多具有鲜明的国家针对性。其次,从HWP DFF(Document File Format)5.0版本以后,大多数HWP文件的数据流使用了zlib格式进行了压缩,这使得对文档中嵌入的PES、恶意JavaScript文件或shellcode的静态检测工作变得更加困难。此外,这种原始数据流没有任何已知的文件头,很难找到一个合适的解码/解压缩算法对其进行解压。

图1 :使用HWP Viewer打开HWP文档的示意图

接下来,我们将逐步剖析一个HWP文件漏洞利用的恶意样本。首先,使用静态和动态分析技术对shellcode进行分析。

静态分析Shellcode

MD5散列值  696c4403fe65089f76361860849d26c4

VirusTotal检测率  2017/08/25:10/58

首先,使用文档管理器 Far Manager 进行检测:

图2:使用Far Manage查看HWP文件

我们看到文件中包含一个嵌入的EPS(Encapsulated PostScript),使用Lastline的静态检测工具对它进行分析时,会自动出发一个报警通知:

图3:Lastline静态检测工具显示的样本的文档信息

这里要简单的介绍一下EPS的相关情况:

EPS文件格式又被称为带有预视图象的PS格式,是目前桌面印刷系统普遍使用的通用交换格式当中的一种综合格式。EPS文件是一个携带文件头信息的PostScript 文件,其他应用程序利用该文件头信息可将此EPS文件嵌入到文档。

从功能层面上讲,EPS仅仅是可将图片嵌入到文档中的一种文件格式。然而,从技术层面上讲,它是一种功能强大的基于堆栈的编程语言,具有使用变量、操作符、循环、条件和创建矢量图形等的功能。基于实用性的考虑,网络罪犯最近开始使用它进行文档漏洞利用攻击。

需要注意的是,存在一个嵌入的EPS文件是一个可疑的迹象,寓意着可能有一些恶意的操作正在进行,因为正常的、良性的文件中会嵌入EPS文件的情况很少见,在一个文档中嵌入一个EPS文件是黑客常用的策略之一。事实上,在文档中嵌入EPS是非常罕见的,充满了潜在的危险的气息。微软在2017年4月选择默认关闭了Microsoft Offic中的EPS图像过滤器,是微软深度防御的措施之一。

接下来,提取出EPS文件的BinData子目录,将其重命名为“compressed.eps.”(还可以使用oledump脚本完成数据的提取操作)。

图4:提取zlib压缩格式的EPS文件的内容

现在,使用Python中的zlib.decompress方法解压数据流,尝试对其进行分析,同时,调用Python的 binascii.unhexlify方法把长的十六进制字符串(可能是一些汇编代码)转化成二进制格式。

如下图5所示,首先看到的是一连串的重复的字节(0xB2 0xB2 0xB2 0xB2 0xB2 0xB2….),处理器指令MOV DL,操作码0xB2,它的作用是反复的注册同一数值。这是一个经典的NOP sled(代码滑行)策略。注意,这也是一个迹象,表明这很可能是一个恶意文件。

这一串长字节后,有另外一个NOP操作(0x90),这之后实际的shellcode开始执行:

图5: EPS 文件解压后的二进制数据:NOP sled和shellcode的内容

上面我们提到过,EPS是一种脚本语言。攻击者很好的利用了这一优势:在EPS文件的末尾,可以看到以下代码:

图6:EPS脚本(堆喷射)

上图所示的循环函数的作用是:重复1024次NOP sleds和shellcode,填充Hangul进程的内存空间(存储在D40变量中)。这种技术被称为堆喷射,用于在内存中复制大量的shellcode,增加shellcode被执行的机会,有效的提高漏洞利用的成功率。

由于shellcode一般是位置无关的代码,它必须驻留于内存中,或者通过某种方式检索到当前指令的指针,这个值被存储在EIP注册表中,无法通过软件直接访问。检索当前内存地址的一个可能的方法是调用CALL/POP (或 JMP/CALL)汇编指令:

图7:寻找EIP的内存地址

一旦确定内存地址,shellcode就会利用一个XOR算法和一个硬编码的密钥对下一阶段的代码进行解密,相关代码片段所下图所示:

图8:Shellcode开始阶段的部分代码

接下来,已解密的shellcode代码通过解析PEB(Process Environment Block)进而找到kernel32.dll在内存中的基地址,并解密剩余部分的shellcode代码(稍后会被注入到一个合法的进程中):

图9:分析 shellcode第二阶段的操作(寻找Kernel32.dll的基址,并执行第二阶段的解密)

为了实现快速查找所需函数的功能,shellcode一般通过比较API函数的Hash值(如使用ROR13算法)的方式代替命名复杂的人工分析。

图10:hashString函数的实现过程

解决了必要的API函数的寻址问题后,shellcode向远程进程注入代码。为了实现这一目的,首先通过调用CreateProcessA函数产生大量的cmd.exe副本;然后通过调用VirtualAllocEx函数分配内存,再利用WriteProcessMemory函数在分配的内存空间中写入shellcode;最后,通过CreateRemoteThread创建一个可供执行的远程线程:

图11:远程代码注入到cmd.exe

在沙盒中动态分析Shellcode

shellcode自动化分析最有效的方法就是将它嵌入到一个可执行文件并运行它。即使手头没有易受攻击的应用程序,使用动态分析的技术将允许安全研究人员或事件响应者详细观察恶意代码的功能。

为此,首先将shellcode转换成一个exe文件。


*注释,这一步在逆向过程中并非必须的,但将Shellcode转换可执行文件将有助于调试和理解shellcode所使用的VM规避技术,具体的转换方法可以参考这篇文章:Convert the Shellcode Into an Exe


然后将生成的文件放到Lastline的分析系统中,结果如下图所示:

图12:使用Lastline分析引擎对shellcode进行分析(结果概述)

如上图所示,shellcode将代码注入到一个合法的进程用于从远程服务器检索一个二进制文件(伪装成JPEG图片)。此外,它还使用了不同的沙盒逃逸技术试图躲避动态分析。

图13:与C&C服务器的网络通信

shellcode启动之后,试图通过InternetOpenUrl的一个开放句柄,调用InternetReadFile函数完成读取远程文件的操作。这样做是为了将二进制数据保存在内存中而不在磁盘上遗留任何痕迹。然后shellcode继续执行检索二进制的代码(下图中红线标注的位置),这个操作过程使用如前边所述的模式检索EIP的内存地址:

图14:伪造的JPG文件中的shellcode的启动过程

之后,shellcode检索所有必须的APIs,解密一个嵌入的可执行文件后尝试运行它。解密过程通过XOR算法与随机的密钥实现:

图15:解密一个内存中嵌入的可执行文件

嵌入的PE文件实施了一系列的反调试技巧,例如,通过搜索是否存在特定的注册表项(SystemBiosVerion,SMBiosData)和加载的DLLs来分析当前环境是否是知名的动态分析系统(如Sandboxie、Sunbelt、VMware和VirtualBox):

图16:检查加载的DLLs(与不同沙箱和虚拟机系统相关联)

总结

本文中,我们介绍了一个复杂的攻击:通过将一个多阶段的shellcode嵌入到一个EPS文件和一个伪造的图片文件中,并最终顺利执行一个恶意的PE文件的过程。还介绍了如何通过静态和动态分析的方法发现这种文件漏洞利用类型的攻击。

正如本文中所叙述的,攻击者不仅会利用流行的应用程序(如Microsoft Office),也会利用特定的具有国别特征的文件类型(如文本中的HWP)传播恶意软件,借以发起针对性的网络攻击。后者的做法会使对这些威胁的分析变得更加复杂,希望安全分析人员和恶意软件研究人员对此多加关注,便于提供对付这类攻击的最佳解决方案。

原创文章,作者:M0tto1n,如若转载,请注明出处:http://www.mottoin.com/106183.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code