9

P2P Botnet: Mozi分析报告

 3 years ago
source link: https://blog.netlab.360.com/p2p-botnet-mozi/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
23 December 2019 / Botnet

P2P Botnet: Mozi分析报告

2019年09月03日我们捕获到一个可疑的的样本文件,大部分杀毒引擎将其识别为Gafgyt,但该样本和已知Gafgyt相似程度不高,只是复用了部分Gafgyt的代码。经过详细分析,我们确定这是Hajime之后,另一个基于DHT协议实现的P2P Botnet。根据其样本传播样本文件名称为Mozi.mMozi.a等特征我们将它命名为Mozi Botnet。

Mozi Botnet依赖DHT协议建立一个P2P网络,通过ECDSA384以及xor算法保证自身组件和P2P网络的完整性和安全性。样本通过Telnet弱口令和一些已知的漏洞利用蠕虫式传播。功能方面,Mozi僵尸网络中的各个节点的指令执行由Botnet Master下发的名为Config的Payload驱动,主要指令包括:

  • DDoS攻击
  • 收集Bot信息
  • 执行指定URL的payload
  • 从指定的URL更新样本
  • 执行系统或自定义命令

其整体网络结构如下图所示:

Mozi通过telnet弱口令和漏洞利用两种方式感染新设备。感染过程如下:

  • 当前Bot节点随机监听本地端口启动http服务提供样本下载或者接收Botnet Master下发的Config文件中的样本下载地址。用于为将来被感染的目标提供样本下载地址。
  • 当前Bot节点利用弱口令登录目标设备,echo方式写入下载器文件并运行,从当前Bot节点提供的样本下载地址下载样本文件。或者通过漏洞利用入侵目标,然后从当前Bot节点提供的样本下载地址取得样本文件。
  • 在被感染目标设备上运行Mozi Bot样本,加入Mozi P2P网络成为新的Mozi Bot节点并继续感染其他新的设备。

Mozi Botnet所利用的漏洞如下表所示:

当前我们暂时还不清楚该Botnet的规模,但从我们已经有的数据看,该Botnet的感染量一直在持续增长。下图为我们蜜罐收集到的Mozi bot感染日志。
fssfsadfsdff

样本逆向分析

目前,Mozi Botnet已有3个版本,在telnet传播方面略有不同,其它方面非常接近,

下文将以最新版本v2为主,同时也会穿插早期版本(样本md5: 849b165f28ae8b1cebe0c7430f44aff3),从传播方式,Config结构,DHT网络等方面剖析Mozi的技术细节。

MD5:eda730498b3d0a97066807a2d98909f3

ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, stripped

Packer: NO

Library:uclibc

Version: v2

值得一提的是,第一个版本中Mozi 采用了upx加壳。相较与常见的更改upx幻数对抗脱壳,Mozi使用了一种新颖的手法,将p_filesize&p_blocksize的值抹成了0。需要对upx源码做相应的patch才能脱壳。

Mozi在主机行为层面并没太多特色,复用了Gafgyt的代码,实现了许多常见功能,如单一实例,修改进程名,网络流量放行。

  • 单一实例,通过绑定本地端口实现
  • 修改进程名,换成sshd或dropbear以迷惑受害者
  • 流量阻断&放行,确保所用到的TCP,UDP端口,流量正常通过;


    阻断SSH,TELNET服务,防止Bot被其他人入侵。

执行特定任务

Mozi通过DHT协议建立p2p网络后,同步config文件,根据config文件里的指令,开始相应的任务。在P2P网络中,节点是不可信的,任何人都能够以极低成本的伪造一个Mozi节点。为保证Mozi网络的完全可控,不被他人窃取,Mozi需要对每一个同步到的config做签名验签,只有能够通过了签名验签才能被Mozi节点接受,并执行。

文件&指令验签

Mozi使用ECDSA384算法验证文件及指令的合法性,每个样本都集成了俩个xor加密的的公钥,分别用于验签加密和解密后的config文件。

 xor key:4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E
------------------------------------------------------------------
xored publickey A 
	4C B3 8F 68 C1 26 70 EB 9D C1 68 4E D8 4B 7D 5F 
	69 5F 9D CA 8D E2 7D 63 FF AD 96 8D 18 8B 79 1B 
	38 31 9B 12 69 73 A9 2E B6 63 29 76 AC 2F 9E 94 A1	
after decryption: 
	02 d5 d5 e7 41 ee dc c8 10 6d 2f 48 0d 04 12 21 
	27 39 c7 45 0d 2a d1 40 72 01 d1 8b cd c4 16 65 
	76 57 c1 9d e9 bb 05 0d 3b cf 6e 70 79 60 f1 ea ef
