top of page
Search
Writer's pictureIYP

针对新型 Torii 僵尸网络的技术分析 - 这次不是另一个 Mirai 的变种

这一新型的僵尸网络在成功入侵设备之后,会增强其隐蔽性和持久性。它具有一系列非常全面的功能,可以用于泄露敏感信息。其具有的模块化架构,能使用多层加密通信,获取命令或可执行文件并执行


2018年是 Mirai 和 QBot 变种不断涌现的一年。任何一个拥有简单技术的黑客都可以对 Mirai 源代码稍作修改,给它起上一个新名称,然后将其作为新的僵尸网络发布。


在过去的一周里,我们一直在监测一个新型的恶意软件,称之为 Torii。与 Mirai 和其他目前已知的僵尸网络不同,它使用了一些比较高级的技术。


与绝大多数 IoT 僵尸网络不同,这一新型的僵尸网络在成功入侵设备之后,会增强其隐蔽性和持久性。它不会像一般的僵尸网络那样,攻击网络中的其他设备,也不会挖掘加密货币。相反,它具有一系列非常全面的功能,可以用于泄露敏感信息。其具有的模块化架构,能使用多层加密通信,获取命令或可执行文件并执行


此外,Torii 可以感染多种架构的设备,并具有良好的兼容性,包括 MIPS、ARM、x86、x64、PowerPC、SuperH 等,是目前为止我们所见过的兼容范围最广的恶意软件


根据监测结果,我们发现其自 2017 年12月以来就开始活动,甚至活动时间可能更早。


最后,对 @VessOnSecurity 的研究成果表示感谢,他在 Twitter 上发表了一篇关于该样本的分析,他是从自己的蜜罐上获取到这一样本的。


根据这位安全研究人员的说法,这一僵尸网络从 Tor 出口节点对他的蜜罐进行了 Telnet 攻击,因此我们决定将这个僵尸网络命名为 Torii。


在本文中,我们重点说明迄今为止对这一僵尸网络的了解,分析其传播过程、各个阶段以及一些重要特征。目前,针对该僵尸网络的分析仍在进行中,如果有更进一步的调查结果,我们也会及时更新。


先从感染向量开始。


对初始 Shell 脚本的分析


在感染链的开始阶段,首先针对目标设备的弱口令进行 Telnet 攻击,然后执行初始 Shell 脚本。这一脚本与 IoT 恶意软件所经常使用的脚本完全不同,因为它更为复杂。


脚本首先尝试检测目标设备的体系结构,然后尝试下载相应的 Payload。Torii 支持的体系结构非常多,包括基于 x86_64、x86、ARM、MIPS、Motorola 68k、SuperH、PPC 的设备,支持多种位宽和字节顺序。这样一来,Torii 的感染范围就非常广泛,能够在众多常见的设备上运行。

恶意软件使用多个命令下载二进制 Payload,其执行的命令包括:wget、ftpget、ftp、busybox wget 和 busybox ftpget。它还同时使用多个命令,使其传递 Payload 的可能性达到最大。

如果无法使用 wget 或 busybox wget 命令通过 HTTP 协议下载二进制文件,那么它将会采用 FTP 协议。使用 FTP 协议时,需要经过身份验证。在脚本中提供了身份验证信息:

Username: u="<redacted>"

Password: p="<redacted>"

Port for FTP: po=404

IP of the FTP/HTTP server: 104.237.218.85 (This IP is still alive at the time of writing this post.)


FTP/HTTP 服务器 IP 地址:104.237.218.85(在本文撰写时,该 IP 地址仍然存在)


通过连接到 FTP 服务器,恶意软件能实现大量工作:

完整文件请点击: https://cdn2.hubspot.net/hubfs/486579/torii_directory_structure.txt?t=1538013373318


在服务器中,有来自 NGINX 和 FTP 服务器的日志、Payload 样本、将被感染设备定向到恶意软件所在主机的 Bash 脚本等。我们将在本文的最后讨论从日志中发现的内容。首先,分析一下在服务器托管的脚本。


第一阶段 Payload 分析(Dropper)


在脚本确定目标设备的架构之后,就会从服务器下载并执行对应的二进制文件。所有这些二进制文件都是 ELF 格式。在分析这些 Payload 时,我们发现它们都非常相似,并且仅仅是第二阶段 Payload 的 Dropper。值得注意的是,它们使用了多种方法使第二阶段能在目标设备上尽可能持久化。我们来深入了解其中的细节。


