HNS Botnet 最近活动更新
作者:Rootkiter, yegenshen
HNS 僵尸网络(Hide and Seek) 是最初由 BitDefender 于今年 1月 报告 的一个IoT僵尸网络。在那份报告中研究人员指出,HNS 会利用CVE-2016-10401、其他漏洞以及Telnet弱口令投入恶意代码,有执行任意指令和盗取用户信息的恶意行为,传播方式类似蠕虫,感染规模在1月23日至1月24期间快速增长到超过32k。并且,HNS内部通过P2P 机制通信,这是我们所知继 hajime之后第二个利用P2P通信的IoT僵尸网络。
P2P类的僵尸网络很难被根除,HNS 僵尸网络也是如此。在过去的几个月中 HNS 僵尸网络一直在持续更新,我们看到其更新活动包括:
- 增加了对 AVTECH全部设备(网络摄像头、网络录像设备)、CISCO Linksys路由器、JAWS/1.0 Web服务器、Apache CouchDB、OrientDB的漏洞利用;加上原始报告中提到的2种,目前HNS已经支持7种漏洞利用方式;
- 内置的P2P节点地址增加到了171 条;
- 另外,我们观察到HNS 僵尸网络增加了 cpuminer 挖矿程序的下载,但是尚未观察到其正常运行。结合HNS在针对couchDB和OrientDB,给人感觉 HNS 僵尸网络的作者正在工作,以谋求通过挖矿获利。
特别值得一提的是,随着失陷的 OrientDB 和 CouchDB 数据库服务器加入其僵尸军团,HNS已经不再仅仅是 IoT 僵尸网络,而是一个跨平台的僵尸网络了。
核心样本
我们分析了以下样本:
c1816d141321276cd4621abcd280ee40 #hns x86
0770ff1a6e90eb5d083c16452e45abd5 #hns arm
30ebaaeb61a4ecae3ade7d1d4e5c7adb #hns_miner
网络扫描和漏洞利用
HNS 僵尸网络通过网络扫描寻找潜在受害者。HNS在扫描过程中借鉴了Mirai的扫描机制,也共享了mirai僵尸网络的一些扫描特点。
扫描的目标端口包括:固定的 80/8080/2480/5984/23,以及随机端口。
这些端口上常见运行的服务是:
23 Telnet
80 HTTP Web Service
2480 OrientDB
5984 CouchDB
8080 HTTP Web Service
RandomPort NA
在上述端口上,HNS会尝试利用下面的漏洞利用将其自身投入。其中 1 和 2 是最初BitDefender报告中提及的,其它的利用均为HNS后续增加:
- TPLink-Routers RCE
- Netgear RCE
- 新增:AVTECH RCE
- 新增:CISCO Linksys Router RCE
- 新增:JAW/1.0 RCE
- 新增:OrientDB RCE
- 新增:CouchDB RCE
171个内置的P2P节点
作为P2P 型僵尸网络,HNS获取通信对端节点的方式下面 3 种。其中第 2、3 两项在 bitdefender 的文章中已经有介绍。
- 样本内置:内置了 171 个对端节点信息;
- 运行参数传递;
- 询问对端节点;
上述 171个节点,在 HNS 的上线和交互过程中均会参与。
上线过程
HNS 无参数启动后会出现大量的 UDP 上线请求包。观察这些请求包的目标IP地址可知,大部分是随机生成的,少量是由内置节点列表决定的。样本中内置节点的部分信息如下图所示,全部171个节点的信息见 IoC 部分。
交互过程
HNS 在节点之间的交互过程中有以下特征:
- HNS 的上线包是一个长度和内容均随机的 UDP 请求包,这个包特征并不明显。明显的点在
于上游节点的回包是一个长度为 2 且首字节为大写字母’O’的回包。另外回包的第二字节,其实是从请求包计算出的一个校验值,所以该方法也可用于 HNS 感染判定。详细校验算法见附录。 - HNS 在加入 P2P 网络后,需要较频繁的进行地址同步操作,以确保不会出现节点走失的情况。
这个同步操作具有较强的网络特征。首先,下游节点会向上游节点发送一个长度 1 内容为“~”的请求包,随后上游节点会回复一个长度为 8 首字母为“^”的回包。 - HNS 在指令获取及文件获取过程中,会出现大量的交互数据包。请求包长度 69 首字母“y”,
回复包(满载拆包分发状态)长度 261 首字母“Y”。
服务请求包的回包算法如下,基于 python 2.7
当发送如下请求包时:
data_pointer = "5b 02 d7 ff 52 02 61 e9 a5 7e 0b 07 c5 43 5b".replace("","").decode('hex')
上游节点的回包应为:
ack="4f b6".replace(" ","").decode('hex')
其中 chr(0x4f) 固定,chr(0xb6)的计算方法如下:
def calc_crc(data_pointer):
data_len_1 = len(data_pointer)-1
tmp = 88
for i in range(0,data_len_1):
tmp += ord(data_pointer[i])
tmp = tmp &0xff
tmp2 = tmp^0x3d
print hex(tmp2),hex(ord(data_pointer[data_len_1]))
if(tmp2 == ord(data_pointer[data_len_1])):
return (2*tmp2&0xfe)
return -1;
联系我们
感兴趣的读者,可以在 twitter 或者在微信公众号 360Netlab 上联系我们。
IoC
Malware Sample md5
c1816d141321276cd4621abcd280ee40 #hns x86
0770ff1a6e90eb5d083c16452e45abd5 #hns arm
30ebaaeb61a4ecae3ade7d1d4e5c7adb #hns_miner
All 171 hard coded P2P peer address list is here.