Mirai物联网僵尸攻击深度解析

美国大面积的网络瘫痪事件

2016年10月21日,美国东海岸地区遭受大面积网络瘫痪,其原因为美国域名解析服务提供商Dyn公司当天受到强力的DDoS攻击所致。Dyn公司称此次DDoS攻击涉及千万级别的IP地址(攻击中UDP/DNS攻击源IP几乎皆为伪造IP,因此此数量不代表僵尸数量),其中部分重要的攻击来源于IOT设备,攻击活动从上午7:00(美国东部时间)开始,直到下午1:00才得以缓解,黑客发动了三次大规模攻击,但是第三次攻击被缓解未对网络访问造成明显影响。

此次攻击是一次跨越多个攻击向量以及互联网位置的复杂攻击,Flashpoint与Akamai的分析确认攻击流量的来源之一是感染了Mirai僵尸的设备,因为部分离散攻击IP地址来自Mirai僵尸网络。

Mirai僵尸在黑客Anna-senpai公布源码后,被黑客利用并快速的形成了大量的僵尸网络,其中部分黑客参与了此次攻击,目前不排除黑客Anna-senpai也参与了本次攻击,其拥有大概30万-40万的Mirai僵尸肉鸡。

启明星辰ADLab分析发现,Mirai僵尸借鉴了QBOT的部分技术,并在扫描技术、感染技术等方面做了优化,大大提升了感染速度。

Mirai僵尸重要事件回溯

此次针对Dyn域名服务器的攻击让古老的DDoS技术再一次震撼了互联网,其中最引人注目是物联网僵尸网络的参与,物联网概念流行了近7年,大量的智能设备正不断地接入了互联网,其安全脆弱性、封闭性等特点成为黑客争相夺取的资源。目前已经存在大量针对物联网的僵尸网络,如QBOT、Luabot、Bashlight、Zollard、Remaiten、KTN-RM等等,并且越来越多的传统僵尸也开始加入到这个物联网行列中。

通过启明星辰ADLab的调查分析,Mirai僵尸网络有两次攻击史,其中一次是针对安全新闻工作者Brian Krebs的网站,攻击流量达到665Gbps。

Brian

另一次是针对法国网站主机OVH的攻击,其攻击流量达到1.1Tbps,打破了DDoS攻击流量历史记录。

2016年9月30日,黑客Anna-senpai公开发布Mirai僵尸源码。其公布源码的目的一则是发现有关机构正在清理其掌控的僵尸设备;二则是为了让更多的黑客使用该僵尸进行扩散,掩人耳目,隐藏自己的踪迹。

OVH

Mirai僵尸重要事件回顾

1.2016年8月31日,逆向分析人员在malwaremustdie博客上公布mirai僵尸程序详细逆向分析报告,此举公布的C&C而惹怒黑客Anna-senpai。
2.2016年9月20日,著名的安全新闻工作者Brian Krebs的网站KrebsOnSecurity.com受到大规模的DDOS攻击,其攻击峰值达到665Gbps,Brian Krebs推测此次攻击由Mirai僵尸发动。
3.2016年9月20日,Mirai针对法国网站主机OVH的攻击突破DDoS攻击记录,其攻击量达到1.1Tpbs,最大达到1.5Tpbs4.2016年9月30日,Anna-senpai在hackforums论坛公布mirai源码,并且嘲笑之前逆向分析人员的错误分析。
5.2016年10月21日,美国域名服务商Dyn遭受大规模DDoS攻击,其中重要的攻击源确认来自于Mirai僵尸。

在2016年10月初,Imperva Incapsula的研究人员通过调查到的49,657个感染设备源分析发现,其中主要感染设备有CCTV摄像头、DVRs以及路由器。根据这些调查的设备IP地址发现其感染范围跨越了164个国家或地区,其中感染量最多的是越南、巴西、美国、中国大陆和墨西哥。

地区分布

直到2016年10月26日,我们通过Mirai特征搜索shodan发现,当前全球感染Mirai的设备已经超过100万台,其中美国感染设备有418,592台,中国大陆有145,778台,澳大利亚94,912台,日本和中国香港分别为47,198和44,386台。

分布

在该地图中颜色越深,代表感染的设备越多,可以看出感染Mirai最多的几个国家有美国、中国和澳大利亚。

Mirai源码分析Mirai源码是2016年9月30日由黑客Anna-senpai在论坛上公布,其公布在github上的源码被star了2538次,被fork了1371次。