针对本文,我们分析的是 x86 的样本,其 SHA256 哈希值为:

0ff70de135cee727eca5780621ba05a6ce215ad4c759b3a096dd5ece1ac3d378


字符串混淆


由于样本经过混淆,我们首先需要尝试对其进行反混淆。因此,深入研究了一些文本字符串,以尝试找到该恶意软件的工作方式。第一和第二阶段中的绝大多数文本字符串都是通过简单的 XOR 方式进行加密的,并且在运行时需要特定字符串对它们进行解密。我们使用以下 IDA Python 脚本进行解密:

sea = ScreenEA()

max_size = 0xFF

for i in range(0x00, max_size):

b = Byte(sea+i)

decoded_byte = (b ^ (0xFEBCEADE >> 8 * (i % 4))) & 0xFF;

PatchByte(sea+i,decoded_byte)

if b == 0x00 or decoded_byte == 0x00:

break


e.g. F1 9A CE 91 BD C5 CF 9B B2 8C 93 9B A6 8F BC 00 → ‘/proc/self/exe’


安装第二阶段 ELF 文件


第一阶段的核心功能是安装另一个 ELF 文件,也就是第二阶段的可执行文件,它包含在第一阶段的 ELF 文件中。


该文件将会安装在一个伪随机的位置,这个位置是通过组合预先定义好的列表中的内容来生成的,目录列表如下:

  • "/usr/bin"

  • "/usr/lib"

  • $HOME_PATH

  • "/system/xbin"

  • "/dev"

  • $LOCATION_OF_1ST_STAGE

  • "/var/tmp"

  • "/tmp"

文件名列表如下:

  • “setenvi“

  • “bridged“

  • “swapper“

  • “natd“

  • “lftpd“

  • “initenv“

  • “unix_upstart“

  • “mntctrd“

  • etc.

通过上面的两个列表,就能生成目标文件的路径。


确保第二阶段持久化


然后,Dropper 需要确保能够执行第二阶段 Payload,并会保证其持久化。该恶意软件的独特之处在于它实现持久化的方式非常强大,至少采用了6种方法来确保文件能够保留在设备上,并且持续运行。恶意软件不是从6种方法中选择一种,而是全部都会执行:

  1. 通过向~.bashrc中注入代码,实现自动执行;

  2. 通过向 crontab 中添加“@reboot”子句,实现自动执行;

  3. 通过 systemd 自动执行“System Daemon”服务,实现自动执行;

  4. 通过 /etc/init 和 PATH 实现自动执行,将自身伪装成“System Daemon”服务;

  5. 通过修改 SELinux 策略管理,实现自动执行;

  6. 通过 /etc/inittab 实现自动执行。


完成后,它会投放自身内部的 ELF,也就是第二阶段的 Payload。


第二阶段 Payload 分析(Bot)


第二阶段 Payload 是一个完整的 Bot,能够从其 C&C 服务器执行命令。在 Payload 中还包含起其他功能,例如简单的反调试技术、数据泄露、多层通信加密等。


此外,第二阶段中发现的许多功能都与第一阶段 Payload 相同,这样看来很可能二者都是由同一作者创建的。


针对所有版本,第一阶段 Payload 中的代码几乎是相同的。然而我们在第二阶段中发现,不同硬件架构的二进制文件之间存在差异。为了能够对大多数版本中的核心功能进行分析,我们选取了x86架构版本的 Payload,其 SHA256 哈希值为:

5c74bd2e20ef97e39e3c027f130c62f0cfdd6f6e008250b3c5c35ff9647f2abe


反分析方法


该恶意软件所使用的反分析方法,不如我们在 Windows 或移动端恶意软件中看到的方法那么先进,但恶意软件作者仍在持续改进这一部分。


(1)在执行后,将会运行60秒的 sleep() 函数,可能会绕过简单的沙箱;


(2)通过 prctl(PR_SET_NAME) 调用,将进程名随机化为“[[a-z]{12,17}]”(正则表达式),以避免通过进程名称黑名单检测到该恶意软件;


(3)通过从可执行文件中删除符号,加大分析的难度。当我们首次从恶意服务器 104[.]237.218[.]85 下载样本时,所下载的样本都包含符号,这样使得分析过程更为建安。但有趣的是,在几天之后,我们下载的版本中已经不包含符号。除此之外,这两个版本之间没有任何差异。这样一来,我们能够判断,恶意软件作者还在持续改进恶意软件,以保护可执行文件难以被分析。


