P2P Botnet： Ｍozi分析报告
<!--kg-card-begin: markdown--><h2 id="">概览</h2>
<p>2019年09月03日我们捕获到一个可疑的的样本文件，大部分杀毒引擎将其识别为Gafgyt，但该样本和已知Gafgyt相似程度不高，只是复用了部分Gafgyt的代码。经过详细分析，我们确定这是Hajime之后，另一个基于DHT协议实现的P2P Botnet。根据其样本传播样本文件名称为<code>Mozi.m</code>、<code>Mozi.a</code>等特征我们将它命名为<code>Mozi</code> Botnet。</p>
<p>Mozi Botnet依赖DHT协议建立一个P2P网络，通过ECDSA384以及xor算法保证自身组件和P2P网络的完整性和安全性。样本通过Telnet弱口令和一些已知的漏洞利用蠕虫式传播。功能方面，Ｍozi僵尸网络中的各个节点的指令执行由Botnet Master下发的名为Config的Payload驱动，主要指令包括：</p>
<ul>
<li>DDoS攻击</li>
<li>收集Bot信息</li>
<li>执行指定URL的payload</li>
<li>从指定的URL更新样本</li>
<li>执行系统或自定义命令</li>
</ul>
<p>其整体网络结构如下图所示：<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_flow-3.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_flow.m.png" class="kg-image"/></a></p>
<h2 id="">样本传播</h2>
<p>Ｍozi通过telnet弱口令和漏洞利用两种方式感染新设备。感染过程如下：</p>
<ul>
<li>当前Bot节点随机监听本地端口启动http服务提供样本下载或者接收Botnet Master下发的Config文件中的样本下载地址。用于为将来被感染的目标提供样本下载地址。</li>
<li>当前Bot节点利用弱口令登录目标设备，echo方式写入下载器文件并运行，从当前Bot节点提供的样本下载地址下载样本文件。或者通过漏洞利用入侵目标，然后从当前Bot节点提供的样本下载地址取得样本文件。</li>
<li>在被感染目标设备上运行Mozi Bot样本，加入Mozi P2P网络成为新的Mozi Bot节点并继续感染其他新的设备。</li>
</ul>
<p>Mozi Botnet所利用的漏洞如下表所示：</p>
<table>
<thead>
<tr>
<th>Vulnerability</th>
<th>Affected Aevice</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.exploit-db.com/exploits/40740">Eir D1000 Wireless Router RCI</a></td>
<td>Eir D1000 Router</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/6864/">Vacron NVR RCE</a></td>
<td>Vacron NVR devices</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/37169/">CVE-2014-8361</a></td>
<td>Devices using the Realtek SDK</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/41598/">Netgear cig-bin Command Injection</a></td>
<td>Netgear R7000 and R6400</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/43055">Netgear setup.cgi unauthenticated RCE</a></td>
<td>DGN1000 Netgear routers</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/41471/">JAWS Webserver unauthenticated shell command execution</a></td>
<td>MVPower DVR</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/43414/">CVE-2017-17215</a></td>
<td>Huawei Router HG532</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/37171/">HNAP SoapAction-Header Command Execution</a></td>
<td>D-Link Devices</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/44576/">CVE-2018-10561, CVE-2018-10562</a></td>
<td>GPON Routers</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/28333/">UPnP SOAP TelnetD Command Execution</a></td>
<td>D-Link Devices</td>
</tr>
<tr>
<td><a href="https://www.exploit-db.com/exploits/39596/">CCTV/DVR Remote Code Execution</a></td>
<td>CCTV DVR</td>
</tr>
</tbody>
</table>
<p>当前我们暂时还不清楚该Botnet的规模，但从我们已经有的数据看，该Botnet的感染量一直在持续增长。下图为我们蜜罐收集到的Mozi bot感染日志。<br>
<img src="__GHOST_URL__/content/images/2019/12/fssfsadfsdff.png" alt="fssfsadfsdff" loading="lazy"></p>
<h2 id="">样本逆向分析</h2>
<p>目前，Mozi Botnet已有３个版本，在telnet传播方面略有不同，其它方面非常接近，<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_versioin.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_versioin.png" class="kg-image"/></a><br>
下文将以最新版本v2为主，同时也会穿插早期版本(样本md5: <code>849b165f28ae8b1cebe0c7430f44aff3</code>)，从传播方式，Config结构，DHT网络等方面剖析Mozi的技术细节。</p>
<h3 id="">样本信息</h3>
<blockquote>
<p>MD5:eda730498b3d0a97066807a2d98909f3</p>
<p>ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, stripped</p>
<p>Packer: NO</p>
<p>Library:uclibc</p>
<p>Version: v2</p>
</blockquote>
<p>值得一提的是，第一个版本中Mozi 采用了upx加壳。相较与常见的更改upx幻数对抗脱壳，Ｍozi使用了一种新颖的手法，将p_filesize&amp;p_blocksize的值抹成了０。需要对upx源码做相应的patch才能脱壳。</p>
<h3 id="">常见功能</h3>
<p>Ｍozi在主机行为层面并没太多特色，复用了Gafgyt的代码，实现了许多常见功能，如单一实例，修改进程名，网络流量放行。</p>
<ul>
<li>单一实例，通过绑定本地端口实现<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_bind.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_bind.png" class="kg-image"/></a></li>
<li>修改进程名，换成sshd或dropbear以迷惑受害者<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_setname.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_setname.png" class="kg-image"/></a></li>
<li>流量阻断&amp;放行，确保所用到的TCP,UDP端口，流量正常通过；<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_iptables.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_iptables.png" class="kg-image"/></a><br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_ssh.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_ssh.png" class="kg-image"/></a><br>
阻断SSH，TELNET服务，防止Bot被其他人入侵。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_forb.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_forb.png" class="kg-image"/></a></li>
</ul>
<h3 id="">执行特定任务</h3>
<p>Mozi通过DHT协议建立p2p网络后，同步config文件，根据config文件里的指令，开始相应的任务。在P2P网络中，节点是不可信的，任何人都能够以极低成本的伪造一个Mozi节点。为保证Mozi网络的完全可控，不被他人窃取，Mozi需要对每一个同步到的config做签名验签，只有能够通过了签名验签才能被Mozi节点接受，并执行。</p>
<p><a href="__GHOST_URL__/content/images/2019/12/mozi_configproc.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_configproc.png" class="kg-image"/></a></p>
<h4 id="">文件&amp;指令验签</h4>
<p>Ｍozi使用ECDSA384算法验证文件及指令的合法性，每个样本都集成了俩个xor加密的的公钥，分别用于验签加密和解密后的config文件。</p>
<pre><code> 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
</code></pre>
<h4 id="config">Config文件</h4>
<p>每个样本集成了一个xor加密的初始的config文件，长度为528字节,其结构为<strong>data(428 bytes),sign(96 bytes),flag(4 bytes)</strong>，sign字段为数字签名，flag字段控制config文件更新与否。config文件里有许多控制字段，Mozi节点收到config后，解析字段内容，执行相应的子任务。<br>
原始config文件如下<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_enconfig.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_enconfig.png" class="kg-image"/></a><br>
解密过程如下图所示，其中xor key为</p>
<pre><code>4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E
</code></pre>
<p><a href="__GHOST_URL__/content/images/2019/12/mozi_xorproc.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_xorproc.png" class="kg-image"/></a><br>
解密后的config如下<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_denconfig.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_denconfig.png" class="kg-image"/></a><br>
支持的关键字如下，可以分成辅助，控制，子任务３大类。</p>
<pre><code>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
</code></pre>
<h4 id="bot">Bot功能</h4>
<ul>
<li>DDOS，<code>[atk]</code>字段触发，复用<strong>Gafgyt</strong>了攻击代码，支持HTTP,TCP,UDP等攻击。<pre><code>Command
-----------------------------------------
S    
T
U
KT
HTTP
</code></pre>
<a href="__GHOST_URL__/content/images/2019/12/mozi_atk.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_atk.png" class="kg-image"/></a></li>
<li>上报Bot信息，<code>[idp]</code>字段触发，上报的内容为Bot的ID，IP，PORT，文件名（全路径），网关，cpu架构。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_idp.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_idp.png" class="kg-image"/></a></li>
<li>执行指定URL的payload,<code>[dr]</code>字段触发。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_dr.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_dr.png" class="kg-image"/></a></li>
<li>从指定的URL更新，<code>[ud]</code>字段触发。关闭当前节点的网络连接和相关进程，从指定URL下载新版本，保存DHT节点,ID等数据，将它们做为参数提供给新版体使用。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_ud.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_ud.png" class="kg-image"/></a></li>
<li>执行系统或Bot自定义命令，<code>[rn]</code>字段触发。
<ul>
<li>系统命令<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_rnsys.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_rnsys.png" class="kg-image"/></a></li>
<li>自定义<strong>GET</strong>命令，将Bot ID发送给对端。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_rnget.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_rnget.png" class="kg-image"/></a></li>
<li>自定义<strong>run</strong>命令，执行对端下发的命令，并将结果回传。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_rnrun.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_rnrun.png" class="kg-image"/></a></li>
</ul>
</li>
</ul>
<h3 id="dht">DHT</h3>
<p>Ｍozi Botnet使用自己扩展的DHT协议构建p2p网络，这样做有俩个好处，一来使用标准的DHT能够快速组网，二来使用自己的扩展能够将有效payload的流量隐匿于海量的正常DHT流量中，躲避检测。Mozi使用8组公共节点以及Config文件的[nd]字段指定的节点作为bootstrap nodes。引导新节点加入其DHT网络。</p>
<ul>
<li>公共节点，样本内嵌</li>
</ul>
<pre><code>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
</code></pre>
<ul>
<li>Config文件中[nd]指定<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_nd.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_nd.png" class="kg-image"/></a></li>
</ul>
<h4 id="id">ID生成</h4>
<p>ID20字节，由样本内嵌的prefix(<em><strong>888888</strong></em>)或config文件[hp]指定的prefix，加随机生成的字串构成。</p>
<p><a href="__GHOST_URL__/content/images/2019/12/mozi_id.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_id.png" class="kg-image"/></a></p>
<h4 id="">结点识别</h4>
<p>为了快速区分流量，Mozi使用<code>1:v4:flag(4 bytes)</code>这样的标识来识别流量是否由其结点发出，<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_node.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_node.png" class="kg-image"/></a><br>
flag字节含义如下，</p>
<pre><code>flag(4 bytes)
----------------------------------------------
offset:
	0  -----random
	1  ----- hard-code(0x42) or from [ver]
    2  -----calc by algorithm
    3  -----calc by algorithm
