导语:Rakos僵尸网络与2016年流行的恶意软件Mirai相似,可用以发动极具破坏力的DDoS攻击。
一、Rakos僵尸网络的背景介绍
Morphus Labs最近部署了不少高交互蜜罐,希望能发现一些隐藏特别深的最新恶意攻击,但是在蜜罐部署的前两天,该实验室对恶意软件的捕获都失败了,这其中就包括针对SSH端口的SPAM和XORDDoS攻击。到了第三天,蜜罐捕获了一种攻击,经调查,命名为Rakos的Linux恶意程序已经入侵了大量设备。虽然当前这些设备组成的僵尸网络还没有确切的恶意行为,但研究人员认为Rakos僵尸网络与2016年流行的恶意软件Mirai相似,可用以发动极具破坏力的DDoS攻击。
译者注:XorDDos的主要特点,就是用暴力猜解目标机器SSH弱密码的方式,入侵目标机器,然后执行相应的shell脚本,安装病毒到目标机器,将目标设备变为DDoS僵尸设备。
进一步分析显示,该僵尸网络在178个国家里每天入侵大约8300台设备。Rakos采用C&C通讯,另外也采用点到点的方式。72小时内已经有超过25000台设备被感染,其中有约300台成为C&C服务器。感染数量最大的是国家中国,其它国家地区还包括越南、泰国、俄罗斯、印度、巴西等。
二、僵尸网络的C&C渠道分析
为了更好地了解这种P2P瞬态僵尸网络行为及其C&C协议,Morphus Labs对其进行了全天候的监测,经过分析,专家们发现了两种通信方式:一种是通过HTTP僵尸网络,另一种是僵尸网络与C&C服务器之间的TLS / SSL通信协议。
在开始具体分析之前,让我们对一些常用的概念下个定义:
检查器(Checker):僵尸网络中的那些被感染的设备
Skaro:C&C服务器
特定的节点可以扮演两个角色。
2.1 Checker与Skaros之间的通信
Checkers和Skaros之间的连接是通过SSL / TLS加密会话进行的,所以就有必要使用经典的中间人攻击拦截流量来访问通讯信息。表1中列出了捕获的命令及它们的介绍。
表1: Checkers和Skaros之间的C&C
POST /ping HTTP/1.1 | Checkers使用此命令通知Skaro的信息和统计信息。它包括:系统架构,操作系统,“Checkers”端口号(用于僵尸网络间的通信)和设备载荷(CPU和内存)。在响应中,此命令会收到SSL证书文件(CA,CERT和KEY),最多时可包含30个Skaros地址和50个Checkers |
GET /upgrade/up HTTP/1.1 | 由Checker发出命令,从Skaro获取新的用户名及密码组合列表 |
GET /upgrade/vars.yaml HTTP/1.1 | 发出此命令时,Checker将收到类似初始参数的响应,这其实是一种刷新配置的一种方式 |
GET /upgrade/linux-armv5 HTTP/1.1 | 此命令用于获取新版本的恶意软件二进制文件 |
2.2 Checkers之间的通信
在寻找设备的公共IP地址时,我们要利用Checkers之间的通信。僵尸网络通过利用这些IP地址来最大限度的绑定由HTTP请求所发送的TCP随机端口。
请参见下表中的Checkers之间的C&C命令及它们的介绍。
Checkers之间的C&C命令
GET / HTTP/1.1 | 僵尸网络会用此命令来查询另一个发现自己的IP地址 |
GET /love HTTP/1.1 | 和以前的命令一样,僵尸网络会使用“/ love”命令来查询另一个发现自己的IP地址和PTR(与该IP地址相关的反向名称)。不过在这个命令中,有一个“zen”参数,我们还没有分析出到它的功能 |
三、僵尸网络的分析
本节的目的就是要对僵尸网络的攻击数量进行充分的分析,我们首先将其攻击节点分类到Skaros和Checker组,并获得尽可能多的关于它们的信息。为此,我们采用了两种标准的方法来设置P2P僵尸网络,这两种标准分别是爬行和传感器注入。
3.1 爬行
在爬行标准下,我们就可以访问尽可能多的节点并收集关于它们的信息。爬虫通过从种子节点请求邻居列表开始,然后从每个新发现和活动节点再次循环的执行同样的请求,知道把所有的僵尸网络都找出来。
为了能最大限度地发现我们要找的“始终可用和响应”的种子节点,我们调查了在中间人流程中收集的Skaros列表以及由“/ ping”命令找出的所有IP地址。通过这些调查,我们发现了有一组命令里的三个IP都出现在“skaro”上的同一个位置,以响应C&C命令“/upgrade/vars.yaml”,并在“proxies”处响应C&C命令“/ ping”,这样此处就很可能成为种子节点。
为了验证这我们的这个猜想,我们手动发出“/ ping”命令。结果,那一组命令里的三个IP种,有两个没有响应,剩余的那一个回复了一个SSL的错误报告消息,如下图所示:
通过这个验证,我们意识到僵尸网络会对C&C命令响应中发现的SSL证书进行身份验证。使用该C&C命令响应,我们向同一台Skaro发出了另一个“/ ping”命令,和表一介绍的一致,我们得到了包括最多30个Skaros和50个Checkers。
经过这系列的验证,我们意识到在僵尸网络保护和认证机制下,这个节点对僵尸网络的重要性,并让我们最终选择它作为我们的种子节点。我们决定把该节点成为“Super Skaros”。
鉴于以上这些分析,我们最后编写了一个基于Python的脚本来自动执行爬网过程。该过程可以自动的对Skaros的种子节点进行更新迭代。另外我们还利用该脚本创建一个僵尸网络的分布图,以便于进一步分析节点并对其进行互连。
3.2 传感器注入
在这种标准下,我们是将假节点作为传感器节点注入僵尸网络。目的是利用假的网络节点诱导出与其他真节点的联系,最后找出真的节点。
在我们刚刚提到爬行方法下,由于每个查询返回的Skaros和Checkers数量有限,因此我们对整个僵尸网络的了解是有限的。即使我们重复对同一Skaro进行查询,返回的列表通常只包含少量的新节点。
因此为了克服这个问题并尽量多的把相关的节点都收集到,我们采用了传感器注入方法,该方法可以将包括假节点(Skaros和Checkers)插入到僵尸网络中,并收集有关联系节点的信息。
如果要插入Checker的传感器,我们就要在受控环境中运行恶意软件二进制文件,阻止它建立任何SSH传出连接,并监视网络流量以列举所有与之联系的僵尸网络。由于Checkers之间的通信未被加密,所以这种策略可以使我们有可能检查发送到或传送到我们的传感器内的任何内容。
如果要插入Skaro传感器,我们就要使用“available”、“running” 和“addr”参数准备了一个“/ ping”命令,该命令会指向我们的一个蜜罐的IP地址,并将其发送到有效的Skaro。接下来,我们向同一个Skaro发出了一个新的“/ ping”命令,并确认我们的传感器节点出现在返回的Skaro列表中,如下图所示:
要接收和处理这些HTTPS连接,我们就必须部署了一个Nginx服务器,并配置僵尸网络默认的SSL证书。设置完成后开始运行,我们就能接收来自Checkers的POST和GET请求,如下图所示:
要捕获并存储发布到Skaro传感器的数据,我们就必须创建了一个简单的PHP脚本来将文件附加到接收到的HTTP POST参数。在下图中,有一个使用“/ ping”C&C命令的Checker所发布的数据样本,该样本一如既往地包含有关受害者的信息,当然也包括明文的登录凭据:
最后,为了让我们的Skaro传感器能永久注入到僵尸网络上,我们可以将前面实现的“/ ping”命令循环地发送到僵尸网络上的Skaros。为了实现这个循环过程,我们仅需使用适当的值来得到对上文提到的爬行方法下的“/ ping”请求。这样,网络爬虫就会定期访问所有活动的Skaros,以将所有传感器节点都捕捉到。
3.3 实验环境设置
在基本方法设置和脚本调整完成之后,我们现在就要对实验环境进行设置。
当我们对P2P僵尸网络进行研究时,我们发现这些僵尸网络的传感器节点是分布在世界的不同地方的,不过,不同的传感器节点特会根据地理区域或IP地址实施不同种类的通信限制或负载平衡。
因此,我们选取了以下5个地域的传感器节点:
北美:俄勒冈州
南美洲:圣保罗
欧洲:爱尔兰
东南亚:新加坡
大洋洲:澳大利亚
在每个区域,我们都配置了一个蜜罐,且都为其配备了包含运行爬网和传感器注入实验所需的配置和脚本,其中包括:
1.网络数据包捕获:捕获所有入站和出站连接;
2.Nginx HTTPS服务器:成为我们的Skaro传感器;
3.爬行脚本:寻找所有Skaros和Checker并创建全程记录爬行过程的显示图
4.Rakos二进制文件:成为我们的Checker传感器;
5.出站过滤器:TCP端口22(SSH)上的所有传出连接都被阻止,以避免我们的蜜罐扫描到受害者的网络。
3.4开始实验
现在我们就可以开始在所有蜜罐中同时进行实验了,果然没过多久,爬网过程已经查询到了30到60个Skaros,并且传感器节点全部来自对僵尸网络的接受。
3天后,我们停止了实验,并开始处理所有收集的数据。
四、结果分析
实验收集了大约5GB的数据,这些数据包括了PCAP文件、HTTP请求、爬网数据和图形文件,这些数据和图形文件经过处理后被插入弹性栈和Gephi平台中进行查询和可视化分析。分析结果如下表所示:
实验结果
节点类型或节点方法 | 爬虫 | 传感器注入特征 | 独特的节点 |
CHECKERS | 498 | 24782 | 24967 |
Skaros | 281 | 239 | 299 |
独特的节点 | 779 | 24839 | 25084 |
正如我们预期的那样,爬行策略所获取的节点数非常少,实际上,它只占发现节点总数的3.15%,而通过传感器传感器注入的方法则发现了24839个节点,占发现节点总数的96.84%。
在整个实验期间,每个传感器都平均发现了5000个独特的CHECKERS和48个独特的Skaros。有趣的是,与爬行方法相比,尽管传感器注射可以发现比它多50倍以上的CHECKERS,但在该方法下,发现Skaros的数量却比爬行方法下的减少了15%。值得一提的是,传感器节点的多少还取决于连续的“/ ping”命令,因为连续的“/ ping”命令可以保持传感器节点的活跃状态。
为了更容易地表示僵尸网络的互连关系,我们为每个爬虫生成了一个可视化连接图。如下图所示,绿色代表的就是从种子节点到CHECKERS的全部连接,橙色代表的是通过Skaros的全部连接。总而言之,这些节点都是在爬行过程中被发现的节点。
与上图形成鲜明对比的是,在传感器注入的方法下,我们可以从下图中看到,僵尸网络的连接点几乎无处不在。
现在,我们可以在世界地图上绘制出以上所发现的路径图,如下图所示,世界上的僵尸网络无处不在,为了对节点进行地理定位,我们使用了MaxMind数据库。
下图就显示的是由“圣保罗”传感器接收的所有连接。最明显的大黄点代表就是传感器节点。紫色是CHECKERS,橙色是Skaros。
其他传感器节点的互连图和它们所布置的蜜罐分布图高度一致。
下图所示就是全球僵尸网络分布图,很明显,在欧洲,连接点最多的是法国、意大利和西班牙。
我们总结出连接点最多的十大国家,如下图所示:
如下图所示,这项研究的另一个有趣的发现就是连接点会因受害者设备而有所区别。其中至少有45%是Raspberry PI,其次是OpenELEC,占21.79%,最后有16.74%来自Ubiquiti的UBNT无线接入点设备:
基本上,这个僵尸网络是依赖于设备所有者无法管理的默认或易于猜测的密码。比如,OpenELEC系统甚至不能为用户提供一种更改默认密码的简单方式,如下图所示:
五、感染指标(IoC)
5.1 哈希值
OS | ARCH | MD5 | SHA256 |
Linux | i386 | 4d08072825eb9e32b9736988c57050eb | 7328e81a67419bba42d204a82db311db1a033c1c37d454f7adc3e1ebd635e976 |
Linux | ARM | abf87f358d265a072d3ee4a4e1ddc16f | 519c236f9974279e1db3c973b2d3c4e561307cfb52dcca4b77d19004b506157d |
Linux | MIPS | f6eed5ce7e92f4d34de98d6d262a869b | f5dc3cb4d884012b8f255a4946c2914d9ecaa3382f556125124480c3c47be07e |
Linux | x86-64 | b5cc4d3e6188cbb6a6f725b53fbf3c6b | 3e538db81365c3a64af78f53cb64fd58c7843ffa690ec0996b7556fc43a876df |
FreeBSD | x86-64 | 8e9f0211e0e6448e587aaa979f311ac1 | 9d476b8b4326be1207e3064f0aa0e01646277722c50c8e9a61c8c87f53416075 |
5.2 Yara规则
strings: $ = “upgrade/vars.yaml” $ = “upgrade/up” $ = “/tmp/init” $ = “dalek” $ = “skaro” condition: 4 of them
5.3 网址过滤
GET /love User-Agent: Go-http-client/1.1
总结
本文的研究为大家揭示了一个受控设备网络,我们定义为“瞬态僵尸网络”。术语transient(瞬态响应)说明了Rakos恶意软件具有非持久性的特点,这意味着只有在重新受到威胁后,单个僵尸网络才会重新启动。换句话说,虽然Rakos的攻击设备非常多,但大多数只是处于潜在的威胁状态,很多用户并不知道自己的设备已经成为僵尸网络的一部分,所以他们也就认为没有必要修改设备的连网密码了。
僵尸网络的瞬态响应特点可以在我们试验结果中很明显的看到。在实验过程中,节点数量很明显上升了1700个,这些IP地址,可能来自新的感染设备或原来已经受过感染而在试验中重新被激活的。考虑到这种情况,我们在3天内发现的25084个独特节点,平均下来每天就有8362个节点被激活,如果它们在DDoS攻击中一次性同时被使用,则攻击力就相对可怕。