41

逆向分析“海莲花” APT木马的花指令反混淆工具

 5 years ago
source link: https://www.freebuf.com/articles/neopoints/202056.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

fYZrE3Z.jpg!web 本文中,CheckPoint研究人员基于对“海莲花” 木马程序的分析,编写了一段绕过其混淆技术的反混淆工具- APT32GraphDeobfuscator.py ,在逆向分析过程中,利用该工具,最终可以消除混淆指令,清晰地显示出“海莲花” 木马的运行调用流程,对木马分析和相关安全研究人员有借鉴帮助之用。

“海莲花” APT组织(APT32),具备越南背景的APT攻击组织,以东亚国家为主要目标,以在越外企和目标国家特定机构为主要渗透对象。就目前的各家分析报告来看,“海莲花” 利用的网络工具和相关技术非常广泛多变,其中有高级的漏洞利用手段,也有非常简单的恶意工具,有自研的攻击组件,也有商业和开源的代码套装,如Mimikatz 和 Cobalt Strike。利用捆绑木马的文件为诱饵,从其中的 droppers或shellcode中释放或运行主要的恶意程序。

经多个测试分析案例可见,“海莲花” 组织利用的木马程序和相关工具都经过了复杂的混淆编码,为了阻止或迷惑逆向分析人员,在其中添加了各种“障眼”的混淆技术,经验老道。

该反混淆工具需要基于开源逆向分析工具radare2的界面框架 Cutter,Cutter是跨平台工具,目的就是以界面方式直观友好地显示 radare2的分析原理。上个月,Cutter 官方引入了一个新的Python插件,CheckPoint也将在下面的反混淆工具编写中用到该工具。 (想查看该工具,请直接到以下“反混淆脚本”部份)

下载安装 Cutter

大家可以选择从 这里下载 最新版本的Cutter,如果你用的是Linux系统,可以使用应用镜像方式下载安装。Cutter最终的运行界面如下:

6RZF7zF.jpg!web

“海莲花” APT组织使用的木马

首先,我们来看看“海莲花” 组织使用的木马和相关程序样本,这里这个样本 486be6b1ec73d98fdd3999abe2fa04368933a2ec ,是木马感染链中的一个恶意程序,也是CheckPoint在最近才捕获发现的,其所有的运行特征和“海莲花”组织高度相似,尤其是和早期的恶意诱饵文档 115f3cb5bdfb2ffe5168ecb36b9aed54 非常接近。在早期的恶意诱饵文档中,“海莲花”组织在捆绑的木马中包含了一段VBA宏代码,用它来向受害者系统的rundll32.exe进程中注入了恶意shellcode,该shellcode中又包含了用于后续解码和向内存中反射加载dll文件的解码程序段,加载进内存的dll文件中就包含了木马的一个大概运行逻辑流程。

在后续感染阶段,木马会从相关文件资源中解码出一个配置文件,该配置文件存储了诸如C2服务器等木马运行反弹信息。接下来,相关程序段会尝试用定制的PE loader往内存中加载一个辅助DLL,该DLL名为HTTPProv.dll,能实现与C2服务器的通信。

“海莲花” 组织在其木马程序使用了大量的混淆技术,尤其是大堆大堆的花指令(Junk Code),这些花指令经常让木马分析人员迷失方向。另外由于逆向工具大多时候都只认栈指针,不能自动识别一些无关函数,所以也就造成了我们在逆向分析中的难度。

“海莲花” APT木马的混淆技术

在我们对“海莲花” 木马的逆向分析中可见,其中一个主要混淆技术就是,在相关运行函数中大量插入使用花指令(Junk Code)形成控制流混淆,这些插入的花指令基本都是毫无意义的代码块。如下:

fYZZfiI.jpg!web 在上图中,几乎整个代码块都充满了花指令,当然能完全忽略这些花指令块就好了,但是实际分析中还是相对较难。仔细分析这些花指令块,我们也能发现一些有意思的地方,这些混淆块都是由前一个块的失效跳转而来,且都是条件跳转。而且,每个混淆块都以一个条件跳转结束,这种条件跳转与前一个混淆块的跳转相反。比如说,上图代码块中的末尾跳转条件为 jo <some_addr>,则其混淆块就会以 jno <some_addr>结尾;如果上图代码块以 jne <another_addr> 结尾,则其接下来的混淆块就会是以 je <another_addr>结尾。示例如下:

73eAfeY.jpg!web 基于上述分析判断,我们可以开始构建这些混淆块的特征,混淆的第一个特征是出现两个连续的块,而且,它们以相反的条件跳转到相同的目标地址而结束。另一个特性要求第二个块不包含有意义的指令,如字符串引用或调用。

当满足这两个特征时,我们可以说第二个块很有可能是混淆块。在这种情况下,我们希望第一个块跳过第二个混淆块,这样混淆块就会从我们的逆向分析流程图中消失。这种情况下,我们可以用无条件跳转,也就是简单的JMP指令,来替换其中的条件跳转实现混淆块绕过。如下:

nyyEJjU.jpg!web

反混淆脚本(Deobfuscator)

我们基于Cutter编写了反混淆脚本- APT32 Graph Deobfuscator ,它可以形成一个插件(Plugin)导入Cutter插件库,同时它可通过r2pipe方式与radare2进行命令行交互。

把该脚本形成插件导入Cutter插件库:

YRfM3aY.jpg!webJrQf6bB.jpg!web 以APT32某恶意程序逆向过程中的fcn.00acc7e0函数为例,一开始逆向工具分析运行调用流程图中,混淆指令块为以下高亮红色部分:

JNV3aim.jpg!web 用CheckPoint编写的APT32 Graph Deobfuscator进行反混淆之后,我们得到以下去混淆的运行调用流程图:

QzeeAjq.jpg!web 以下是去混淆前后的对比流程图,非常直观:

YFBRZ3J.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK