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。
另一次是针对法国网站主机OVH的攻击,其攻击流量达到1.1Tbps,打破了DDoS攻击流量历史记录。
2016年9月30日,黑客Anna-senpai公开发布Mirai僵尸源码。其公布源码的目的一则是发现有关机构正在清理其掌控的僵尸设备;二则是为了让更多的黑客使用该僵尸进行扩散,掩人耳目,隐藏自己的踪迹。
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僵尸的感染过程,与普通僵尸感染不同的是,其感染端是通过黑客服务端实施的,而不是靠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来禁用看门狗功能。
通常在嵌入式设备中,固件会实现一种叫看门狗(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服务的重绑定实现:
HTTP服务的重绑定实现:
通过对实际样本的分析我们发现,大部分黑客并没有对SSH和HTTP进行重绑定操作,绝大部分都只针对于Telnet服务进行了重绑定。
5、干掉竞争对手,独占资源
Mirai会通过一种 memory scraping的技术干掉设备中的其他恶意软件,其具体做法是搜索内存中是否存在QBOT特征、UPX特征、Zollard蠕虫特征、Remaiten bot特征来干掉对手,以达到独占资源的目的。
此外,Mirai如果发现anime恶意软件,同样也会强行干掉它。
6、可感染设备探测
Mirai僵尸随机扫描网络中IOT设备的Telnet服务并通过预植的用户名密码进行暴力破解,然后将扫描得到的设备IP地址、端口、设备处理器架构等信息回传给Load服务器。这里要注意的是,Mirai的随机扫描是有一个过滤条件的,其中比较有意思就是他会过滤掉通用电气公司、惠普公司、美国国家邮政局、国防部等公司和机构的IP地址。
Mirai僵尸中内置有60余个用户名和密码,其中内置的用户名和密码是加密处理过的,加密算法是通过简单的单字节多次异或实现,其密钥为0xDEADBEEF, 解密密钥为0xEFBEADDE。
Mirai使用高级SYN扫描技术对网络中的设备进行扫描破解,其速度僵尸程序QBOT所采用的扫描技术快80倍,资源消耗减少至少达20倍。因此具备强大的扫描感染能力,黑客在收集肉鸡过程中,曾经每秒可新增500个IOT设备。
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遭受的主力攻击形式,攻击的初始化代码如下:
C&C会被初始化在一张表中,当Mirai回连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处理。
三、Load分析
Load模块的主要功能是处理scanListen的输入并将其解析后针对每个设备实施感染。其感染实现方法如下:
(1)首先通过Telnet登陆目标设备。
(2)登陆成功后,尝试运行命令/bin/busybox ps来确认是否可以执行busybox命令。
(3)远程执行/bin/busybox cat /proc/mounts;用于发现可读写的目录。
(4)如果发现可用于读写的文件目录,进入该目录并将/bin/echo拷贝到该目录,文件更名为dvrHelpler,并开启所有用户的读写执行权限。
(5)接下来通过执行命令”/bin/busybox cat /bin/echo\r\n”来获取当前设备架构信息。
(6)如果获取架构信息成功,样本试图通过三种方式对设备进行感染,这三种方式分别为echo方式、wget方式、tftp方式。
(7)接下来通过Telnet远程执行下放的程序。
(8)最后远程删除bot程序。
总 结
僵尸网络已成为全球面临的共同问题,其攻击不同于其他以窃密、远控控制为主的恶意代码,其通过掌握着的巨型僵尸网络可以在任何时候对任何目标发动DDoS攻击。僵尸的感染对象已经从服务器、PC、智能手机,扩展向摄像头、路由器、家居安防系统、智能电视、智能穿戴设备,甚至是婴儿监视器,任何互联网连接的设备都可能成为一个潜在的目标。而一般用户是很难注意到被感染的状况的。Mirai僵尸由于源码的开放可能正在迅速的扩散,其攻击的流量特征也可能快速变化而难以监测。由于受感染目标多以IOT设备为主,所有的密码均固化在固件中,因此即便重启后Mirai从内存中消失也无法杜绝二次感染,并且隐藏在这种嵌入式设备中是极难判定其是否受到恶意感染。
缓解措施:
(1)如果感染Mirai,请重启设备,并且请求设备厂商更新固件剔除Telnet服务。
(2)不必要联网的设备尽量不要接入到互联网中。
(3)通过端口扫描工具探测自己的设备是否开启了SSH (22), Telnet (23)、 HTTP/HTTPS (80/443)服务,如果开启,请通知技术人员禁用这些服务。
来源:启明星辰ADlabs