深度解析:恶意软件“Mirai”源代码的结构及其对策

简介:

2016年9月份以来,发生了多起大规模DDoS攻击事件。本文针对这些攻击事件中使用的恶意软件“Mirai”的源代码进行分析,进一步介绍Bot(客户端)的结构,以及其应对方法。

一、 Mirai Botnet是什么

2016年9月13日晚,美国著名安全记者Brian Krebs氏的网站“Krebs on Security”被DDoS攻击,mirai Botnet发动了此次攻击。Mirai主要是以网络摄像头、路由器、数码录像机等IoT设备为跳台进行DDoS攻击。

据受到攻击后Krebs氏的博客报道,保护该网站的Akamai观测到在高峰时期受到了有史以来经历的最大规模攻击近2倍的流量访问。

另外,2016年10月21日Twitter、Netflix等利用DNS服务进行的DDoS攻击,也被推断利用了Mirai僵尸网络。

然后在Krebs氏网站受到攻击后,黑客平台上Mirai的源代码被公开成为了很大的话题。随后源代码又在GitHub上被转载,谁都可以看到具体内容。

源代码被公开,Mirai Botnet以出厂设置的密码未被更改的IoT设备为目标,进行一般的字典攻击扩大感染范围。据说在进行前述的攻击时,也有几十万台的设备受到僵尸网络攻击。

近年来各种各样的IoT设备得到普及,存在漏洞的设备也在不断增加,受到大规模的DDoS攻击的可能性也会增大。另外,通常这些设备采用的架构是不同于个人的电脑等的多种多样的,不过,Mirai可应对ARM、ARM 7、MIPS、PowerPC、SH4、SPARC x86等各种各样的架构,这与大规模感染的扩大有一定关系吧。

本稿中,以现在GitHub上被公开的代码为基础,解说Mirai Botnet的运作,并且反思使家庭及企业的设备远离僵尸网络的自卫对策。

二、 Mirai Botnet的构成

被公开的Mirai Botnet的源代码可大致分为以下3个部分:

1. 攻击者操作的C&C(Command and Control)服务器功能

2. C&C服务器中被操作的Bot功能

3. Bot程序发布的Downloader功能

C&C服务器部分为Go语言,Bot、下载部分以及其他的加密工具等主要为C语言。对照被公开存储的目录,Mirai的构成如下(List 1)

深度解析:“Mirai”源代码的结构及其对策

  List 1 目录构成

Mirai Botnet 是攻击者通过①C&C服务器向②Bot发送指令,形成以大量的Bot为攻击对象的C&C中心型僵尸网络。同时,Bot会扫描可感染的设备,将找到的设备信息发送给Report服务器,由③downloader植入Bot程序。(图1)

深度解析:“Mirai”源代码的结构及其对策

  (图1.Mirai的动作)

在这里,首先从C&C服务器的代码开始解读Mirai。

三、 C&C服务器

◆ Main函数

由于Mirai的C&C服务器部分为Go语言,最初被执行的mirai/cnc目录中main.go文件内的main函数被读取(List 2)。再者,以下代码中虽然有补充的评语,但是,日语之外的评语是原本就记载的内容。

深度解析:“Mirai”源代码的结构及其对策

  List 2 main.go内的main函数

Mirai的C&C服务器起初是建立在Telne服务器与API服务器之间的。“go~”的部分是利用Go语言degoroutine的非同期被处理的部分。

apiHandler函数中的经由API初期化接受来自攻击者的操作处理程序。initialHandler函数中,初期化向连接Telnet的Bot发送指令的处理程序以及实现C&C服务器上指令行接口的处理程序(List 3)。

深度解析:“Mirai”源代码的结构及其对策

  List 3 main.go 的initialHandler函数

也就是说,这个C&C服务器的操作可能利用API,也可能通过Telnet连接CLI发送指令。解读源代码的话,无论使用哪个方法都是需要认证的。

◆ 认证部分

从api.go文件种Handle函数内的数据看,送来的要求中含有的apikey没有在C&C服务器内登录的话,能够读取未接收的指令。(List 4)

深度解析:“Mirai”源代码的结构及其对策

  List 4 api.go中的Handle函数的认证部分

admin.go中实装的处理程序也同样,在CLI上操作时需要使用用户名和密码登录。(List 5)

深度解析:“Mirai”源代码的结构及其对策

  List 5 admin.go中的Handle函数的认证部分

另外,命令行在登录时要求输入俄罗斯语,因此推断制作者或利用者可能是俄罗斯圈的人。

◆ 用户管理部分

那么,怎样才能把这些信息登记在数据库上呢?读取源代码访问C&C服务器上的CLI时,如果是管理者用户的话可以从CLI注册登录(List 6)。

深度解析:“Mirai”源代码的结构及其对策

  List 6 admin.go的Handle函数内的用户登录部分

然而,管理员账号本身是预先插入数据库中的,被公开的代码中没有管理员账户登录的相关内容。

