0x01 引言
一般情况下,网络犯罪分子通常都会以产品套装的形式来出售其攻击软件,其中包括:
恶意有效载荷:恶意软件的前端,用于感染用户。
C&C面板:恶意软件的后端部分,通常为LAMP环境下的一个Web应用程序。
生成器:一个应用程序,用来打包有效载荷,并嵌入特定发布者所感兴趣的信息,比如C&C地址、配置信息等。
这些恶意软件套装通常都是在黑市上销售的,尽管如此,有时还是会流入主流媒体的手上。这就给研究人员提供了一个宝贵的机会,来深入考察它们所使用的各种技术。
最近,我手头上就得到了这样的一个软件套装,其中就包括Neutrino僵尸网络的生成器。尽管这不是最新的版本,但是依旧能够提供有用的信息,来帮助我们与当今广泛传播的样本进行对比分析。
0x02 相关组成部分
Neutrino Builder:32位PE程序,使用VS2013编写,利用Safengine Shielden v2.3.6.0加壳(md5=80660973563d13dfa57748bacc4f7758)。
panel(利用PHP编写的)。
stub(有效载荷):32位PE程序,是用MS Visual C++编写的(md5=55612860c7bf1425c939815a9867b560, section .text md5=07d78519904f1e2806dda92b7c046d71)。
0x03 功能
Neutrino Builder v3.9.4
这个生成器是利用Visual Studio 2013编写的,因此需要合适的可再发行组件包(Redistributable Package)才能够正常运行。这个生成器是一个破解版,因为从标头部分可以看到“Cracked and coded by 0x22”等字样。
这个工具的功能非常简单:向用户询问C&C的地址,然后将其写入有效荷载。
比较两个有效荷载:一个是原始的有效荷载,一个是由该生成器编辑过的有效荷载。我们发现,实际上这个生成器所做的修改非常小,它只是对提供的URL进行加密处理,然后将其保存到指定的地方。
下面的图中,左图(stub)是原始的有效荷载,右图(test_stub.exe)是经过编辑之后的有效荷载。
Panel
这个软件套装含有完整的使用说明(readme.txt),不过使用俄语编写的,其中可以发现许多功能细节。
安装面板所需的软件:
PHP
MySQL,版本号不得低于5.6。
面板的默认登录名和口令:admin,admin。
被感染的客户端可以根据要求而执行的任务:
各种类型的DDoS攻击。
键盘记录(启用/禁用)功能,包括指定窗口内的轨迹文本。
查找指定类型的文件。
更新bot。
删除bot。
DNS欺骗(将地址X重定向到地址Y)。
Form表单截取,窃取FTP证书。
下载并执行下列类型的文件(EXE、DLL、、bat 、vbs)。
向Windows注册表添加指定内容。
发送给bot的完整命令列表:
functions.php
C&C对非法请求非常敏感,并且会根据源IP黑名单作出相应的反应:
functions.php
通过观察install.php,我们还可以发现Form表单所截取的目标。这里的列表中包括了最流行的电子邮件和社交网络网站(facebook、linkedin、twitter等)。
install.php
用于实现跟bot通信的主文件是tasks.php,它只接收一种POST请求。
将bot发送的信息添加到数据库:
tasks.php
打开index.php会导致客户端的IP被加入黑名单(无条件):
index.php
Stub
在后端可以找到的所有命令在前端都有所反映,这一点可以清楚看出来,因为有效荷载根本就没有经过混淆处理!
硬编码的验证密钥,对于bot发送的每一个请求,C&C都会检查其中的验证密钥:
Bot自己会登录到C&C,报告期版本和运行环境:
下面是C&C请求的部分命令的实现:
从C&C下载指定的有效载荷:
键盘记录器的部分代码:
Frame截取器的代码片段:
窃取剪贴板中的内容(部分代码):
将窃取的内容(如登录密码)保存到一个文件中(logs.rar)。然后,读取这个文件,并将其上传到C&C:
讲这个文件封装到POST请求中:
此外,无论C&C请求的任务是成功或失败,bot都要提供相应的报告:
这个恶意软件所带来的威胁,不仅仅局限于本地计算机,此外,它还会扫描LAN,寻找共享资源,并窃取之:
窃取共享资源(部分代码):
防御技术
除了上面介绍的攻击性功能之外,这个有效载荷含有大量的防御功能。
除明显的isDebuggerPresent之类检查外,我们还发现了一些更加高级或者说非常怪异的东西,例如检查用户名是否含有下列字符串:maltest、tequilaboomboom、sandbox、virus、malware。完整的防御功能说明如下:
确定调用进程是否为调试器,这需要借助于:
IsDebuggerPresent
确定调用进程是否为远程调试器,这需要借助于:
CheckRemoteDebuggerPresent(GetCurrentProcess(), pDebuggerPresent)
检测是否运行在Wine下面,这需要借助于:
GetProcAddress(GetModuleHandleW(“kernel32.dll”), “wine_get_unix_file_name”)
检查是否含有黑名单中的子串(忽略大小写):
是否含有用户名,这需要借助于:
GetUserNameW vs {“MALTEST“, “TEQUILABOOMBOOM“, “SANDBOX“, “VIRUS“,”MALWARE“}
是否含有当前模块名称,这需要借助于:
GetModuleNameW vs {“SAMPLE“, “VIRUS“, “SANDBOX” }
是否含有BIOS版本号,这需要借助于注册表:
“HARDWAREDescriptionSystem“, value “SystemBiosVersion” against: {“VBOX“, “QEMU“, “BOCHS“}
是否含有BIOS版本号,这需要借助于注册表:
“HARDWAREDescriptionSystem“, value “VideoBiosVersion” against: “VIRTUALBOX“
是否含有SCSI信息,这需要借助于注册表:
“HARDWAREDEVICEMAPScsiScsi Port 0Scsi Bus 0Target Id“, value “Identifier“), against {“VMWARE“, “VBOX“, “QEMU“}
检查是否存在:
VMWareTools,这需要借助于注册表:SOFTWAREVMware, Inc.VMware Tools。
VBoxGuestAdditions,这需要借助于注册表:SOFTWAREOracleVirtualBox Guest Additions。
0x04 小结
通常情况下,恶意软件分析人员只跟其中的一部分即恶意有效载荷打交道。通过像本文这样考察整个套装,能够帮我们对恶意软件了解地更加全面。
此外,它还能够很好地帮我们了解分布式恶意软件的各种活动是如何组织协调的。如本文所示,网络犯罪分子可以非常轻松的组配自己的恶意C&C。一个人,根本无需任何高深的技巧,照样可以变身成为一个僵尸网络的主人。我们如今生活的时代,是恶意软件武器化的时代,是大众也能取之即用的时代,所以,每个人都必须采取坚固和多层的安全防护措施,这一点非常关键。