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后续增加:

  1. TPLink-Routers RCE
  2. Netgear RCE
  3. 新增AVTECH RCE
  4. 新增CISCO Linksys Router RCE
  5. 新增JAW/1.0 RCE
  6. 新增OrientDB RCE
  7. 新增CouchDB RCE

171个内置的P2P节点

作为P2P 型僵尸网络,HNS获取通信对端节点的方式下面 3 种。其中第 2、3 两项在 bitdefender 的文章中已经有介绍。

  1. 样本内置:内置了 171 个对端节点信息;
  2. 运行参数传递;
  3. 询问对端节点;

上述 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.