针对Neutrino僵尸程序新增加的保护层进行分析

简介: 本文讲的是针对Neutrino僵尸程序新增加的保护层进行分析,最新版本的多用途Neutrino僵尸程序已经自带保护层并且Neutrino僵尸程序通过以它命名的利用工具包(Exploit Kit)已经开始进行分发,由于Neutrino属于Kasidet家族,而Kasidet家族又具有多种反调试
本文讲的是 针对Neutrino僵尸程序新增加的保护层进行分析

针对Neutrino僵尸程序新增加的保护层进行分析

最新版本的多用途Neutrino僵尸程序已经自带保护层并且Neutrino僵尸程序通过以它命名的利用工具包(Exploit Kit)已经开始进行分发,由于Neutrino属于Kasidet家族,而Kasidet家族又具有多种反调试、反沙箱和反虚拟机的功能,该家族的研发者有可能通过对常见的在线自动化恶意代码分析平台进行过针对性的研究,利用收集各种系统信息的恶意代码提炼出反制在线自动化恶意代码分析平台的方法,并应用到Kasidet家族中,所以最新版本的Neutrino具有很高的防护措施。

分发机制检测

本文中的Neutrino样本是通过在美国使用Neutrino的恶意广告活动中收集的。Neutrino在运行时会首先对运行环境是否是虚拟化,网络流量的正常化和防病毒软件的检测进行排查。如果发现任何可以的检测环境,恶意程序就会立马停止。这种检测技术是通过预登陆当前页面中的大量模糊JavaScript代码完成的,而不是像过去常用的Flash 检测技术。

针对Neutrino僵尸程序新增加的保护层进行分析

一旦通过运行环境的检测,Neutrino便会启动一个特制的Flash文件,其中包含Internet Explorer和Flash Player等一系列漏洞利用。最后一步是使用wscript.exe下载和执行经过RC4编码的载荷,以绕过代理网络限制。

感染流程总结如下图所示:

针对Neutrino僵尸程序新增加的保护层进行分析

样本分析

通过利用工具包分发的Neutrino样本:b2be7836cd3edf838ca9c409ab92b36d

加载器:349f5eb7c421ed49f9a260d17d4205d3

Neutrino僵尸程序的载荷:6239963eeda5df72995ad83dd4dedb18

这些样本被良好地保护在受控环境中(以避免在受控环境实施感染)。从下图中可以看出,如果样本检测到它正在虚拟机或沙箱中运行时,它便会删除本身的恶意操作组件:

针对Neutrino僵尸程序新增加的保护层进行分析

如果分析的环境通过了样本的测试,则样本便会将其复制到%APPDATA%/ Y1ViUVZZXQxx / <random_name> .exe(在本文,我们将其命名为abgrcnq.exe,uu.exe):

针对Neutrino僵尸程序新增加的保护层进行分析

随后,样本会对其所运行的文件夹进行隐藏

以便通过计划任务完成本地持久化。

针对Neutrino僵尸程序新增加的保护层进行分析

从下图中我们可以看到,样本添加和修改了几个注册表项,比如添加了包括安装日期等一些基本设置信息:

针对Neutrino僵尸程序新增加的保护层进行分析

然后,样本会修改一些键,以便让其更好的隐藏在测试系统中。同时注册表中的“隐藏或超级隐藏”功能能够让产生的副本不被用户发现。样本会通过修改以下注册表项,来禁止用户查看这些副本文件:

针对Neutrino僵尸程序新增加的保护层进行分析

它还会使用此命令将自己添加到防火墙的白名单中:

针对Neutrino僵尸程序新增加的保护层进行分析

与此类似,样本也会将自己的路径添加到Windows Defender的例外文件列表中:

针对Neutrino僵尸程序新增加的保护层进行分析

它还会禁止向Microsoft 的SpyNet 社区发送检测报告:

针对Neutrino僵尸程序新增加的保护层进行分析

它还会修改终端服务的表项设置,将MaxDisconnectionTime和MaxIdleTime设置为0,受影响表项为:

针对Neutrino僵尸程序新增加的保护层进行分析

如果以上这些完全安装过程成功的话,它样本便会开始加载其核心程序,这时我们可以看到一个典型的Neutrino 僵尸网络流量的特点:经过base64编码的“enter”请求报文及“success”响应报文特征。这些响应包会以注释形式嵌入到空白html页面中,议避免让用户发觉:

针对Neutrino僵尸程序新增加的保护层进行分析

然后样本会把自身的信息发送出去,以作为下一个请求中的响应,接着,C2C服务器便会像样本发出基于base64编码的请求及响应。解码后的样本如下:

请求报文:

针对Neutrino僵尸程序新增加的保护层进行分析

响应报文:

针对Neutrino僵尸程序新增加的保护层进行分析

响应报文使用的是截屏命令,不出预料,很快我们就看到样本的恶意程序发送了一张JPG格式的屏幕截图:

针对Neutrino僵尸程序新增加的保护层进行分析

从发送的版本号,我们可以得出结论,从发送的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编译的。

加载器分析

混淆技术分析

样本代码包含了多层混淆技术,如下图的几个可见的字符串:

针对Neutrino僵尸程序新增加的保护层进行分析

从上图可以看出,这个字符串中包含目录名、一些函数名、准备禁用的与Windows安全功能相关的注册表键值、计划任务中要添加的字符串,不过要提醒一下,这并不是这个字符串的全部信息。

大多数字符串在运行时会被解密,以下是一个加密字符串的加载过程:

针对Neutrino僵尸程序新增加的保护层进行分析

首先,通过专用函数将混淆后的字符串写入动态加载的存储器。然后,使用简单的基于XOR算法对其进行解密:

针对Neutrino僵尸程序新增加的保护层进行分析

解密后的字符串为:

针对Neutrino僵尸程序新增加的保护层进行分析

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

针对Neutrino僵尸程序新增加的保护层进行分析

跟踪API调用可以理解程序的功能,因此样本的作者不使用某些API,而是自己实现了这些函数功能。

我们通过跟踪API调用的过程,发现Neutrino的开发者不使用某些API就能实现相应的函数功能。如下图所示,开发者通过读取底层线程环境块(Thread Envioroment Block,TEB)结构实现了GetLastError()函数的功能:

针对Neutrino僵尸程序新增加的保护层进行分析

功能分析

为了防止恶意程序被多次运行,加载器创建一个具有二进制硬编码的互斥体(mutex):1ViUVZZXQxx。

该加载器的主要功能便是检查运行环境,以确保运行环境为真实环境。与大多数恶意软件不同,Neutrino的环境检查检测会有一个专门的线程来负责,以便让该功能会重复进行:

针对Neutrino僵尸程序新增加的保护层进行分析

于是检查便会无限循环下去:

针对Neutrino僵尸程序新增加的保护层进行分析

如果在任何时候,加载程序检测到即部署了一些列入黑名单的进程,则终止执行。

如果恶意程序的某个进程被列入到了黑名单中,则立马会被检测到,随即恶意进程也会自动终止。

检查过程如下所示:

1.使用动态加载CreateToolhelp32Snapshot、Process32First、Process32Next函数完成对当前运行列表中的所有进程进行检查。计算每个进程的校验和,与内置黑名单中的进程进行比较。

针对Neutrino僵尸程序新增加的保护层进行分析

从下图中我们可以看到,每个函数都在对应校验和下动态加载执行:

针对Neutrino僵尸程序新增加的保护层进行分析

2.在当前进程中使用动态加载CreateToolhelp32Snapshot、Module32First、Module32Next函数完成搜索列入黑名单中的模块。类似地,计算每个进程名的校验和并与内置黑名单进行比较。

针对Neutrino僵尸程序新增加的保护层进行分析

3.使用IsDebuggerPresent、CheckRemoteDebuggerPresent判断程序是否正被调试

4.使用GetTickCount、Sleep、GetTickCount进行单步执行时间检测。

5.使用QueryDosDevices(如VBoxGuest)检测列入黑名单的虚拟机,判断是否处于虚拟环境中。

6.使用EnumWindows、GetClassName(如procexpl)搜索并隐藏黑名单程序窗口。

针对Neutrino僵尸程序新增加的保护层进行分析

在另一个线程中,样本正在执行与恶意程序安装相关的操作,如将任务添加到Windows调度程序,向防火墙等反病毒工具中添加例外选项列表。

最终,样本会通过PE运行来启动有效负载。

首先,样本会将自己重新复制一遍

针对Neutrino僵尸程序新增加的保护层进行分析

然后,在复制的地方映射一个新的PE文件:

针对Neutrino僵尸程序新增加的保护层进行分析

有效载荷分析

有效载荷就是一个Neutrino僵尸程序,其中的字符串如下图:

针对Neutrino僵尸程序新增加的保护层进行分析

结论

Neutrino僵尸程序已经被发现好几年了,随着时间的推移和技术的更新迭代,它的功能也越来越丰富,反检测能力也越来越强,这不能不令人担忧。




原文发布时间为:2017年3月10日
本文作者:xiaohui 
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
3月前
|
云安全 监控 负载均衡
游戏运行只会占用到服务器里面一个核心使用,其他核心不工作,是什么问题
游戏运行只占用服务器的一个核心,而其他核心不工作,可能有多种原因。以下分享一些常见的原因和处理的方案
段错误(核心已转储)问题的分析方法(未成功)
段错误(核心已转储)问题的分析方法(未成功)
177 0
|
数据库 Windows 容器
如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
223 0
|
Java
这4种方式,统计代码执行耗时,才足够优雅!
这4种方式,统计代码执行耗时,才足够优雅!
276 0
这样统计代码执行耗时,才足够优雅!
代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。 可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。
|
网络协议
服务器检测到客户端退出或崩溃后,如何优雅地做出反应
目前我的TCP客户端一旦退出,服务器就跟着挂了,这肯定不行。
服务器检测到客户端退出或崩溃后,如何优雅地做出反应
|
移动开发 小程序 Java
这4种统计代码执行耗时,才足够优雅!
今天,跟大家分享一下,如何在代码中,统计接口耗时,最优雅,性能最高,接下来我将介绍4种统计方式,如果你有更好的方式,欢迎文末留言区,交流
724 0
这4种统计代码执行耗时,才足够优雅!
|
监控 Java 测试技术
系统运行缓慢,CPU 100%,以及 Full GC 次数过多问题的排查思路
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。
1107 0
|
Linux 测试技术 Shell
系统诊断小技巧(11):如何解决“问题复现了,但是捕捉数据进程因为CPU打满没有运行”?
引子 曾经搞过一个尴尬的案例。排查过一个CPU打满的问题。因为问题是在凌晨出现,而且非常随机。所以我们就准备了一个脚本,用来捕获占用CPU高的线程。但尴尬的是,问题复现了,我们的脚本偏偏在问题复现的时候,没有记录。
1995 0

相关实验场景

更多