带有加载保护机制的新型Neutrino僵尸程序。本文将分析多功能Neutrino僵尸程序(也叫Kasidet)的一个最新版本,该程序通过以它命名的利用工具包(Neutrino Exploit Kit)进行分发。今年一月份时,我们已经大概描述了利用垃圾邮件传播的Neutrino僵尸程序,因此我们不会过多讨论这些细节,而会将重点放在它的程序加载部分。
程序使用多层虚拟机检测技术对其关键核心进行了隐藏,导致我们对其最终载荷的提取工作遇到了些许挑战。
一、分发机制
程序样本从美国的恶意广告活动中捕获,这些活动使用了Neutrino Exploit Kit进行恶意程序分发。恶意程序在受害主机上首先会进行指纹检测,探测虚拟化环境,捕获网络流量以及检查反病毒软件。如果程序发现所处环境异常(即不是典型的受害主机),则放弃感染过程。程序使用落地前页面中的大量混淆的javascript代码完成这一检查过程,而不是使用以往的Flash检测方法。
程序初始检查通过后,下一步骤是启动一个特制的Flash文件,其中包含一系列的Internet Explorer和Flash Player漏洞利用工具(参考这里的相关介绍)。最后一步是使用wscript.exe下载和执行经过RC4编码的载荷,以绕过代理网络限制。
总体感染流程如下所示:
Maciej Kotowicz写了一个脚本,可以提取Flash文件中的功能组件。
二、分析的样本及哈希值
Neutrino Exploit Kit释放的原始样本:b2be7836cd3edf838ca9c409ab92b36d
加载器:349f5eb7c421ed49f9a260d17d4205d3
载荷(即Neutrino僵尸程序):6239963eeda5df72995ad83dd4dedb18
三、行为分析
样本采取了保护机制以防止在受控环境中投放。当样本探测到其运行在虚拟机或沙箱中时会进行自删除操作。
环境检测通过后,程序将副本拷贝到%APPDATA%/Y1ViUVZZXQxx/.exe(本文中为abgrcnq.exe,uu.exe):
同时对释放的文件夹及文件进行隐藏。
样本通过计划任务完成本地持久化。
样本修改添加了几个注册表键值,如安装日期等基本设置信息:
对几个键值进行修改,以在系统里保持隐藏性。注册表中的Hidden及SuperHidden功能可以使程序副本对用户保持隐藏。样本通过修改以下注册表项达到文件的隐藏性:
Software\Microsoft\windows\CurrentVersion\Explorer\Advanced\Hidden
Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSuperHidden
样本利用命令将自身添加到防火墙白名单中:
cmd.exe " /a /c netsh advfirewall firewall add rule name="Y1ViUVZZXQxx" dir=in action=allow program=[full_executable_path]与此类似,样本也将自身路径添加到Windows Defender的例外文件列表中:
样本对终端服务设置表项进行修改,将MaxDisconnectionTime及MaxIdleTime值设为0,受影响表项为:
HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxDisconnectionTimeHKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime
如果安装过程一切顺利,样本将加载其核心部件,我们也可以观察到典型的Neutrino僵尸网络流量特征,比如下图中,经过base64编码的“enter”请求报文及“success”响应报文特征。响应包以注释形式嵌入到空白html页面中,避免引起用户警觉。
程序发送自身信息作为下一个请求,而C2C服务器则会返回程序下一步要执行的命令。请求及响应报文也经过base64进行编码。解码后的一个示例为:
请求报文:
cmd&9bc67713-9390-4bcd-9811-36457b704c9c&TESTMACHINE&Windows%207%20(32-bit)&0&N%2FA&5.2&22.02.2017&NONE
响应报文:
1463020066516169#screenshot#1469100096882000#botkiller#1481642022438251#rate 15#
响应报文中,第一个命令是截屏命令,之后我们的确看到程序发送了一张JPG格式的屏幕截图:
从发送报文中我们可知程序版本为5.2版(与这篇文章分析的类似:https://blog.malwarebytes.com/cybercrime/2017/01/post-holiday-spam-campaign-delivers-neutrino-bot/)
{C}四、深入分析
程序使用的第一层是加密器层,用于覆盖内存中加载器映像的初始PE结构,可参考这里的相关解密视频。
第二层是个加载器层,防止核心程序在受控环境中(如虚拟机或调试器环境)运行。这可能是它新使用的一个功能(我们从未在之前的Neturino僵尸网中观察到)。我们发现这一层非常有效,测试期间大多数沙箱和虚拟机环境无法提供该样本的任何有用信息。
最后一层是Neutrino僵尸家族的典型功能载荷层。
从加载器代码中可知,它并非依附于独立加密器的一层,而是完整Neutrino僵尸包中的一个集成部分。载荷层和加载器层都采用C++进行开发,使用类似的函数,包含重叠的字符串,本文后半部分将就此进行详细分析。这两层的编译时间戳非常接近,分别为2017-02-16 17:15:43和2017-02-16 17:15:52。
可以在这里找到禁用环境检查功能的加载器修复版。
五、加载器分析
5.1 混淆技术
代码包含了基层混淆技术,几个可见的字符串如下所示:
字符串中包含目录名、一些函数名、准备禁用的与Windows安全功能相关的注册表键值、计划任务中要添加的字符串。
大多数字符串在运行时进行解密,以下是一个加密字符串的加载过程:
程序首先使用专用函数将混淆字符串写入动态加载的内存中,然后使用简单的异或方法进行解密:
def decode(data):
maxlen = len(data)
decoded = bytearray()
for i in range(0, maxlen):
dec = data[i] ^ 1decoded.append(dec)
return decoded
解密后的字符串为:
大多数API调用同样也经过了动态解析处理,如:
跟踪API调用可以理解程序的功能,因此样本的作者不使用某些API,而是自己实现了这些函数功能。比如,作者通过读取底层线程环境块(Thread Envioroment Block,TEB)结构实现了GetLastError()的功能:
5.2 功能分析
加载器创建了一个互斥量(mutex)以避免重复执行,mutex名为1ViUVZZXQxx,硬编码在样本文件中。