Mirai通过扫描网络中的Telnet等服务来进行传播,实际感染到设备bot并不充当感染角色,其感染通过黑客配置服务来实施,这个服务被称为Load。黑客的另外一个服务器C&C服务主要用于下发控制指令,对目标进行实施攻击。

通过我们对僵尸源码的分析发现,该僵尸具备如下特点:

(1)黑客服务端实施感染,而非僵尸自己实施感染。

(2)采用高级SYN扫描,扫描速度提升30倍以上,提高了感染速度。

(3)强制清除其他主流的IOT僵尸程序,干掉竞争对手,独占资源。比如清除QBOT、Zollard、Remaiten Bot、anime Bot以及其他僵尸。

(4)一旦通过Telnet服务进入,便强制关闭Telnet服务,以及其他入口如:SSH和web入口,并且占用服务端口防止这些服务复活。

(5)过滤掉通用电气公司、惠普公司、美国国家邮政局、国防部等公司和机构的IP,防止无效感染。

(6)独特的GRE协议洪水攻击,加大了攻击力度。

Mirai感染示意图:

Mirai感染示意图

上图简单显示了Mirai僵尸的感染过程,与普通僵尸感染不同的是,其感染端是通过黑客服务端实施的,而不是靠bot来实施感染。

感染到设备端的 bot程序通过随机策略扫描互联网上的设备,并会将成功猜解的设备用户名、密码、IP地址,端口信息以一定格式上传给sanListen,sanLiten解析这些信息后交由Load模块来处理,Load通过这些信息来登录相关设备对设备实施感染,感染方式有echo方式、wget方式和tftp方式。这三种方式都会向目标设备推送一个具有下载功能的微型模块,这个模块被传给目标设备后,命名为dvrHelper。最后,dvrHelper远程下载bot执行,bot再次实施Telnet扫描并进行密猜解,由此周而复始的在网络中扩散。这种感染方式是极为有效的,Anna-senpai曾经每秒会得到500个成功爆破的结果。

一、bot分析

bot是mirai僵尸的攻击模块,其主要实现对网络服务设备(扫描过程不只针对IOT设备,只要开启Telnet服务的网络设备均不会放过)的Telnet服务的扫描并尝试进行暴力破解,其会将成功破解的设备ip地址、端口、用户名、密码等信息发送给黑客配置的服务器。并且同时接收C&C服务器的控制命令对目标发动攻击。

1、IOT设备防重启

由于Mirai的攻击目标主要设计来针对IOT设备,因此其无法将自身写入到设备固件中,只能存在于内存中。所以一旦设备重启,Mirai的bot程序就会消失。为了防止设备重启,Mirai向看门狗发送控制码0x80045704来禁用看门狗功能。

IOT

通常在嵌入式设备中,固件会实现一种叫看门狗(watchdog)的功能,有一个进程会不断的向看门狗进程发送一个字节数据,这个过程叫喂狗。如果喂狗过程结束,那么设备就会重启,因此为了防止设备重启,Mirai关闭了看门狗功能。这种技术常常被广泛应用于嵌入式设备的攻击中,比如曾经的海康威视漏洞(CVE-2014-4880)攻击代码中就采用过这种防重启技术。

这里有个小插曲,2016年8月31日,一位逆向分析人员将此代码判定错误,认为这是为了做延时而用,黑客Anna-senpai在Hackforums论坛公布源码时嘲笑并斥责了该逆向分析人员的错误。

2、进程名隐藏

Mirai为了防止进程名被暴露,在一定程度上做了隐藏,虽然这种隐藏并不能起到很好的作用。Mirai的具体做法是将字符串进行了随机化。

随机名

3、防止多实例运行

Mirai同大多数恶意代码一样,需要一种互斥机制防止同一个设备多个实例运行。但Mirai采用的手段有所不同,其通过开启48101端口来防止多个实例运行,具体做法是通过绑定和监听此端口,如果失败,便会关闭已经开启此端口的进程确保只有一个实例运行。这个特点是检测网络设备中是否存在Mirai的最高效的检测方法。

监听

4、重绑定技术防止外来者抢占资源

Mirai有一个特点就是具有排他性,设备一旦感染,其会通过端口来关闭Telnet(23)、SSH(22,编译时可选删除项)、HTTP(80,编译时可选删除项)服务并且会阻止这些服务进行重启,其主要实现方法是通过kill强制关闭这三个服务进程,并强行占用这些服务开启时所需要的端口。此举Mirai既可以防止设备被其他恶意软件感染,也可以防止安全人员从外部访问该设备,提高Mirai的取证难度。此功能实现在killer.c文件中。

Telnet服务的重绑定实现如下图,SSH和HTTP服务采用类似的方式实现。

ssh

SSH服务的重绑定实现:

ssh进程

HTTP服务的重绑定实现:

http服务

通过对实际样本的分析我们发现,大部分黑客并没有对SSH和HTTP进行重绑定操作,绝大部分都只针对于Telnet服务进行了重绑定。

5、干掉竞争对手,独占资源

Mirai会通过一种 memory scraping的技术干掉设备中的其他恶意软件,其具体做法是搜索内存中是否存在QBOT特征、UPX特征、Zollard蠕虫特征、Remaiten bot特征来干掉对手,以达到独占资源的目的。

zollard

此外,Mirai如果发现anime恶意软件,同样也会强行干掉它。

anime

6、可感染设备探测

Mirai僵尸随机扫描网络中IOT设备的Telnet服务并通过预植的用户名密码进行暴力破解,然后将扫描得到的设备IP地址、端口、设备处理器架构等信息回传给Load服务器。这里要注意的是,Mirai的随机扫描是有一个过滤条件的,其中比较有意思就是他会过滤掉通用电气公司、惠普公司、美国国家邮政局、国防部等公司和机构的IP地址。

可感染

Mirai僵尸中内置有60余个用户名和密码,其中内置的用户名和密码是加密处理过的,加密算法是通过简单的单字节多次异或实现,其密钥为0xDEADBEEF, 解密密钥为0xEFBEADDE。

密钥

Mirai使用高级SYN扫描技术对网络中的设备进行扫描破解,其速度僵尸程序QBOT所采用的扫描技术快80倍,资源消耗减少至少达20倍。因此具备强大的扫描感染能力,黑客在收集肉鸡过程中,曾经每秒可新增500个IOT设备。

Telnet服务扫描实现如下:

Telnet

当Mirai扫描到Telnet服务时,会连接Telnet并进行暴力登录尝试。Mirai首先会使用内置的用户名和密码尝试登录,之后通过发送一系列命令来判定登录成功与否。如果成功则试图进行一些操作,比如开启shell等操作,其发送的命令被初始化在一个Table中,如下表所示:

命令操作类型 Index 有效? 功能描述
TABLE_SCAN_CB_DOMAIN 18 yes domain to connect to
TABLE_SCAN_CB_PORT 19 yes Port to connect to
TABLE_SCAN_SHELL 20 yes ‘shell’ to enable shell access
TABLE_SCAN_ENABLE 21 yes ‘enable’ to enable shell access
TABLE_SCAN_SYSTEM 22 yes ‘system’ to enable shell access
TABLE_SCAN_SH 23 yes ‘sh’ to enable shell access
TABLE_SCAN_QUERY 24 yes echo hex string to verify login
TABLE_SCAN_RESP 25 yes utf8 version of query string
TABLE_SCAN_NCORRECT 26 yes ‘ncorrect’ to fast-check for invalid password
TABLE_SCAN_PS 27 no “/bin/busybox ps”
TABLE_SCAN_KILL_9 28 no “/bin/busybox kill -9 “

以上表格中只有TABLE_SCAN_PS和TABLE_SCAN_KILL_9进行了初始化而未对目标设备进行预执行操作。从20到26的操作均是在发送用户名和密码后的登录验证操作。其中TABLE_SCAN_CB_DOMAIN和TABLE_SCAN_CB_PORT为黑客配置的Load服务器,该服务器用于获取有效的Telnet扫描结果,扫描结果中包含IP地址、端口、Telnet用户名和密码等信息。发送信息的格式如下:

zero(1个字节) IP地址(4bytes) 端口(2bytes) 用户名长度(4bytes) 用户名(muti-bytes) 密码长度(4bytes) 密码(muti-bytes)

7、连接C&C,等候发动攻击

Mirai的攻击类型包含UDP攻击、TCP攻击、HTTP攻击以及新型的GRE攻击。其中,GRE攻击就是著名安全新闻工作者Brian Krebs的网站KrebsOnSecurity.com遭受的主力攻击形式,攻击的初始化代码如下:

UDP

C&C会被初始化在一张表中,当Mirai回连C&C时,会从表中取出C&C进行连接。