</code></pre>
<p>第１个字节是随机产生的，第２个字节是硬编码的0x42或由config文件中[ver]字段指定。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_ver.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_ver.png" class="kg-image"/></a><br>
第3,４字节由算法得来，</p>
<pre><code>ver algorithm
----------------------------------------------
	int first,sec;
	string ver=&quot;\x31\x3a\x76\x34\x3a\x00\x00&quot;s;
	cout &lt;&lt; &quot;Please input the two number: (0x00-0xff)&quot; &lt;&lt; endl;
	cin.unsetf(ios::hex);
	cin &gt;&gt; hex &gt;&gt; first &gt;&gt; sec;
	ver[5] = char(first);
	ver[6] = char(sec);
	uint32_t va = 0;
	for(int i = 0; i &lt; 7; i++)
	{	
		uint32_t tmp = int(ver[i]);
		tmp = tmp &lt;&lt; 8;
		tmp ^= va;
		int rnd = 8;
	while (rnd--)
	{
		if ((tmp &amp; 0xffff) &gt; 0x8000)
		{
			tmp *= 2;
			tmp ^= 0xffff8005;
		}
		else
			tmp *= 2;
	}
	va = tmp&amp;0xffff;
	}
	cout  &lt;&lt; hex  &lt;&lt; &quot;Final &quot; &lt;&lt;  va &lt;&lt; endl;
