初始传染手段 - Nuclear Pack
已经有一些其他的文章介绍过Nuclear Pack破解工具包。可能它还不像g10pack或者BlackHole这些工具那么流行,也没有像CoolEK或者Phoenix工具有那么多的破解功能,但仍然可以看到它的价值。
Nuclear Pack因使用了重定向层次结构以及在传递恶意代码前检查用户活动而被人所熟知。另外,众所周知它被不同的犯罪分子用于分发各种恶意软件,而其中大多数是犯罪软件。在这篇文章里,我们详细介绍了一个特殊的事件,在这个事件里一个客户受到Nuclear Pack入侵系统的攻击。
Nuclear Pack的工作原理如下:
1、受害者访问Nuclear Pack入侵系统的初始登录页面,JavaScript程序检测其鼠标的移动;
2、受害者被重定向到JavaScript程序,由其决策哪个入侵系统对受害者进行攻击;
3、JavaScript程序重定向受害者到合适的入侵系统,提供参数解码URL供漏洞有效负载取回;
4、入侵软件在受害者机器上运行,为有效负载解码URL;
5、入侵软件下载适合受害者系统的合适的程序,并执行(在这个案例里是Initial Dropper)。
在下面的Previct的界面中,你可以看到检测的结果信息:
事件的细节信息如下:
这个Java程序成功控制了受害者,就像在下图所看到的,它立即下载了恶意的可执行程序load2.exe(其MD5值是78cfa36112cd0797690327a9a07d5890 ,该程序即是上文中所提到的initial dropper)
不寻常的可执行程序,详细的分析
当我们第一次看到load2.exe时,很快就觉得这是一种误报。程序样本看起来根本不像是恶意软件。VirusTotal的快速检查结果也没有帮助我们做出决定;根据VT的结果,这种情况看起来也像是一个可能的误报。
Dropper病毒
Initial Dropper是NullSoft的安装程序,它首先放置6个文件到临时目录里:
正如你在下图中所看到的,被安装的可执行程序有一个图标,类似“设置”或“更新”符号;而被安装的DLL中有一个的描述信息是“Google Chrome Patches”。
然后,它启动可执行程序文件wobiqacaxa.exe
The Second Stage
Second Stage可执行程序(即wobiqacaxa.exe)会做一些数学计算,像下面的函数这样:
从其它DLL中导入函数:
并在main函数中调用它们:
它也会计算剩余的电池寿命,这就是可执行程序的程度了。到目前为止还没有什么可疑的地方。
让我们看看这些DLL。首先,它们在体积上都非常的小,每一个有一个导出的函数。这些导出的函数看起来并不非常可疑。在对它们做了一些检查之后,有人会想说“这些东西不是恶意软件,我们这么做感觉像是在浪费时间”,并且你考虑就此停止。但接着,你提醒你自己截止目前已经在安装程序中发现了非常奇怪的行为,因此得继续分析。
让我们看看:
动态库womajejunuc.dll输出了函数Nalexavo
动态库tapevacanop.dll输出了函数Miqudigob
动态库horikipusac.dll输出了函数humolu
这似乎没有一点像是恶意软件。但某些东西在困扰着你,你不想就此停止挖掘其中的秘密。为什么会这样?#p#
并置
这些代码没有任何意义,即使是对于一个合法的二进制程序,也没有什么意义去做如下的事情:
1. 调用一个数学函数,诸如“y = 10 - cos(2x)”
2. 获得本地货币格式,应用它到串"-3.80",然后对它没有再做任何事情
3. 计算剩余的电池时间
4. 遍历驱动器列表
所有这些仅仅是一个合法程序可能会使用到的常用函数,但不会一起并且不会以这种顺序使用。在这个案例里,这些是欺骗性的功能,它们似乎有一个唯一目的,即混淆自动检测系统,反病毒软件,或者那些甚至尝试手工分析这些程序样本的分析人员。
当我们检查了之前所说的二进制数据文件(jepuculoguh.vat)后,所有的疑问消失了。
可以确定的是它的数据十分像是使用了一个短的密匙由序列加密法加密的模式。
解包
因此,除了之前所述的伪装逻辑,这个恶意软件会做如下事情:
(1) 计算一个解密密匙(由来自动态库horikipusac.dll的humolu函数完成)
(1) 读二进制文件到内存(由来自动态库womajejunuc.dll的Nalexavo函数完成)
(2) 在内存中解密数据(由来自动态库tapevacanop.dll的Miqudigob函数完成)
现在看看最后一个DLL:
动态库Qotowokami.dll导出函数Siwusonivin,它实现了相当于标准的处理模式“注入解密的数据到新的进程中”:
1、调用GetCommandLine和PathGetArgs去获取初始安装程序的路径。这是可行的,因为安装程序自己启动被安装的程序是作为在命令行上的一个参数
2、调用CreateProcessA去创建一个新的安装程序的进程实例,但其被挂起
3、调用ZwUnmapViewOfSection和VirtualAllocEx去释放初始进程的内存,并在被创建的进程里为解密数据分配内存
4、调用WriteProcessMemory去拷贝解密的数据到进程地址空间
5、调用GetThreadContext,SetThreadContext和ResumeThread去改变进程中线程的入口点,然后使得它们继续运行
但是,动态库Qutowokami.dll本身并没有包含任何函数名称,函数Siwusonivin通过调用LoadLibrary和GetProcAddress动态地获取所有的API函数。这些函数都位于解密的内存中。因此,没有解密数据是不可能看见这个DLL的实际运行内容的。#p#
沙盒和免杀
这个恶意软件编写的方式使得如果这些组件被单独地分析或如果任意一个组件丢失,都非常难去识别出这个程序样本应该要做什么,以及是否它是恶意软件。
由于绝大多数的反病毒产品没有真正的分析(未知格式的)二进制文件,而仅仅是检查整个文件的哈希值,而恶意软件的作者越来越倾向在不可执行的二进制文件中保存加密的恶意内容,然后使用一个单独的文件抽取加密内容,其中包含的是一个看起来并不让人感到怀疑的加载/解密程序。我们已经在之前的文章(http://www.lastline.com/an-analysis-of-plugx)中探讨过类似的技术。
我们的分析平台检测到了一个隐藏入侵:这个程序样本尝试读取注册表键(HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\DISK\ENUM)的值,并比较它的值是否有以下子串:
(1) "vbox" (出现在VirtualBox虚拟机中)
(1) "qemu" (出现在QEMU虚拟机中)
(2) "vmwa" (出现在VMWare虚拟机中)
来检查它是否工作在一个虚拟机环境中。
所以这里的解密数据还不是实际的内容,而是另一种壳程序,它首先检查其是否运行在沙盒中(像这样的虚拟机隐藏入侵正在变得越来越常见)。
接着,这个壳程序解析API函数。需要说明的是包装程序是通过哈希查找DLL的地址和API函数。恶意软件的作者肯定不希望简单地搜索可疑的字符串,比如可疑的API函数的名字,就能检测到它。
壳程序最后会解密恶意代码,然后,以一种有趣的方法,为它创建一个导入表:
对于它使用的每个API函数,首先检测它的第一条指令 如果指令是跳转指令jump(0xEB或0xE9),包装程序获取其目标地址,并递归地重复这个检查过程 当找到第一个非跳转指令时,包装程序拷贝这条指令到分配的内存区,并在这条指令之后添加到实际API函数的第二条指令的跳转指令
使用这种技术,恶意软件可以逃避安全组件(比如:HIPS)的钩子(hooks)。
下面是恶意软件导出函数的一个样例。需要说明的是导入使用的是跳转指令jump(通常导入的构成是调用指令call [x]或者jmp addr)
为了替换API函数,使得jump跳转指令按照上文所述特定地产生了如下代码:
最后是没加壳的代码
恶意代码是位置无关的,在经过重新构造后,它看起来像这样:
这是一个典型的“后门程序”或者“绑定外壳程序”,它在一个端口上监听,然后执行接收到的命令。并且因为所有的活动都是在隐藏进行的,又是做过免杀的,所以这个连接是未加密的,且没有采取任何验证方法进行保护。
结论
这个事件的简要图形摘要如下:
功能模块与物理文件对应关系如下:
Initial dropper 对应 load2.exe
second stage对应wobiqacaxa.exe
key calculator对应horikipusac.dll
encrypted binary data 对应jepuculoguh.vat
reader 对应womajejunuc.dll
decryptor 对应tapevacanop.dll
injector 对应Qotowokami.dll
Initial Dropper之后恶意软件的运行过程如上图所示:
1、运行wobiqacaxa.exe,其首先做一些数学计算
2、接着从安装的DLL中导入函数
3、获取安装的设备和计算密匙(代码位于horikipusac.dll)
4、检查电源状态和电池寿命
5、打开加密文件,读入它到内存中。做货币计算(代码位于womajejunuc.dll)
6、解密文件到内存中(代码位于tapevacanop.dll)
7、获取Initial Dropper程序的路径,创建一个新的挂起的进程(代码位于Qotowokami.dll)
8、释放当前进程内存,并在新进程空间中分配新的内存
9、注入解密的数据到新分配的内存中
10、改变入口点,然后继续运行线程
11、从这里开始进入解密后的代码中运行
12、检查是否运行在虚拟机环境中
13、如果不是,则再次执行解密,并为进程创建函数导入表
14、安装自己作为一个服务,名为SunJavaUpdateSched
15、打开TCP套接字,在端口8000上监听,当有连接请求到来时,启动cmd.exe,其I/O重定向到了socket上
所有这些努力都是为了保护一个简单的TCP绑定外壳程序,使其不被检测到吗?为什么一个攻击者会利用一个部署在Internet上的,位于受害机器的网络之外的控制入侵软件?这样做,他可能无法进入到缺乏抵抗力的主机。受害机器的IP处于RFC1918所规定的地址空间,攻击者是无法通过Internet到达的。
一个可能的解释是攻击者来自于某个家庭网络。在这样一个网络中的攻击者可能不太关注对到本地网络中的其它机器上的连接进行加密,而更关心的是可以在网络中传递数据。
这似乎是攻击者在受害者机器的网络中建立了一个前沿阵地后,想要访问网络中其它机器时,进行横向入侵的技术。使用从第一台机器上搜集的信息,他们可以制造一个可信的消息(一种钓鱼法),在潜在的受害者因为某种不可抗拒的原因访问了一个包含在其中的URL时,采取如文章开始时所描述的方法,对受害者进行入侵控制。
*本文来自于美国安全公司LASTLINE,由IDF志愿者周耀平翻译,章典校验。