有的厂商将Mirai命名为蠕虫不是很贴切,Mirai利用类似蠕虫的方式感染(与传统蠕虫感染方式不同),但实际上是一款僵尸程序。因而称之为Mirai僵尸蠕虫更为准确,后文主要以僵尸称呼。 美国大面积的网络瘫痪事件 2016年9月30日,黑客Anna-senpai公开发布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。 另一次是针对法国网站主机OVH的攻击,其攻击流量达到1.1Tbps,打破了DDoS攻击流量历史记录。 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.5Tpbs (4)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向看门狗发送控制码0×80045704来禁用看门狗功能。 通常在嵌入式设备中,固件会实现一种叫看门狗(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 { Durationuint32 Typeuint8 Targetsmap[uint32]uint8 //Prefix/netmask Flagsmap[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攻击也就是9月20日安全新闻工作者Brian Krebs攻击事件的主力攻击类型。 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)服务,如果开启,请通知技术人员禁用SSH和Telnet服务,条件允许的话也可关闭HTTP./HTTPS服务(防止类似攻击利用Web对设备进行感染)。 * 作者/ADLab(启明星辰积极防御实验室),转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)
|