恶人自有天收:如何能使僵尸网络Mirai的服务器宕机
作为恶名昭著的僵尸网络,Mirai攻陷了成千上万的物联网(IoT,Internet-Of-Things)设备,以这些设备作为节点发起大规模分布式拒绝服务攻击,破坏大量主流站点。
Mirai的攻击浪潮在2016年9月达到峰值,当时该僵尸网络发起大规模分布式拒绝服务(DDoS)攻击,导致OVH、Dyn以及Krebs on Security等主流站点出现暂时瘫痪现象,无法正常提供服务。据OVH以及Dyn的报告,这些攻击的流量峰值超过了1Tbps,这是已知攻击中规模最大的攻击流量。
此次创纪录的攻击流量事件中,最引人注目的在于这些流量由家用路由器、空气质量检测仪以及个人监控摄像头等小型物联网(Internet-of-Things,IoT)设备所发起。在巅峰时期,Mirai控制了超过60万个存在漏洞的IoT设备。
而就是这么有名的僵尸网络,Mirai和他的变种被ankitanubhav曝光其有一个小Bug,可以导致其在执行指定类型的操作后致C2服务器宕机。
效果图如下,当用户名输入1025+个“a”字符时,Mirai服务器便会宕机。
实际上,当有人连接到Mirai C2时,它会要求输入用户名和密码进行身份验证。如果有人在用户名中添加了1025+个字符流,则C2会崩溃,如上所示。
具体分析如下:
首先对缓冲区溢出有个概念理解,这是GO代码中的一个程序,它以名字作为输入并打印出来。
程序首先将名称作为字符串,将其复制到字节缓冲区然后打印缓冲区。虽然事情看起来很正常,但程序有一个缺陷。请注意,缓冲区是静态声明的大小为10。
设置大小为10的缓冲区长度是溢出的征兆
当我们运行它并提供一个小的输入时,事情进展顺利,例如“Ankit”。但是,当我们提供大于10的输入时,如“Ankitxxxxxxxxxxxxxxxxxxxx”,那么程序显然会抛出错误。
我们现在回到最初的Mirai源码。
这是Github上提供Mirai源代码的一部分
我们看到用户名被传递给Readline函数。
虽然由于它的名称它似乎是一个库函数,但它实际上是在源中声明的自定义函数,它声明了1024的固定缓冲区大小长度。
这就是当用户名是1025或更多字符流时模块崩溃的原因。
由于大多数物联网类的僵尸网络恶意软件都基于Mirai,因此这个漏洞已经在许多变种中被传播,并且已经在Blackhats中得到了充分利用。
目前,这个漏洞经常用来对那些投放Mirai或者基于Mirai进行二次开发的僵尸网络的脚本小子,由于他们的服务器IP都保持不变,因此直到僵尸网络所有者意识到C2已关闭并再次打开它后,会有一段很长的间隔,这可以有效的破坏僵尸网络的扩散。
黑鸟点评:
所以,我们可以写一个脚本,把大量Mirai及其变种的服务器IP地址都收集齐全,然后通过指定长度用户名的方式,就可以批量致使服务器宕机。
或者可以反向思考,通过全网ip扫描输入指定长度的用户名,然后通过服务器输入前后的状态,来判断IP是否为Mirai及其变种的服务器。
参考链接:
https://www.ankitanubhav.info/post/crash
近期看点:
欢迎下方长按识别二维码关注本公众号
更多情报和数据,请关注公众号
点击菜单栏,扫码加入知识星球
(原价299,现价折扣269)
感谢您的关注和转发
右下角
朕编不下去了了