C&C 服务器


如前文所述,这个组件是一个与 C&C 服务器通信的 Bot。我们使用此前发现用于 XOR 的密码,对 C&C 地址再次执行 XOR 操作,发现似乎每个版本的 Torii 都包含3个 C&C 地址。我们所分析的恶意软件,会尝试从以下C&C服务器获取命令:

  • top[.]haletteompson[.]com

  • cloud[.]tillywirtz[.]com

  • trade[.]andrewabendroth[.]com

它尝试与列表中的第一个域名进行通信,如果失败将会转到下一个域名。此外,如果出现失败的情况,它还会尝试通过 Google 的 DNS 8.8.8.8 进行域名解析。

自2018年9月15日以来,这三个域名都解析到同一个IP 66[.]85.157[.]90。此外,在同一个IP上托管的其他一些域名也非常可疑:

  • cloud[.]tillywirtz[.]com

  • dushe[.]cc

  • editor[.]akotae[.]com

  • press[.]eonhep[.]com

  • web[.]reeglais[.]com

  • psoriasiafreelife[.]win

  • q3x1u[.]psoriasiafreelife[.]win

  • server[.]blurayburnersoftware[.]com

  • top[.]haletteompson[.]com

  • trade[.]andrewabendroth[.]com

  • www[.]bubo[.]cc

  • www[.]dushe[.]cc

在同一个 IP 地址托管了这么多看起来很奇怪的域名,这一点非常可疑。另外,在此之前, C&C 域名是解析到另一个不同的 IP 地址(184[.]95.48[.]12)。

通过更深入的挖掘,我们还发现了另一组属于 Torii 的 ELF 样本,其中包括3个不同的 C&C 地址:

  • press[.]eonhep[.]com

  • editor[.]akotae[.]com

  • web[.]reeglais[.]com

它们在此前都解析到相同的 IP 地址(184[.]95.48[.]12)。并且,press[.]eonhep[.]com 自2017年12月8日就开始解析到这一地址。因此,我们认为该恶意软件至少自2017年12月就开始存在,或者可能存在的时间更长。


C&C 通信


第二阶段通过 TCP 协议 443 端口,与这些 C&C 服务器以及其他加密层进行通信。有趣的是,它使用 443 端口来迷惑分析人员,因为443是 HTTPS 端口,而这一恶意软件实际上并没有使用 TLS 协议进行通信。针对每条消息(包括回复的内容),都会生成一个我们称之为“消息信封”的结构,每个信封都经过 AES-128 加密,并且其中包含一个 MD5 校验和,以确保其中的内容没有被修改或损坏。此外,每个信封都包含一条消息流,其中每条消息都通过简单的 XOR 方法进行加密,这与混淆字符串的加密方式不同。它看起来没有那么强大,因为通信中包含了解密的密钥。

Torii 在连接到 C&C 服务器时,还会发出以下隐私信息:

  1. 主机名;

  2. 进程 ID;

  3. 第二阶段可执行文件的路径;

  4. 在 /sys/class/net/%interface_name%/address 中找到的所有 MAC 地址及其哈希值,这部分内容形成了被感染用户的独有ID,允许恶意软件作者更容易地进行指纹识别和设备标记,这些内容也会同时存储在本地,其文件名诸如:GfmVZfJKWnCheFxEVAzvAMiZZGjfFoumtiJtntFkiJTmoSsLtSIvEtufBgkgugUOogJebQojzhYNaqyVKJqRcnWDtJlNPIdeOMKP、VFgKRiHQQcLhUZfvuRUqPKCtcrjmhtKcYQorAWhqAuZuWfQqymGnWiiZAsljnyNlocePAOHaKHvGoNXMZfByomZqEMbtkOEzQkQq、XAgHrWKSKyJktzLCMcEqYqfoeUBtgodeOjLgfvArTLeOkPSyRxqrpvFWRhRYvVcLeNtMKTdgFhwrypsRoIiDeObVxTTuOVfSkzgx 等;

  5. uname() 调用后获得的详细信息,包括 sysname、version、release 和 machine;

  6. 特定命令的输出结果,目的是获取目标设备相关的更多信息。

特定命令如下:

id 2>/dev/null

uname -a 2>/dev/null

whoami 2>/dev/null

cat /proc/cpuinfo 2>/dev/null

cat /proc/meminfo 2>/dev/null

