- A+
我们的研究人员发现了一种新的大型物联网僵尸网络,即“IoTroop”。 由于这一发现的紧迫性,我们很快发布了我们的初步调查结果,以提醒网络安全社区。 从那时起,我们就有时间消化和剖析传播的恶意软件并与您分享我们的发现。
主要调查结果如下:
•已发现整个攻击基础架构。
•我们观察了两组不同的基础设施:
o主要的服务器和样本集合关注感染和传播。
o用于第二阶段有效载荷的较小且不同的集合。
•攻击者可以通过LUA脚本快速灵活地控制受感染的设备。
•恶意软件作者和运营商在中国境外运营。
在整个研究过程中,我们发现了许多迹象表明该物联网僵尸网络的作者和运营商都在中国境外运营。 当然,所有这些迹象都可以伪造。 然而,绝对的证据量和位置仍然使我们得出结论,这些迹象对于非常高的概率是正确的。
我们还可以透露,部分C&C基础设施以前是通过电子邮件“li2384826402@yahoo.com”注册的。 同样的电子邮件地址也用于注册属于被称为“黑藤”的中国APT集团的域名。 这还不足以将这个新的僵尸网络归因于同一个群体; 但它确实为未来的研究提供了线索。
主要基础设施
基于多个不同服务器的系统,每个服务器都有自己的角色,可以在侦察,利用和传递恶意软件负载时发挥作用,整个僵尸网络传播基础设施已经被发现。 下图说明了所请求的请求和每个服务器的功能的深入视图。
恶意软件传播基础结构图
IoTroop恶意软件概述
IoTroop恶意软件是广告系列中使用的主要示例,并作为第一阶段有效负载部署。 它与泄露的Mirai源代码共享一个广泛的代码库,可以在几个在线资源中找到它。 我们观察到的主要差异是:
- C&C服务器已经完全重新设计,可以使用新的后端进行操作。 此外,IoTroop的C&C服务器是用PHP编写的,而最初的Mirai C&C服务器是用GO编写的。
- 随着C&C后端的变化,C&C通信协议也发生了变化。 IoTroop样本中的整个C&C通信功能是IoTroop恶意软件的全新和独特功能。
- 漏洞扫描功能取代了Mirai提供的原始强制密码功能。 可能已添加此功能以使用更少的资源感染大量设备,同时降低恶意软件检测率。
- IoTroop恶意软件不包含任何原始的Mirai DDoS功能; 实际上它根本不包含任何DDoS功能。 虽然我们没有看到任何实际的DDoS攻击,但所有与DDoS相关的操作都由C&C后端编排和管理,并作为单独的模块下载。
恶意软件操作细节
我们检测到IoTroop恶意软件使用的几种样本变体,包含非常小的差异,但包含完全相同的功能。 通常,所有变体可以分为与受攻击设备的体系结构相关的两个主要类别 - MIPS变体和ARM变体。
初始化
一旦IoTroop将其有效负载执行到受感染的设备上,操作的初始步骤与Mirai采用的步骤相同。 这些包括:
- 混淆的字符串初始化
- 防止系统的监视服务重启(通过发送特定的IOCTL)
- 目前只运行一个IoTroops实例
- 隐藏argv [0]
- 隐藏进程的名称
但是,从控制流程的这一点来看,IoTroop恶意软件开始执行其自己独特的功能:
通过将IOCTL 0x8927发送到eth0,br0,eth1和eth2设备来检索和存储设备的MAC地址。
如果恶意软件当前运行的设备运行GoAhead嵌入式Web服务器,则执行以下shell命令行:
- rm -f /tmp/ftpupload.sh \ n
- ln -s / dev / null /tmp/ftpupload.sh \ n
- rm -r / var / log \ n这些操作用于删除WIFICAM漏洞使用的先前shell脚本,并创建指向/ dev / null的符号链接,从而防止进一步尝试使用它,以及清除所有日志文件从设备中清除其证据。
禁用竞争对手恶意软件
IoTroop使用端口TCP / 23杀死任何打开的telnet进程。
然后,它继续扫描设备的内存,查找其他IoT恶意软件使用的现有字符串。 如果找到任何这些字符串,则会终止包含它们的进程。- .anime
- 报告%s:%s
- HTTPFLOOD
- LOLNOGTFO
- zollard
- \ x58 \ x4D \ x4E \ x4E \ x43 \ x50 \ x46 \ x22('zollard'一词用0x22编号)
漏洞扫描
生成随机IP是为了进行漏洞扫描。 负责生成IP地址的代码与Mirai的代码相同,用于生成具有以下排除子网的IP地址。
恶意软件对每个生成的IP地址进行一组漏洞测试。 这些测试可查找以下任何设备和/或基础架构中的漏洞:
特定漏洞扫描流量如下:
GET /cgi-bin/user/Config.cgi?.cab&action=get&category=AccountHost:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 |
AVTECH |
GET / shell?echo + jaws + 123456; cat + / proc / cpuinfo HTTP / 1.1Host:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 |
JAWS Web服务器 |
“GET /upgrade_handle.php?cmd=writeuploaddir&uploaddir=%%27;echHost:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 |
网件 |
GET /board.cgi?cmd=cat%%20/etc/passwd HTTP / 1.1Host:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 |
VACRON |
GET /system.ini?loginuse&loginpas HTTP / 1.1Host:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 |
WIFICAM |
POST /command.php HTTP / 1.1Host:%d。%d。%d。%d
连接:保持活力 内容类型:application / x-www-form-urlencoded 内容长度:%d CMD =猫%% 20 /变种/ passwd的 |
DLINK DIR-600 |
GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&curpath=/¤tsetting.htm=1&cmd=echo+dgn+123456 HTTP / 1.1
主持人:%d。%d。%d。%d(主持人:%d。%d。%d。%d:%d) 连接:保持活力 |
NetGear DGN1000 |
POST /apply.cgi HTTP / 1.1Host:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 submit_button =诊断&change_action = gozila_cgi&submit_typ E =&start_ping行动=&提交= 0&NOWAIT = 1&ping_ip = %% 3B %% 20AAA BBB ||| %% 20 %% 3b中ping_size =&ping_times = 5&traceroute_ip = |
Linksys的 |
POST /hedwig.cgi HTTP / 1.1Host:%d。%d。%d。%d(主机:%d。%d。%d。%d:%d)
连接:保持活力 内容类型:text / xml Cookie:uid = qDxppsreSd 内容长度:%d <?xml version ='1.0'coding ='UTF-8'?> <postxml> <module> <servi CE> ../../../的htdocs / webinc / getcfg / DEVICE.ACCOUNT.xml </服务> </模块> </ postxml> |
DLINK DIR-8 |
这是从其中一个漏洞扫描中获取的PCAP示例:
C&C通讯
IoTroop的C&C后端由几个组件组成,每个组件都有一个独特的用途。
报告服务器
报告服务器用于收集被任何受感染设备发现易受攻击的所有设备的列表。
报告服务器以“f”子域名为前缀。 在我们研究时,我们能够识别出两个活动的报告服务器:
- hl852.com(222.112.82.231)
- ha859.com(222.112.82.231)
一旦发现设备易受攻击,IoTroop将以下列方式将其数据发送到报告服务器:
以下参数用作此HTTP GET请求的一部分:
控制器服务器用于控制所有受感染的设备,并负责执行所有第二阶段恶意负载并更新当前的恶意软件。
控制器服务器
每个受感染的设备不断从控制C&C服务器获取可用命令。 在研究时,我们能够识别两个主动控制服务器:
- ha859.com(27.102.101.121)
- hl852.com(27.102.101.121)从控制器发送到IoTroop客户端的命令和参数以JSON格式发送。 检索到的数据可以包含以下键值元组:
一旦接收到命令,就会对其进行解析以找到这些值中的任何一个,即查找“代码”作为要执行的操作,其余作为补充参数
它。 如上所述,这可能导致两个执行路径 - 普通下载或下载后执行。 这些概述如下:下载
如果端口存在且等于80,则构造格式为“http:// <ip> <url_path>”的字符串,否则将其设置为“http:// <ip>:<port> < url_path>“,使用”ip“,”port“和”path“的值作为要放置在字符串中的数据。
如果名称JSON值是完整路径,则将下载该文件并以此名称保存。 否则它将被放在/ tmp目录下。
在处理构造的URL之前,机器人将尝试按名称终止所有类似的进程,发出命令“killall <name>”,其中参数取自上述“name”键。 最后,URL将传递给下载功能。
下载函数将首先使用lstat检查文件的状态,以验证它是否存在并且对后续读取操作有效,然后将对其内容应用MD5哈希函数。
打开文件并读取文件后,将根据每个操作的状态相应地构建格式为“open:error \ success”或“read:error \ success”的假定报告或日志字符串,但此字符串为从未使用过,表明恶意软件仍处于调整阶段,处于开发阶段。
将检索到的散列与控制器在“md5”密钥中提供的散列进行比较,以便验证磁盘上的文件版本(如果确实存在)与服务器提供的版本不同。如果文件版本确实不同,将生成具有权限“r-xrwxrwx”的新文件,并且将建立到目标服务器(包含所需文件)的套接字。
IoTroop将构造一个HTTP GET请求并将其写入套接字,之后它将尝试以128字节的块(如果请求成功的话)读取其内容。 这些将被写入新创建的文件,并再次检查MD5,由控制器提供,以验证是否正确检索了内容。
为了完成通信,机器人将向控制器发出字符串“FIN \ n”。执行
该文件的执行将始终跟随下载。 在这种情况下,有几个选项,具体取决于“runtype”和“runport”键的值。
检查前者是否存在“mysel”子字符串,这将导致下载文件的执行与当前进程具有相同的参数。 这些通常将第二个参数设置为设备模型,将第三个参数设置为TCP端口。 这种行为可能对应于机器人的软件更新事件,表明它可能在未来进一步发展。
在任何其他情况下,下载的文件以给定的“runtype”和“runport”作为参数执行,或者仅使用“runtype”执行。
后一种情况将对应于任意模块或插件的执行,其可能是Slowloris DDoS实用程序(在构建服务器上找到)或任何其他类似的应用程序。 无论哪种方式,为了产生新进程,将使用命令“/ bin / sh sh -c <path_to_executable> <runtype> <runport>”。
在整个研究过程中,我们发现IoTroop恶意软件在其控制流程的不同阶段使用了以下样本。
名称 | 哈希 | 类型 | 拱 | 细节 |
一个 | 522EF21132B734853307DDDAC6B5DFB9 | 后门 | 臂 | 小后门,它侦听TCP 8888的原始shell命令,并在受感染的设备上执行它们。 |
米 | 83883F1C6B5423F0CA13B4278B431656 | 后门 | MIPS | |
BOT | 03AC15C3CF698510AA928CB93175BF55 | 未来 | MIPS | Mirai僵尸网络,默认配置。 似乎用于调试 |
S1 | 445EB00D8D5846886DEC7A36BF3FD829 | Slowloris | MIPS | DDoS工具 |
S2 | 711CD91EB920CC3C0F78AF275471E560 | Slowloris | MIPS | |
S4 | 9B2124E9BB5F4583DDA5388FC6EAFDC1 | Slowloris | MIPS | |
S5 | FFF2EADCA6C31BFCC69AF1419D5C793C | Slowloris | MIPS | |
S3 | 25960FD858AFB6FB6F49621A2DB8E8BC | Slowloris | MIPS | |
SA | 726D0626F66D5CACFEFF36ED954DAD70 | IoTroop | 臂 | 僵尸网络的核心,通过漏洞枚举招募新机器人 |
SM | 9AD8473148E994981454B3B04370D1EC | IoTroop | MIPS | 僵尸网络的核心,通过漏洞枚举招募新机器人 |
服务器 | 5A4E11C8D47F2868F4C0150DD4E18464 | Mini_Telnet | MIPS | telnet客户端和服务器的基本C实现https://github.com/qixiaohu/mini_telnet |
XGET | 6F91694106BB6D5AAA7A7EAC841141D9 | 滴管 | 臂 | IoTroop恶意软件滴管,下载并执行IoTroop示例(sa)。 |
第二阶段有效负载
概观
我们注意到另一组相关样本和C&C服务器,也在奇虎360的帖子中提到,似乎用于第二阶段有效载荷。
这些示例可以从下载服务器下载并执行IoTroop恶意软件。 样品如下表所述:
这些示例与不同的C&C服务器集进行通信,以报告感染和下载命令。 这些服务器以域/ IP地址的形式在样本内部进行硬编码,有时具有不同的端口,具体取决于确切的样本。
Lua集成的恶意软件分析根据从其中一个报告服务器收集的数据,向该服务器报告了大约4700个独特的设备感染,主要来自韩国的IP地址。
概观
这些示例使用Lua解释器和LuaSocket库进行静态编译,将Lua执行支持与灵活的网络功能集成在一起。 此外,它包含Mirai源代码,在调试模式下编译,由于代码中存在调试字符串,这一点很明显。 但是,我们分析的样本似乎没有使用Mirai代码,除了代码引用的一个调试子字符串,这可能是由于编译器优化。
多个调试字符串,详细输出和基础结构的一般状态的存在使我们相信这些样本仍处于测试或初始部署阶段。 由于使用了解释器的内部功能,开发人员也明白了Lua的解释器内部结构。
功能分析
样本主要功能的核心部分如下所示:
该恶意软件使用Lua解释器的内部函数初始化Lua引擎,加载LuaSocket库并定义一些自定义Lua全局变量,其中一些攻击者后来在其Lua代码中引用。
然后将函数推送到Lua引擎堆栈,然后定义为“攻击”。 这相当于在LUA脚本中定义一个名为“attack”的函数。 此字符串“攻击”被视为来自Mirai源代码的调试字符串的子字符串(由于编译器优化,这可能是一个有趣的工件):
然后,恶意软件利用内部Lua函数执行以下Lua脚本,该脚本作为字符串嵌入恶意软件中:
此脚本与恶意软件的硬编码C&C地址通信,实际上是主要负载。 首先,使用先前定义的全局变量将感染详细信息报告给报告C&C(bbk80.com)。
然后它进入一个无限循环,从命令C&C(cbk99.com)下载Lua脚本并执行它们。 它的工作原理是从C&C下载“run.lua”文件(Lua脚本)并将其作为参数传递给之前在main中定义的“攻击”函数。 “攻击”函数用作自定义“eval”函数,在分叉子进程中执行脚本:
如果由于某种原因加载和/或执行脚本失败,恶意软件将以中文打印错误字符串:
目前,C&C服务器上现有的“run.lua”脚本只打印字符串“Just Test”:
我们可以在名为“run.bak.txt”的Web服务器上看到另一个Lua脚本,它看起来像一个数据收集/更新脚本。 摘录如下所示:
攻击者可以轻松更新脚本并轻松指示僵尸网络执行任何任务。 这种强大的设置为攻击者提供了对受感染设备的灵活和动态控制,允许他们使用自定义,可更新的攻击代码轻松定位任何内容,并在不更新二进制文件本身的情况下改变恶意软件的行为。
来源:HTTPS://research.checkpoint.com/iotroop-botnet-full-investigation/