本文讲的是针对Neutrino僵尸程序新增加的保护层进行分析,
最新版本的多用途Neutrino僵尸程序已经自带保护层并且Neutrino僵尸程序通过以它命名的利用工具包(Exploit Kit)已经开始进行分发,由于Neutrino属于Kasidet家族,而Kasidet家族又具有多种反调试、反沙箱和反虚拟机的功能,该家族的研发者有可能通过对常见的在线自动化恶意代码分析平台进行过针对性的研究,利用收集各种系统信息的恶意代码提炼出反制在线自动化恶意代码分析平台的方法,并应用到Kasidet家族中,所以最新版本的Neutrino具有很高的防护措施。
分发机制检测
本文中的Neutrino样本是通过在美国使用Neutrino的恶意广告活动中收集的。Neutrino在运行时会首先对运行环境是否是虚拟化,网络流量的正常化和防病毒软件的检测进行排查。如果发现任何可以的检测环境,恶意程序就会立马停止。这种检测技术是通过预登陆当前页面中的大量模糊JavaScript代码完成的,而不是像过去常用的Flash 检测技术。
一旦通过运行环境的检测,Neutrino便会启动一个特制的Flash文件,其中包含Internet Explorer和Flash Player等一系列漏洞利用。最后一步是使用wscript.exe下载和执行经过RC4编码的载荷,以绕过代理网络限制。
感染流程总结如下图所示:
样本分析
通过利用工具包分发的Neutrino样本:b2be7836cd3edf838ca9c409ab92b36d
加载器:349f5eb7c421ed49f9a260d17d4205d3
Neutrino僵尸程序的载荷:6239963eeda5df72995ad83dd4dedb18
这些样本被良好地保护在受控环境中(以避免在受控环境实施感染)。从下图中可以看出,如果样本检测到它正在虚拟机或沙箱中运行时,它便会删除本身的恶意操作组件:
如果分析的环境通过了样本的测试,则样本便会将其复制到%APPDATA%/ Y1ViUVZZXQxx / <random_name> .exe(在本文,我们将其命名为abgrcnq.exe,uu.exe):
随后,样本会对其所运行的文件夹进行隐藏
以便通过计划任务完成本地持久化。
从下图中我们可以看到,样本添加和修改了几个注册表项,比如添加了包括安装日期等一些基本设置信息:
然后,样本会修改一些键,以便让其更好的隐藏在测试系统中。同时注册表中的“隐藏或超级隐藏”功能能够让产生的副本不被用户发现。样本会通过修改以下注册表项,来禁止用户查看这些副本文件:
它还会使用此命令将自己添加到防火墙的白名单中:
与此类似,样本也会将自己的路径添加到Windows Defender的例外文件列表中:
它还会禁止向Microsoft 的SpyNet 社区发送检测报告:
它还会修改终端服务的表项设置,将MaxDisconnectionTime和MaxIdleTime设置为0,受影响表项为:
如果以上这些完全安装过程成功的话,它样本便会开始加载其核心程序,这时我们可以看到一个典型的Neutrino 僵尸网络流量的特点:经过base64编码的“enter”请求报文及“success”响应报文特征。这些响应包会以注释形式嵌入到空白html页面中,议避免让用户发觉:
然后样本会把自身的信息发送出去,以作为下一个请求中的响应,接着,C2C服务器便会像样本发出基于base64编码的请求及响应。解码后的样本如下:
请求报文:
响应报文:
响应报文使用的是截屏命令,不出预料,很快我们就看到样本的恶意程序发送了一张JPG格式的屏幕截图:
从发送的版本号,我们可以得出结论,从发送的JPG格式的屏幕截图中我们发现样本为Neutrino 5.2
经过仔细分析,我们发现Neutrino 5.2的保护机制总共分三层:
第一层:通过加载器的映像覆盖内存中的PE初始化结构,
详情请点击以下链接:https://www.youtube.com/watch?v%20=%20m_xh33M_CRo。
第二层:防止核心程序在受控环境中(如虚拟机或调试器环境)运行。这是它Neutrino 5.2新增加的一个功能,的确,在我们测试期间,大多数沙箱和虚拟机环境所造成的假象都没有骗过这个新功能的检测。
最后一层是Neutrino程序特有的有效载荷防护。
从加载器代码中可知,它是Neutrino僵尸包中的一个完整的集成部分,而并非是一个独立的加密器,而有效载荷和加载器都是用C ++编写的,而且都使用了类似的函数,并且其中一些函数中都包含着相同的字符串,连编译时间戳非常接近,有效载荷为2017.2.16 17:15:43编译的,而加载器是2017.2.16 17:15:52编译的。
加载器分析
混淆技术分析
样本代码包含了多层混淆技术,如下图的几个可见的字符串:
从上图可以看出,这个字符串中包含目录名、一些函数名、准备禁用的与Windows安全功能相关的注册表键值、计划任务中要添加的字符串,不过要提醒一下,这并不是这个字符串的全部信息。
大多数字符串在运行时会被解密,以下是一个加密字符串的加载过程:
首先,通过专用函数将混淆后的字符串写入动态加载的存储器。然后,使用简单的基于XOR算法对其进行解密:
解密后的字符串为:
大多数API调用同样也经过了动态解析处理,如:
跟踪API调用可以理解程序的功能,因此样本的作者不使用某些API,而是自己实现了这些函数功能。
我们通过跟踪API调用的过程,发现Neutrino的开发者不使用某些API就能实现相应的函数功能。如下图所示,开发者通过读取底层线程环境块(Thread Envioroment Block,TEB)结构实现了GetLastError()函数的功能:
功能分析
为了防止恶意程序被多次运行,加载器创建一个具有二进制硬编码的互斥体(mutex):1ViUVZZXQxx。
该加载器的主要功能便是检查运行环境,以确保运行环境为真实环境。与大多数恶意软件不同,Neutrino的环境检查检测会有一个专门的线程来负责,以便让该功能会重复进行:
于是检查便会无限循环下去:
如果在任何时候,加载程序检测到即部署了一些列入黑名单的进程,则终止执行。
如果恶意程序的某个进程被列入到了黑名单中,则立马会被检测到,随即恶意进程也会自动终止。
检查过程如下所示:
1.使用动态加载CreateToolhelp32Snapshot、Process32First、Process32Next函数完成对当前运行列表中的所有进程进行检查。计算每个进程的校验和,与内置黑名单中的进程进行比较。
从下图中我们可以看到,每个函数都在对应校验和下动态加载执行:
2.在当前进程中使用动态加载CreateToolhelp32Snapshot、Module32First、Module32Next函数完成搜索列入黑名单中的模块。类似地,计算每个进程名的校验和并与内置黑名单进行比较。
3.使用IsDebuggerPresent、CheckRemoteDebuggerPresent判断程序是否正被调试
4.使用GetTickCount、Sleep、GetTickCount进行单步执行时间检测。
5.使用QueryDosDevices(如VBoxGuest)检测列入黑名单的虚拟机,判断是否处于虚拟环境中。
6.使用EnumWindows、GetClassName(如procexpl)搜索并隐藏黑名单程序窗口。
在另一个线程中,样本正在执行与恶意程序安装相关的操作,如将任务添加到Windows调度程序,向防火墙等反病毒工具中添加例外选项列表。
最终,样本会通过PE运行来启动有效负载。
首先,样本会将自己重新复制一遍
然后,在复制的地方映射一个新的PE文件:
有效载荷分析
有效载荷就是一个Neutrino僵尸程序,其中的字符串如下图:
结论
Neutrino僵尸程序已经被发现好几年了,随着时间的推移和技术的更新迭代,它的功能也越来越丰富,反检测能力也越来越强,这不能不令人担忧。
原文发布时间为:2017年3月10日
本文作者:xiaohui
本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。