另外,数据库的users桌面上,除username及password之外,还有max_bots、last_paid、cooldown、duration_limit等列,这些列被用于创建攻击指令,因此每个用户能够利用的Bot数量、攻击间隔、账号等均受控制。并且,用户向僵尸网络持有者支付金钱的时间等都保存在C&C服务器的数据库中。(List 7)

深度解析:“Mirai”源代码的结构及其对策

  List 7 database.go内的CreateUser函数

综上所述,是否可以认为Mirai Botnet的所有者使不特定的多数人以金钱等交换利用了僵尸网络呢。

◆ Bot 管理部分

接下来,看看Bot管理部分吧。首先从Bot连接C&C服务器的话,main.go文件中的initialHandler函数中NewBot.Handle函数被唤起,根据Handle函数的处理Bot信息将被添加到列表中(List 8)。

深度解析:“Mirai”源代码的结构及其对策

  List 8 bot.go内的Handle函数

存储Bot信息的clientList是全球变数,main.go内运行main函数之前就被制作了。另外, clientList在新制作的时候,非同步接收的Worker制作Bot指令,等待Bot指令。

◆ 攻击指令的制作部分

接下来,以攻击者C&C服务器的输入为基础,看看Bot指令的制作部分吧。在API、CLI等输入指定攻击种类·攻击对象的命令,便会在attack.go内的NewAttack函数内完成应对接受指令的Flag设置。在同文件夹中的attackInfoLookup Map内定义了可能利用的攻击种类(表1)(List 9)。

深度解析:“Mirai”源代码的结构及其对策

  表1 Mirai Botnet可执行的攻击种类

深度解析:“Mirai”源代码的结构及其对策

  List 9 attack.go内attackInfoLookup Map

从表1了解到,Mirai可使Bot受到各种各样的DDoS攻击。

另外,VSE平台攻击中被瞄准的游戏引起“Source Engine”是非常有人气的一款在线游戏“反恐精英”中使用的引擎。这样被特意定义,由此可见这样的在线游戏可能被作为攻击的目标。利用GRE等次要的协议进行攻击是有可能的,因此Mirai可回避一般的DDoS攻击对策。

然后把这些攻击Falg设定组装后,同文件的Build函数内将这些攻击设定为二进制向Bot发信。这样就可以向Bot完成数据的发送。

◆ 指令发送部分

最后,看看从C&C服务器向Bot发送指令的流程吧。二进制的攻击设定移交至clientList.go文件内的QueueBuf函数,如名字所示保持Bot的指示被放置在缓冲区列队中(List 10)。

深度解析:“Mirai”源代码的结构及其对策

  List 10 clientList.go的QueueBuf函数

接收信息的atkQueue频道从持有的Bot信息列表到攻击者可利用的Bot上线数为止在Bot单体的缓冲区排列攻击设定。

深度解析:“Mirai”源代码的结构及其对策

  List 11 clientList.go内的worker函数

然后,排列的攻击设定最终会被发送到Bot单体(List 12)。

深度解析:“Mirai”源代码的结构及其对策

  List 12 bot.go内的QueueBuf函数

四、Bot(客户端)

接下来,看看Bot客户端的运作吧。由于客户端是C语言编写的,首先让我们从mirai/bot目录以下的main.c开始解读吧。

◆C&C的连接部分

main.c内的main函数里,启动后本身的过程名伪装成随机的名字,无线循环地呼出establish_connection函数,将加密的C&C服务器的域名和Bot解密后连接在一起(List 13)。

深度解析:“Mirai”源代码的结构及其对策

  List 13 main.c内的main函数与establish_connection函数

在这里,establish_connection函数里名为resolve_fudc函数被同文件内anti_gdb_entry函数替换,所以实际上也被称作resolve_cnc_addr函数(List 14)。

况且,C&C服务器的域名中,对table.c文件中被定义为“0xdeadbeef”的值实施seed值XOR加密,C&C服务器的解析会变得较困难。

深度解析:“Mirai”源代码的结构及其对策

  List 14 main.c内的anti_gdb_entry函数与resolve_cnc_addr函数

成功连接后,Bot向C&C服务器中发送二进制“


本文转自d1net(转载)

相关文章
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
773 4
JSON数据解析实战:从嵌套结构到结构化表格
|
存储 算法 安全
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
270 0
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
527 5
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
1239 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
1468 1
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
1418 9
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
698 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
数据采集 存储 JavaScript
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取
在现代网页开发中,复杂的HTML结构给爬虫技术带来挑战。传统的解析库难以应对,而Cheerio和jsdom在Node.js环境下提供了强大工具。本文探讨如何在复杂HTML结构中精确提取数据,结合代理IP、cookie、user-agent设置及多线程技术,提升数据采集的效率和准确性。通过具体示例代码,展示如何使用Cheerio和jsdom解析HTML,并进行数据归类和统计。这种方法适用于处理大量分类数据的爬虫任务,帮助开发者轻松实现高效的数据提取。
269 2
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取

热门文章

最新文章

推荐镜像

更多
  • DNS
  • 下一篇
    开通oss服务