</code></pre>
<blockquote>
<p>Please input the two number: (0x00-0xff)<br>
0x44 0x42<br>
Final 1f71<br>
输入0x44 0x42,得到<code>0x1f71</code>,和数据包里结果一致。</p>
</blockquote>
<h4 id="">网络请求</h4>
<p>Mozi节点收到的网络请求可以分成２大类，DHT请求和非DHT请求。依据前文所述的节点识别，DHT请求分为Mozi-DHT请求,非Mozi-DHT请求。Mozi支持ping,find_node,get_peers３种。对于非DHT请求，依据网络数据包长度大于99与否分成２种。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_net-1.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_net-1.png" class="kg-image"/></a></p>
<p>Mozi将不同的请求编号如下所示，不同的请求有不同的处理逻辑<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_query.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_query.png" class="kg-image"/></a></p>
<ul>
<li>编号２： ping ，DHT请求，按标准DHT流程处理直接回复pong。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_ping.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_ping.png" class="kg-image"/></a></li>
<li>编号3：find_node，DHT请求。</li>
<li>编号4：get_peers，DHT请求。<br>
Mozi 将<strong>find_node,get_peers</strong>合二为一，如果请求来自Mozi节点，有一定的概率把自身的Config内容发送给对方;如果来请求来自非Mozi节点，则按标准DHT的流程处理。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_getnode.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_getnode.png" class="kg-image"/></a></li>
</ul>
<pre><code>原始数据内容(节选前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&gt;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&quot;.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&lt;íá|
00000080  a1 c8 56 a3 cf 28 6b fa 14 06 1a 3e 3b 01 a0 e3  |¡ÈV£Ï(kú...&gt;;. ã|
加密的Config位于&quot;5:nodes624:&quot;之后，使用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&gt;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&amp;pu=http%3a%2f|

</code></pre>
<ul>
<li>编号5：announce_peer，不支持<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_ann.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_ann.png" class="kg-image"/></a></li>
<li>编号6：非DHT请求，数据包长&lt;99字节，当节点收到此请求，会将自身的config内容发送给请求方。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_6proc.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_6proc.png" class="kg-image"/></a></li>
<li>编号7：非DHT请求，数据包长&gt;99字节，当节点收到此请求，说明收到的数据为加密的Config文件，执行流程参照前文。<br>
<a href="__GHOST_URL__/content/images/2019/12/mozi_payload.png"><img src="__GHOST_URL__/content/images/2019/12/mozi_payload.png" class="kg-image"/></a></li>
</ul>
<h2 id="">处置建议</h2>
<p>我们建议用户及时更新补丁，并根据Mozi Botnet创建的进程，文件名以及HTTP,DHT网络连接特征，判断是否被感染，然后清理它的相关进程和文件。</p>
<p>相关安全和执法机构，可以邮件联系netlab[at]360.cn交流更多信息。</p>
<h2 id="">联系我们</h2>
<p>感兴趣的读者，可以在 <a href="https://twitter.com/360Netlab">twitter</a> 或者在微信公众号 360Netlab 上联系我们。</p>
<h2 id="ioclist">IoC list</h2>
<p>样本MD5:</p>
<pre><code>eda730498b3d0a97066807a2d98909f3
849b165f28ae8b1cebe0c7430f44aff3
</code></pre>
<!--kg-card-end: markdown-->
概览


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


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


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


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





样本传播


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


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


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





Vulnerability
Affected Aevice




Eir D1000 Wireless Router RCI
Eir D1000 Router


Vacron NVR RCE
Vacron NVR devices


CVE-2014-8361
Devices using the Realtek SDK


Netgear cig-bin Command Injection
Netgear R7000 and R6400


Netgear setup.cgi unauthenticated RCE
DGN1000 Netgear routers


JAWS Webserver unauthenticated shell command execution
MVPower DVR


CVE-2017-17215
Huawei Router HG532


HNAP SoapAction-Header Command Execution
D-Link Devices


CVE-2018-10561, CVE-2018-10562
GPON Routers


UPnP SOAP TelnetD Command Execution
D-Link Devices


CCTV/DVR Remote Code Execution
CCTV DVR





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





样本逆向分析


目前，Mozi Botnet已有３个版本，在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幻数对抗脱壳，Ｍozi使用了一种新颖的手法，将p_filesize&p_blocksize的值抹成了０。需要对upx源码做相应的patch才能脱壳。



常见功能


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


 * 单一实例，通过绑定本地端口实现
   
   
 * 修改进程名，换成sshd或dropbear以迷惑受害者
   
   
 * 流量阻断&放行，确保所用到的TCP,UDP端口，流量正常通过；
   
   
   
   
   
   阻断SSH，TELNET服务，防止Bot被其他人入侵。
   
   



执行特定任务


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





文件&指令验签


Ｍozi使用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如下



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


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命令，执行对端下发的命令，并将结果回传。
     
     
   



DHT


Ｍozi 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]指定
   
   


ID生成


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



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



第3,４字节由算法得来，


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节点收到的网络请求可以分成２大类，DHT请求和非DHT请求。依据前文所述的节点识别，DHT请求分为Mozi-DHT请求,非Mozi-DHT请求。Mozi支持ping,find_node,get_peers３种。对于非DHT请求，依据网络数据包长度大于99与否分成２种。




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




 * 编号２： 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


{"version":"0.3.1","atoms":[],"cards":[["markdown",{"markdown":"## 概览\n2019年09月03日我们捕获到一个可疑的的样本文件，大部分杀毒引擎将其识别为Gafgyt，但该样本和已知Gafgyt相似程度不高，只是复用了部分Gafgyt的代码。经过详细分析，我们确定这是Hajime之后，另一个基于DHT协议实现的P2P Botnet。根据其样本传播样本文件名称为`Mozi.m`、`Mozi.a`等特征我们将它命名为`Mozi` Botnet。\n\nMozi Botnet依赖DHT协议建立一个P2P网络，通过ECDSA384以及xor算法保证自身组件和P2P网络的完整性和安全性。样本通过Telnet弱口令和一些已知的漏洞利用蠕虫式传播。功能方面，Ｍozi僵尸网络中的各个节点的指令执行由Botnet Master下发的名为Config的Payload驱动，主要指令包括：\n- DDoS攻击\n- 收集Bot信息\n- 执行指定URL的payload\n- 从指定的URL更新样本\n- 执行系统或自定义命令\n\n其整体网络结构如下图所示：\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_flow-3.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_flow.m.png\" class=\"kg-image\"/></a>\n\n## 样本传播\n\nＭozi通过telnet弱口令和漏洞利用两种方式感染新设备。感染过程如下：\n- 当前Bot节点随机监听本地端口启动http服务提供样本下载或者接收Botnet Master下发的Config文件中的样本下载地址。用于为将来被感染的目标提供样本下载地址。\n- 当前Bot节点利用弱口令登录目标设备，echo方式写入下载器文件并运行，从当前Bot节点提供的样本下载地址下载样本文件。或者通过漏洞利用入侵目标，然后从当前Bot节点提供的样本下载地址取得样本文件。\n- 在被感染目标设备上运行Mozi Bot样本，加入Mozi P2P网络成为新的Mozi Bot节点并继续感染其他新的设备。\n\nMozi Botnet所利用的漏洞如下表所示：\n| Vulnerability | Affected Aevice |\n| ------------- | ---------------- |\n| [Eir D1000 Wireless Router RCI](https://www.exploit-db.com/exploits/40740) | Eir D1000 Router |\n| [Vacron NVR RCE](https://www.exploit-db.com/exploits/6864/) | Vacron NVR devices |\n| [CVE-2014-8361](https://www.exploit-db.com/exploits/37169/) | Devices using the Realtek SDK|\n| [Netgear cig-bin Command Injection](https://www.exploit-db.com/exploits/41598/)| Netgear R7000 and R6400 |\n| [Netgear setup.cgi unauthenticated RCE](https://www.exploit-db.com/exploits/43055) | DGN1000 Netgear routers |\n| [JAWS Webserver unauthenticated shell command execution](https://www.exploit-db.com/exploits/41471/) | MVPower DVR | \n| [CVE-2017-17215](https://www.exploit-db.com/exploits/43414/) | Huawei Router HG532  |\n| [HNAP SoapAction-Header Command Execution](https://www.exploit-db.com/exploits/37171/) | D-Link Devices |\n| [CVE-2018-10561, CVE-2018-10562](https://www.exploit-db.com/exploits/44576/) | GPON Routers |\n| [UPnP SOAP TelnetD Command Execution](https://www.exploit-db.com/exploits/28333/) | D-Link Devices |\n| [CCTV/DVR Remote Code Execution](https://www.exploit-db.com/exploits/39596/) | CCTV DVR |\n\n当前我们暂时还不清楚该Botnet的规模，但从我们已经有的数据看，该Botnet的感染量一直在持续增长。下图为我们蜜罐收集到的Mozi bot感染日志。\n![fssfsadfsdff](__GHOST_URL__/content/images/2019/12/fssfsadfsdff.png)\n\n## 样本逆向分析\n目前，Mozi Botnet已有３个版本，在telnet传播方面略有不同，其它方面非常接近，\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_versioin.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_versioin.png\" class=\"kg-image\"/></a>\n下文将以最新版本v2为主，同时也会穿插早期版本(样本md5: `849b165f28ae8b1cebe0c7430f44aff3`)，从传播方式，Config结构，DHT网络等方面剖析Mozi的技术细节。\n\n### 样本信息\n> MD5:eda730498b3d0a97066807a2d98909f3\n>\n> ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, stripped\n>\n> Packer: NO\n>\n> Library:uclibc\n>\n> Version: v2\n\n值得一提的是，第一个版本中Mozi 采用了upx加壳。相较与常见的更改upx幻数对抗脱壳，Ｍozi使用了一种新颖的手法，将p_filesize&p_blocksize的值抹成了０。需要对upx源码做相应的patch才能脱壳。\n\n### 常见功能\n\nＭozi在主机行为层面并没太多特色，复用了Gafgyt的代码，实现了许多常见功能，如单一实例，修改进程名，网络流量放行。\n\n- 单一实例，通过绑定本地端口实现\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_bind.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_bind.png\" class=\"kg-image\"/></a>\n- 修改进程名，换成sshd或dropbear以迷惑受害者\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_setname.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_setname.png\" class=\"kg-image\"/></a>\n- 流量阻断&放行，确保所用到的TCP,UDP端口，流量正常通过；\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_iptables.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_iptables.png\" class=\"kg-image\"/></a>\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_ssh.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_ssh.png\" class=\"kg-image\"/></a>\n阻断SSH，TELNET服务，防止Bot被其他人入侵。\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_forb.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_forb.png\" class=\"kg-image\"/></a>\n\n\n### 执行特定任务\n\nMozi通过DHT协议建立p2p网络后，同步config文件，根据config文件里的指令，开始相应的任务。在P2P网络中，节点是不可信的，任何人都能够以极低成本的伪造一个Mozi节点。为保证Mozi网络的完全可控，不被他人窃取，Mozi需要对每一个同步到的config做签名验签，只有能够通过了签名验签才能被Mozi节点接受，并执行。\n\n\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_configproc.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_configproc.png\" class=\"kg-image\"/></a>\n#### 文件&指令验签\n\nＭozi使用ECDSA384算法验证文件及指令的合法性，每个样本都集成了俩个xor加密的的公钥，分别用于验签加密和解密后的config文件。\n```\n xor key:4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E\n------------------------------------------------------------------\nxored publickey A \n\t4C B3 8F 68 C1 26 70 EB 9D C1 68 4E D8 4B 7D 5F \n\t69 5F 9D CA 8D E2 7D 63 FF AD 96 8D 18 8B 79 1B \n\t38 31 9B 12 69 73 A9 2E B6 63 29 76 AC 2F 9E 94 A1\t\nafter decryption: \n\t02 d5 d5 e7 41 ee dc c8 10 6d 2f 48 0d 04 12 21 \n\t27 39 c7 45 0d 2a d1 40 72 01 d1 8b cd c4 16 65 \n\t76 57 c1 9d e9 bb 05 0d 3b cf 6e 70 79 60 f1 ea ef\n-------------------------------------------------------------------\nxored publickey B\n\t4C A6 FB CC F8 9B 12 1F 49 64 4D 2F 3C 17 D0 B8 \n\tE9 7D 24 24 F2 DD B1 47 E9 34 D2 C2 BF 07 AC 53 \n\t22 5F D8 92 FE ED 5F A3 C9 5B 6A 16 BE 84 40 77 88\nafter decryption:\n\t02 c0 a1 43 78 53 be 3c c4 c8 0a 29 e9 58 bf c6 \n\ta7 1b 7e ab 72 15 1d 64 64 98 95 c4 6a 48 c3 2d \n\t6c 39 82 1d 7e 25 f3 80 44 f7 2d 10 6b cb 2f 09 c6\n```\n#### Config文件\n每个样本集成了一个xor加密的初始的config文件，长度为528字节,其结构为**data(428 bytes),sign(96 bytes),flag(4 bytes)**，sign字段为数字签名，flag字段控制config文件更新与否。config文件里有许多控制字段，Mozi节点收到config后，解析字段内容，执行相应的子任务。\n原始config文件如下\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_enconfig.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_enconfig.png\" class=\"kg-image\"/></a>\n解密过程如下图所示，其中xor key为\n```\n4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E\n```\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_xorproc.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_xorproc.png\" class=\"kg-image\"/></a>\n解密后的config如下\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_denconfig.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_denconfig.png\" class=\"kg-image\"/></a>\n支持的关键字如下，可以分成辅助，控制，子任务３大类。\n```\n1：辅助字段，用于信息说明\n[cpu]　　cpu arch or os\n[cpux]  cpu arch or os\n[ss]\tbot role\n[ssx]\tbot role\n[nd] \tnew node info which help to join DHT\n2:控制字段，用于更新节点的数据\n[ver] \tverify \n[sv]\tupdate  Config\n[hp] \tDHT id prefix\n[dip]   URL or ip:port list which can get Mozi sample\n3:子任务字段，用于开启相应的子任务\n[atk]\tDDOS attack\n[ud] \tupdate\n[dr] \texec payload from specific URL \n[rn] \texec system or customized cmds\n[idp] \treport bot info\n```\n#### Bot功能\n- DDOS，``[atk]``字段触发，复用**Gafgyt**了攻击代码，支持HTTP,TCP,UDP等攻击。\n  ```\n  Command\n  -----------------------------------------\n  S    \n  T\n  U\n  KT\n  HTTP\n  ```\n  <a href=\"__GHOST_URL__/content/images/2019/12/mozi_atk.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_atk.png\" class=\"kg-image\"/></a>\n- 上报Bot信息，``[idp]``字段触发，上报的内容为Bot的ID，IP，PORT，文件名（全路径），网关，cpu架构。\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_idp.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_idp.png\" class=\"kg-image\"/></a>\n- 执行指定URL的payload,``[dr]``字段触发。\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_dr.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_dr.png\" class=\"kg-image\"/></a>\n- 从指定的URL更新，``[ud]``字段触发。关闭当前节点的网络连接和相关进程，从指定URL下载新版本，保存DHT节点,ID等数据，将它们做为参数提供给新版体使用。\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_ud.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_ud.png\" class=\"kg-image\"/></a>\n- 执行系统或Bot自定义命令，``[rn]``字段触发。\n  - 系统命令\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_rnsys.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_rnsys.png\" class=\"kg-image\"/></a>\n  - 自定义**GET**命令，将Bot ID发送给对端。\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_rnget.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_rnget.png\" class=\"kg-image\"/></a>\n  - 自定义**run**命令，执行对端下发的命令，并将结果回传。\n    <a href=\"__GHOST_URL__/content/images/2019/12/mozi_rnrun.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_rnrun.png\" class=\"kg-image\"/></a>\n### DHT\n\nＭozi Botnet使用自己扩展的DHT协议构建p2p网络，这样做有俩个好处，一来使用标准的DHT能够快速组网，二来使用自己的扩展能够将有效payload的流量隐匿于海量的正常DHT流量中，躲避检测。Mozi使用8组公共节点以及Config文件的[nd]字段指定的节点作为bootstrap nodes。引导新节点加入其DHT网络。\n- 公共节点，样本内嵌\n```\ndht.transmissionbt.com:6881\nrouter.bittorrent.com:6881\nrouter.utorrent.com:6881\nbttracker.debian.org:6881\n212.129.33.59:6881\n82.221.103.244:6881\n130.239.18.159:6881\n87.98.162.88:6881\n```\n- Config文件中[nd]指定\n<a href=\"__GHOST_URL__/content/images/2019/12/mozi_nd.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_nd.png\" class=\"kg-image\"/></a>\n#### ID生成\n\nID20字节，由样本内嵌的prefix(***888888***)或config文件[hp]指定的prefix，加随机生成的字串构成。\n\n\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_id.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_id.png\" class=\"kg-image\"/></a>\n\n#### 结点识别\n为了快速区分流量，Mozi使用``1:v4:flag(4 bytes)``这样的标识来识别流量是否由其结点发出，\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_node.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_node.png\" class=\"kg-image\"/></a>\nflag字节含义如下，\n```\nflag(4 bytes)\n----------------------------------------------\noffset:\n\t0  -----random\n\t1  ----- hard-code(0x42) or from [ver]\n    2  -----calc by algorithm\n    3  -----calc by algorithm\n```\n第１个字节是随机产生的，第２个字节是硬编码的0x42或由config文件中[ver]字段指定。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_ver.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_ver.png\" class=\"kg-image\"/></a>\n第3,４字节由算法得来，\n```\nver algorithm\n----------------------------------------------\n\tint first,sec;\n\tstring ver=\"\\x31\\x3a\\x76\\x34\\x3a\\x00\\x00\"s;\n\tcout << \"Please input the two number: (0x00-0xff)\" << endl;\n\tcin.unsetf(ios::hex);\n\tcin >> hex >> first >> sec;\n\tver[5] = char(first);\n\tver[6] = char(sec);\n\tuint32_t va = 0;\n\tfor(int i = 0; i < 7; i++)\n\t{\t\n\t\tuint32_t tmp = int(ver[i]);\n\t\ttmp = tmp << 8;\n\t\ttmp ^= va;\n\t\tint rnd = 8;\n\twhile (rnd--)\n\t{\n\t\tif ((tmp & 0xffff) > 0x8000)\n\t\t{\n\t\t\ttmp *= 2;\n\t\t\ttmp ^= 0xffff8005;\n\t\t}\n\t\telse\n\t\t\ttmp *= 2;\n\t}\n\tva = tmp&0xffff;\n\t}\n\tcout  << hex  << \"Final \" <<  va << endl;\n```\n\n>Please input the two number: (0x00-0xff)\n>0x44 0x42                                       \n>Final 1f71            \n输入0x44 0x42,得到``0x1f71``,和数据包里结果一致。\n\n\n#### 网络请求\n\nMozi节点收到的网络请求可以分成２大类，DHT请求和非DHT请求。依据前文所述的节点识别，DHT请求分为Mozi-DHT请求,非Mozi-DHT请求。Mozi支持ping,find_node,get_peers３种。对于非DHT请求，依据网络数据包长度大于99与否分成２种。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_net-1.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_net-1.png\" class=\"kg-image\"/></a>\n \nMozi将不同的请求编号如下所示，不同的请求有不同的处理逻辑\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_query.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_query.png\" class=\"kg-image\"/></a>\n- 编号２： ping ，DHT请求，按标准DHT流程处理直接回复pong。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_ping.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_ping.png\" class=\"kg-image\"/></a>\n- 编号3：find_node，DHT请求。\n- 编号4：get_peers，DHT请求。\n  Mozi 将**find_node,get_peers**合二为一，如果请求来自Mozi节点，有一定的概率把自身的Config内容发送给对方;如果来请求来自非Mozi节点，则按标准DHT的流程处理。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_getnode.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_getnode.png\" class=\"kg-image\"/></a>\n```\n原始数据内容(节选前128字节):\n00000000  64 31 3a 72 64 32 3a 69 64 32 30 3a 38 38 38 38  |d1:rd2:id20:8888|\n00000010  38 38 38 38 b7 96 a0 9e 66 e1 71 98 e5 4d 3e 69  |8888·. .fáq.åM>i|\n00000020  35 3a 6e 6f 64 65 73 36 32 34 3a 15 15 29 d2 f3  |5:nodes624:..)Òó|\n00000030  a3 f7 0c fe df 1a 5d bd 3f 32 46 76 5e 62 b7 b8  |£÷.þß.]½?2Fv^b·¸|\n00000040  f0 94 78 a2 c4 37 5b 8e 2c 00 0b 20 12 07 e7 f4  |ð.x¢Ä7[.,.. ..çô|\n00000050  bc dc 19 a2 83 2e 67 fb 7a 5e 50 22 07 75 e8 ef  |¼Ü.¢..gûz^P\".uèï|\n00000060  f9 93 4a e9 91 75 36 e4 76 57 4b 7c 51 7c ff f5  |ù.Jé.u6ävWK|Q|ÿõ|\n00000070  f5 c4 57 f9 dc 62 35 b4 6a 5d 18 6b 54 3c ed e1  |õÄWùÜb5´j].kT<íá|\n00000080  a1 c8 56 a3 cf 28 6b fa 14 06 1a 3e 3b 01 a0 e3  |¡ÈV£Ï(kú...>;. ã|\n加密的Config位于\"5:nodes624:\"之后，使用xor key(4E 66 5A 8F 80 C8 AC 23 8D AC 47 06 D5 4F 6F 7E) 解密后:\n原始数据部分：\n00000000  64 31 3a 72 64 32 3a 69 64 32 30 3a 38 38 38 38  |d1:rd2:id20:8888|\n00000010  38 38 38 38 b7 96 a0 9e 66 e1 71 98 e5 4d 3e 69  |8888·. .fáq.åM>i|\n00000020  35 3a 6e 6f 64 65 73 36 32 34 3a \t\t\t\t   |5:nodes624:\nConfig部分:\n00000000  5b 73 73 5d 73 6b 5b 2f 73 73 5d 5b 68 70 5d 38  |[ss]sk[/ss][hp]8|\n00000010  38 38 38 38 38 38 38 5b 2f 68 70 5d 5b 63 6f 75  |8888888[/hp][cou|\n00000020  6e 74 5d 68 74 74 70 3a 2f 2f 69 61 2e 35 31 2e  |nt]http://ia.51.|\n00000030  6c 61 2f 67 6f 31 3f 69 64 3d 32 30 31 39 38 35  |la/go1?id=201985|\n00000040  32 37 26 70 75 3d 68 74 74 70 25 33 61 25 32 66  |27&pu=http%3a%2f|\n\n```\n\n- 编号5：announce_peer，不支持\n   <a href=\"__GHOST_URL__/content/images/2019/12/mozi_ann.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_ann.png\" class=\"kg-image\"/></a>\n- 编号6：非DHT请求，数据包长<99字节，当节点收到此请求，会将自身的config内容发送给请求方。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_6proc.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_6proc.png\" class=\"kg-image\"/></a>\n- 编号7：非DHT请求，数据包长>99字节，当节点收到此请求，说明收到的数据为加密的Config文件，执行流程参照前文。\n <a href=\"__GHOST_URL__/content/images/2019/12/mozi_payload.png\"><img src=\"__GHOST_URL__/content/images/2019/12/mozi_payload.png\" class=\"kg-image\"/></a>\n## 处置建议\n\n我们建议用户及时更新补丁，并根据Mozi Botnet创建的进程，文件名以及HTTP,DHT网络连接特征，判断是否被感染，然后清理它的相关进程和文件。\n\n相关安全和执法机构，可以邮件联系netlab[at]360.cn交流更多信息。\n\n## 联系我们\n\n感兴趣的读者，可以在 [twitter](https://twitter.com/360Netlab) 或者在微信公众号 360Netlab 上联系我们。\n\n## IoC list\n\n样本MD5:\n\n```\neda730498b3d0a97066807a2d98909f3\n849b165f28ae8b1cebe0c7430f44aff3\n```\n\n\n\n"}]],"markups":[],"sections":[[10,0],[1,"p",[]]],"ghostVersion":"3.0"}