C&C

连接C&C成功后,Mirai会进行上线,其上线过程非常简单,自身简单向C&C发送4个字节的0。

上线

接下来会等候C&C的控制命令,司机对目标发动攻击。对于接受控制命令处做了一些处理,比如首先会进行试读来做预处理(控制指令长度判定等等),最后才会接受完整的控制命令。

当接受到控制命令后,Mirai对控制命令做解析并且执行。控制命令格式如下:

type Attackstruct {

Duration   uint32

Type       uint8

Targets    map[uint32]uint8    //Prefix/netmask

Flags      map[uint8]string    // key=value

}

其中,前4个字节为攻击时长,接下来的4个字节为攻击类型(攻击ID),然后是攻击目标,攻击目标格式如下:

目标数(4个字节) IP地址(4个字节) MASK(一个字节) IP地址(4个字节) MASK(一个字节) IP地址….MASK…

最后是Flags,Flag是一系列的键值对数据,结构类似于攻击目标的格式。下面列出Mirai僵尸网络攻击功能列表。

攻击类型(32位) 类型值 攻击函数
ATK_VEC_UDP 0 attack_udp_generic
ATK_VEC_VSE 1 attack_udp_vse
ATK_VEC_DNS 2 attack_udp_dns
ATK_VEC_UDP_PLAIN 9 attack_udp_plain
ATK_VEC_SYN 3 attack_tcp_syn
ATK_VEC_ACK 4 attack_tcp_ack
ATK_VEC_STOMP 5 attack_tcp_stomp
ATK_VEC_GREIP 6 attack_gre_ip
ATK_VEC_GREETH 7 attack_gre_eth
ATK_VEC_PROXY 8 attack_app_proxy(已经被取消)
ATK_VEC_HTTP 10 attack_app_http

这其中的GRE攻击也就是2016年。

二、scanListen分析

ScanListen主要用于处理Bot扫描得到的设备信息(ip、端口、用户名、密码),并将其转化为如下格式后将其输入给Load处理。

scanListen

三、Load分析

Load模块的主要功能是处理scanListen的输入并将其解析后针对每个设备实施感染。其感染实现方法如下:

(1)首先通过Telnet登陆目标设备。

(2)登陆成功后,尝试运行命令/bin/busybox ps来确认是否可以执行busybox命令。

busybox

(3)远程执行/bin/busybox cat /proc/mounts;用于发现可读写的目录。

mounts

(4)如果发现可用于读写的文件目录,进入该目录并将/bin/echo拷贝到该目录,文件更名为dvrHelpler,并开启所有用户的读写执行权限。

dvrHelpler

(5)接下来通过执行命令”/bin/busybox cat /bin/echo\r\n”来获取当前设备架构信息。

busybox cat

(6)如果获取架构信息成功,样本试图通过三种方式对设备进行感染,这三种方式分别为echo方式、wget方式、tftp方式。

wget

(7)接下来通过Telnet远程执行下放的程序。

Telnet2

(8)最后远程删除bot程序。

bot

总 结
僵尸网络已成为全球面临的共同问题,其攻击不同于其他以窃密、远控控制为主的恶意代码,其通过掌握着的巨型僵尸网络可以在任何时候对任何目标发动DDoS攻击。僵尸的感染对象已经从服务器、PC、智能手机,扩展向摄像头、路由器、家居安防系统、智能电视、智能穿戴设备,甚至是婴儿监视器,任何互联网连接的设备都可能成为一个潜在的目标。而一般用户是很难注意到被感染的状况的。Mirai僵尸由于源码的开放可能正在迅速的扩散,其攻击的流量特征也可能快速变化而难以监测。由于受感染目标多以IOT设备为主,所有的密码均固化在固件中,因此即便重启后Mirai从内存中消失也无法杜绝二次感染,并且隐藏在这种嵌入式设备中是极难判定其是否受到恶意感染。

缓解措施:

(1)如果感染Mirai,请重启设备,并且请求设备厂商更新固件剔除Telnet服务。

(2)不必要联网的设备尽量不要接入到互联网中。

(3)通过端口扫描工具探测自己的设备是否开启了SSH (22), Telnet (23)、 HTTP/HTTPS (80/443)服务,如果开启,请通知技术人员禁用这些服务。

来源:启明星辰ADlabs

上一篇:被盗的iPhone是如何一步步被黑客解锁的

下一篇:关于mirai僵尸网络控制主机的数据分析