频道栏目
首页 > 安全 > 网络安全 > 正文

带有加载保护机制的新型Neutrino僵尸程序

2017-03-03 09:35:29           
收藏   我要投稿

带有加载保护机制的新型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] ^ 1

decoded.append(dec)

return decoded

解密后的字符串为:

\

大多数API调用同样也经过了动态解析处理,如:

\

跟踪API调用可以理解程序的功能,因此样本的作者不使用某些API,而是自己实现了这些函数功能。比如,作者通过读取底层线程环境块(Thread Envioroment Block,TEB)结构实现了GetLastError()的功能:

\

5.2 功能分析

加载器创建了一个互斥量(mutex)以避免重复执行,mutex名为1ViUVZZXQxx,硬编码在样本文件中。

上一篇:勒索软件Spora以离线方式感染——无需与控制服务器通信
下一篇:Seebug 2016年度报告
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站