-------------------------------------------------------------------
xored publickey B
	4C A6 FB CC F8 9B 12 1F 49 64 4D 2F 3C 17 D0 B8 
	E9 7D 24 24 F2 DD B1 47 E9 34 D2 C2 BF 07 AC 53 
	22 5F D8 92 FE ED 5F A3 C9 5B 6A 16 BE 84 40 77 88
after decryption:
	02 c0 a1 43 78 53 be 3c c4 c8 0a 29 e9 58 bf c6 
	a7 1b 7e ab 72 15 1d 64 64 98 95 c4 6a 48 c3 2d 
	6c 39 82 1d 7e 25 f3 80 44 f7 2d 10 6b cb 2f 09 c6

Config文件

每个样本集成了一个xor加密的初始的config文件,长度为528字节,其结构为data(428 bytes),sign(96 bytes),flag(4 bytes),sign字段为数字签名,flag字段控制config文件更新与否。config文件里有许多控制字段,Mozi节点收到config后,解析字段内容,执行相应的子任务。
原始config文件如下

解密过程如下图所示,其中xor key为

4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E

解密后的config如下

支持的关键字如下,可以分成辅助,控制,子任务3大类。

1:辅助字段,用于信息说明
[cpu]  cpu arch or os
[cpux]  cpu arch or os
[ss]	bot role
[ssx]	bot role
[nd] 	new node info which help to join DHT
2:控制字段,用于更新节点的数据
[ver] 	verify 
[sv]	update  Config
[hp] 	DHT id prefix
[dip]   URL or ip:port list which can get Mozi sample
3:子任务字段,用于开启相应的子任务
[atk]	DDOS attack
[ud] 	update
[dr] 	exec payload from specific URL 
[rn] 	exec system or customized cmds
[idp] 	report bot info

Bot功能

  • DDOS,[atk]字段触发,复用Gafgyt了攻击代码,支持HTTP,TCP,UDP等攻击。
    Command
    -----------------------------------------
    S    
    T
    U
    KT
    HTTP
    
  • 上报Bot信息,[idp]字段触发,上报的内容为Bot的ID,IP,PORT,文件名(全路径),网关,cpu架构。
  • 执行指定URL的payload,[dr]字段触发。
  • 从指定的URL更新,[ud]字段触发。关闭当前节点的网络连接和相关进程,从指定URL下载新版本,保存DHT节点,ID等数据,将它们做为参数提供给新版体使用。
  • 执行系统或Bot自定义命令,[rn]字段触发。
    • 自定义GET命令,将Bot ID发送给对端。
    • 自定义run命令,执行对端下发的命令,并将结果回传。

Mozi Botnet使用自己扩展的DHT协议构建p2p网络,这样做有俩个好处,一来使用标准的DHT能够快速组网,二来使用自己的扩展能够将有效payload的流量隐匿于海量的正常DHT流量中,躲避检测。Mozi使用8组公共节点以及Config文件的[nd]字段指定的节点作为bootstrap nodes。引导新节点加入其DHT网络。

  • 公共节点,样本内嵌
dht.transmissionbt.com:6881
router.bittorrent.com:6881
router.utorrent.com:6881
bttracker.debian.org:6881
212.129.33.59:6881
82.221.103.244:6881
130.239.18.159:6881
87.98.162.88:6881
  • Config文件中[nd]指定

ID20字节,由样本内嵌的prefix(888888)或config文件[hp]指定的prefix,加随机生成的字串构成。

为了快速区分流量,Mozi使用1:v4:flag(4 bytes)这样的标识来识别流量是否由其结点发出,

flag字节含义如下,

flag(4 bytes)
----------------------------------------------
offset:
	0  -----random
	1  ----- hard-code(0x42) or from [ver]
    2  -----calc by algorithm
    3  -----calc by algorithm

第1个字节是随机产生的,第2个字节是硬编码的0x42或由config文件中[ver]字段指定。

第3,4字节由算法得来,

ver algorithm
----------------------------------------------
	int first,sec;
	string ver="\x31\x3a\x76\x34\x3a\x00\x00"s;
	cout << "Please input the two number: (0x00-0xff)" << endl;
	cin.unsetf(ios::hex);
	cin >> hex >> first >> sec;
	ver[5] = char(first);
	ver[6] = char(sec);
	uint32_t va = 0;
	for(int i = 0; i < 7; i++)
	{	
		uint32_t tmp = int(ver[i]);
		tmp = tmp << 8;
		tmp ^= va;
		int rnd = 8;
	while (rnd--)
	{
		if ((tmp & 0xffff) > 0x8000)
		{
			tmp *= 2;
			tmp ^= 0xffff8005;
		}
		else
			tmp *= 2;
	}
	va = tmp&0xffff;
	}
	cout  << hex  << "Final " <<  va << endl;