cat /proc/version 2>/dev/null

cat /proc/partitions 2>/dev/null

cat /etc/*release /etc/issue 2>/dev/null


C&C 命令


在分析代码的过程中,我们发现 Bot 组件正在与 C&C 进行通信,并且会在无限循环中不断轮询,询问 C&C 服务器是否有任何命令需要执行。在收到命令后,它会回复命令执行的结果。每个消息信封中都包含一个特定值,用于指定其命令的类型,在回复内容中也会附带相同的值。目前,我们发现了如下命令类型:


(1)0xBB32:将文件从 C&C 存储到本地驱动器

  • 接收:从 C&C 接收的文件存储到本地的位置、文件、MD5 校验和

  • 回复:存储文件的文件路径、错误代码

(2)0xA16D:接收 C&C 轮询的间隔时间

  • 接收:DWORD 与 C&C 通信之间的暂停(Sleep)时间

  • 回复:代码为 66 的消息

(3)0xAE35:在 Shell 解释器中执行特定命令,并将输出结果发回 C&C

  • 接收:在 Shell 中要执行的命令(sh -c “exec COMMAND”)、间隔时间(以秒为单位,最大为 60)、带有 Shell 解释器路径的字符串(可选)

  • 回复:包含命令执行内容的输出结果(stdoout+stderr)

(4)0xA863:将文件从 C&C 存储到特定路径,并将其标志更改为“rwxr-xr-x”使其可执行,然后执行

  • 接收:从 C&C 接收的文件存储到本地的位置、文件、MD5 校验和

  • 回复:存储文件的文件路径、执行该文件后的返回代码

(5)0xE04B:检查本地系统上是否存在特定文件,并返回其大小

  • 接收:要检查的文件路径

  • 回复:文件路径、文件大小

(6)0xF28C:从所选文件 F 的偏移量O处读取N个字节,并将其发送到 C&C 服务器

  • 接收:要读取文件(F)的文件路径、QWORD 偏移量(O)、DWORD要读取的字节数(N)

  • 回复:文件内容、偏移量、读取的字节大小、读取内容的 MD5 校验和

(7)0xDEB7:删除指定的文件

  • 接收:要删除的文件名

  • 回复:错误代码

(8)0xC221:从特定 URL 下载文件

  • 接收:存储文件的路径、URL

  • 回复:存储文件的路径、URL

(9)0xF76F:获取新 C&C 服务器地址,并开始与其进行通信

  • 接收:?、新域名、新端口号、?

  • 回复:?、新域名、新端口号、?

(10)0x5B77/0x73BF/0xEBF0(可能还有其他代码):在目标设备上执行 Ping 或者获取心跳包

  • 接收:特定内容

  • 回复:重复收到的信息

对二进制文件 sm_packed_agent 的分析


在我们对服务器进行分析时,还发现了另一个有趣的二进制文件,我们设法从 FTP 服务器杉获取了名为“sm_packed_agent”的二进制文件。我们目前没有在服务器上发现这一二进制文件已经被使用的证据,但通过对其功能进行分析,发现它可以用于向目标设备发送任何远程命令。该二进制文件中包含一个使用 UPX 加壳的 GO 语言应用程序,其中包含一些有趣的字符串,表明它具有类似于服务器的功能:

使用的第三方库 - 该二进制文件,使用了以下第三方库:

  • https://github.com/shirou/gopsutil/host 

  • https://github.com/shirou/gopsutil/cpu

  • https://github.com/shirou/gopsutil/mem

  • https://github.com/shirou/gopsutil/net

可能的源代码名称 - 其可能的源代码名称如下:

  • /go/src/Monitor_GO/agent/agent.go

  • /go/src/Monitor_GO/sm_agent.go

其中,可能有一些库滥用了 BSD 许可证。显然,Torii 的作者并不关注侵权问题。


功能


sm_agent 的功能如下:

  • (1)在cmdline –p上使用一个带有端口号的参数;

  • (2)初始化加密,加载 TLS、密钥和证书;

  • (3)创建服务器,并监听 TLS 连接;

  • (4)等待以 BSON 格式编码的命令;

  • (5)使用命令处理程序,对命令进行处理:

  • 1: Monitor_GO_agent__Agent_GetSystemInfo

  • 2: Monitor_GO_agent__Agent_GetPerformanceMetrics

  • 7: Monitor_GO_agent__Agent_ExecCmdWithTimeout

TLS 加密、证书和密钥:

  • Agent 使用 ChaCha20-Poly1305 流密码进行 TLS 加密;

  • 同一目录下的密钥和证书;

  • 自签名的授权证书 ca.crt,签名为 Mayola Mednick;

  • 由 ca.crt 为 Dorothea Gladding 发布的 client.crt;

  • 由 ca.crt 为 Graham Tudisco 发布的 server.crt 和 server.key。

由于证书是自签名的,所以使用的名称也显然是虚假的。


Start-agent. sh:


该脚本将会首先终止任何先前启动的 sm_packed_agent 实例,然后在 TCP 协议 45709 端口上运行 sm_packed_agent,当出现运行失败的情况会尝试重新运行。

目前,还暂时不清楚 Torii 作者是如何使用的这项服务,但它非常通用,可以在设备上运行几乎任何命令。因为这应用程序是使用 GO 语言编写的,所以可以非常容易地重新编译,从而在几乎任何架构上使用。考虑到该文件是在恶意软件分发的主机上运行,说明它很可能是后门,或者是用于组织多台机器的服务。


恶意服务器日志分析


最后,我们分析了从 Nginx 服务器和 FTP 服务器(104[.]237.218[.]85)上发现的日志。通过这些访问日志,我们可以推断出 Torii 实际感染了多少客户端,或者有多少客户端试图下载该恶意软件。

在我们撰写此文章时,Torii 的作者已经禁用了 FTP 和 Nginx日志记录,但是根据已有的日志,我们可以生成一些简单的统计信息。


根据服务器上面的日志,在9月7日、8日、19日和20日,共有206个 IP 连接到服务器。

Access-2018-09-07.log – 包含54个不同的IP地址
Access-2018-09-08.log - 包含20个不同的IP地址
Access-2018-09-19.log - 包含189个不同的IP地址
Access-2018-09-20.log - 包含10个不同的IP地址

其中,有一个 IP 地址 38[.]124.61[.]111连接该服务器的次数达到了1056393 次。


通过查看日志,似乎有人使用了 DirBuster-1.0-RC1,尝试分析该服务器的内部结构。事实上, DirBuster 通常用于猜测 Web 服务器的目录和文件名,并且会生成大量请求。其实,这次扫描是完全没有必要的,因为针对Torii这样复杂的恶意软件,有更加有效的方法。


通过扫描38[.]124.61[.]111的端口,我们可以发现有下面几个端口是开启的:

在 27655 端口上,有一个 SSH Banner,其内容为:

SSH-2.0-OpenSSH_7.4p1 Raspbian-10+deb9u3

看上去,这个盒子正在运行 Raspbian。


除此之外,我们还可以对 FTP 服务器日志进行分析。

分析发现,有几个客户端曾连接,并下载了一些没有位于 FTP 服务器上的文件:

Sat Sep  8 08:31:24 2018 1 128.199.109.115 6 /media/veracrypt1/nginx/md/zing.txt b _ o r md ftp 0 * c

根据我们分析的日志内容,总共有 592 个不同的客户端,在几天时间之内从该服务器下载文件。需要提醒大家的是,一旦目标设备收到 Payload,就会停止连接到下载服务器,转为连接到 C&C 服务器。因此,我们通过该日志,就可以看到这些日志记录的时间段范围内,有多少网络中的新设备感染了这一恶意软件。


此外,有8个客户端同时使用了 HTTP 服务器和 FTP 服务器,这可能是由于HTTP方式下载失败,或是 Torii 作者在测试 Bash 脚本和服务器的功能。


由于没有证据,我们无法做出更多的推测。这台服务器可能只是众多感染目标连接的服务器之一,要揭示这个僵尸网络的真实规模,还需要进一步的调查。考虑到所分析的恶意软件的复杂程度,我们认为它可能是为了控制大量不同类型的设备而设计的。


结论


尽管我们的研究仍在继续,但目前的结论已经表明,Torii 是物联网恶意软件发展过程中的一个重要样本,它的复杂程度已经高于我们此前看到的水平。一旦它感染了某个设备,不仅会泄露设备自身的一些敏感信息,还会通过与 C&C 的通信允许 Torii 作者执行任意代码或传递任何Payload。这样一来,Torii就成为了一个可供今后持续使用的模块化平台。此外,由于 Payload 自身不会扫描其他目标,因此它在网络上非常隐蔽。◾️

60 views0 comments

Komentarze


bottom of page