Please input the two number: (0x00-0xff)
0x44 0x42
Final 1f71
输入0x44 0x42,得到0x1f71,和数据包里结果一致。

Mozi节点收到的网络请求可以分成2大类,DHT请求和非DHT请求。依据前文所述的节点识别,DHT请求分为Mozi-DHT请求,非Mozi-DHT请求。Mozi支持ping,find_node,get_peers3种。对于非DHT请求,依据网络数据包长度大于99与否分成2种。

Mozi将不同的请求编号如下所示,不同的请求有不同的处理逻辑

  • 编号2: ping ,DHT请求,按标准DHT流程处理直接回复pong。
  • 编号3:find_node,DHT请求。
  • 编号4:get_peers,DHT请求。
    Mozi 将find_node,get_peers合二为一,如果请求来自Mozi节点,有一定的概率把自身的Config内容发送给对方;如果来请求来自非Mozi节点,则按标准DHT的流程处理。
原始数据内容(节选前128字节):
00000000  64 31 3a 72 64 32 3a 69 64 32 30 3a 38 38 38 38  |d1:rd2:id20:8888|
00000010  38 38 38 38 b7 96 a0 9e 66 e1 71 98 e5 4d 3e 69  |8888·. .fáq.åM>i|
00000020  35 3a 6e 6f 64 65 73 36 32 34 3a 15 15 29 d2 f3  |5:nodes624:..)Òó|
00000030  a3 f7 0c fe df 1a 5d bd 3f 32 46 76 5e 62 b7 b8  |£÷.þß.]½?2Fv^b·¸|
00000040  f0 94 78 a2 c4 37 5b 8e 2c 00 0b 20 12 07 e7 f4  |ð.x¢Ä7[.,.. ..çô|
00000050  bc dc 19 a2 83 2e 67 fb 7a 5e 50 22 07 75 e8 ef  |¼Ü.¢..gûz^P".uèï|
00000060  f9 93 4a e9 91 75 36 e4 76 57 4b 7c 51 7c ff f5  |ù.Jé.u6ävWK|Q|ÿõ|
00000070  f5 c4 57 f9 dc 62 35 b4 6a 5d 18 6b 54 3c ed e1  |õÄWùÜb5´j].kT<íá|
00000080  a1 c8 56 a3 cf 28 6b fa 14 06 1a 3e 3b 01 a0 e3  |¡ÈV£Ï(kú...>;. ã|
加密的Config位于"5:nodes624:"之后,使用xor key(4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E) 解密后:
原始数据部分:
00000000  64 31 3a 72 64 32 3a 69 64 32 30 3a 38 38 38 38  |d1:rd2:id20:8888|
00000010  38 38 38 38 b7 96 a0 9e 66 e1 71 98 e5 4d 3e 69  |8888·. .fáq.åM>i|
00000020  35 3a 6e 6f 64 65 73 36 32 34 3a 				   |5:nodes624:
Config部分:
00000000  5b 73 73 5d 73 6b 5b 2f 73 73 5d 5b 68 70 5d 38  |[ss]sk[/ss][hp]8|
00000010  38 38 38 38 38 38 38 5b 2f 68 70 5d 5b 63 6f 75  |8888888[/hp][cou|
00000020  6e 74 5d 68 74 74 70 3a 2f 2f 69 61 2e 35 31 2e  |nt]http://ia.51.|
00000030  6c 61 2f 67 6f 31 3f 69 64 3d 32 30 31 39 38 35  |la/go1?id=201985|
00000040  32 37 26 70 75 3d 68 74 74 70 25 33 61 25 32 66  |27&pu=http%3a%2f|

  • 编号5:announce_peer,不支持
  • 编号6:非DHT请求,数据包长<99字节,当节点收到此请求,会将自身的config内容发送给请求方。
  • 编号7:非DHT请求,数据包长>99字节,当节点收到此请求,说明收到的数据为加密的Config文件,执行流程参照前文。

我们建议用户及时更新补丁,并根据Mozi Botnet创建的进程,文件名以及HTTP,DHT网络连接特征,判断是否被感染,然后清理它的相关进程和文件。

相关安全和执法机构,可以邮件联系netlab[at]360.cn交流更多信息。

感兴趣的读者,可以在 twitter 或者在微信公众号 360Netlab 上联系我们。

IoC list

样本MD5:

eda730498b3d0a97066807a2d98909f3
849b165f28ae8b1cebe0c7430f44aff3

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK