根工具包是一种危险的恶意软件。一旦被安装,它们通常非常难以检测到。与其他恶意软件相比,它们的代码通常更难编写,因此开发人员常常借用开源项目中的代码。由于根工具包非常引人注意,我们始终在野外寻找这类样本。
AdoreNg 是一个相对较老的开源内核根工具包,广泛用于 Linux,最初针对内核 2x,但目前已更新至针对 3x 内核。它可以隐藏进程、文件,甚至内核模块,使其更难被检测到。它还允许经过身份验证的用户模式进程与根工具包进行交互,以控制它,使攻击者能够通过使用单个根工具包来隐藏许多自定义恶意文件。
在2022 年初,我们分析了一个主要基于 AdoreNg 的根工具包,该根工具包在野外被发现,显然还在开发中。在获取样本后,我们检查了 modinfo 部分,并注意到它是为特定内核版本编译的。
众所周知,即使可以通过使用 insmod Linux 命令的 force 标志“强制加载”模块,如果内核中找不到所需符号,这个操作也可能失败;这通常会导致系统崩溃。
我们发现,内核模块可以在默认的 Centos 610 发行版中成功加载,因为我们发现的根工具包是为类似的内核版本编译的。
在查看文件的字符串时,我们迅速识别出内核根工具包中硬编码的文件名 PgSD93ql,该文件名用于指代负载。这个负载的文件名可能被用来使其对系统管理员不那么明显,例如,它看起来像一个合法的 PostgreSQL 文件。
利用这个硬编码的文件名,我们提取了根工具包隐藏的文件。它是用 C 编程语言编写的一个编译后门木马;Avast 的杀毒引擎将此文件检测并分类为 ELFRekoob广泛被称为 Rekoobe 恶意软件家族。Rekoobe 是一段植入合法服务器的代码。在这种情况下,它嵌入在一个伪造的 SMTP 服务器中,当收到特别构造的命令时会产生一个 shell。在本文中,我们将这个根工具包称为 Syslogk 根工具包,因为它在将特制数据写入 /proc/syslogk 文件时“暴露”了自己。
海外npv加速器Syslogk 根工具包在很大程度上基于 AdoreNg,但加入了新的功能,使用户模式应用程序和内核根工具包更难被检测。
要将根工具包加载到内核空间,必须大致匹配编译时使用的内核版本;不必严格相同。
例如,我们能够在 Centos 610 虚拟机中毫不费力地加载此根工具包,使用的命令是 insmod Linux 命令。
加载后,您会发现恶意驱动程序在使用 lsmod 命令时不会出现在已加载内核模块的列表中。
此根工具包具有 hidemodule 函数,使用 kernel API 的 listdel 函数将模块从内核模块的链接列表中删除。接下来,它也会相应地更新其内部的 modulehidden 标志。
幸运的是,根工具包在 procwrite 函数中实现了一个功能,该功能暴露了一个接口,在将值 1 写入文件 /proc/syslogk 时,可以揭示根工具包。
一旦根工具包被揭示,可以使用 rmmod Linux 命令将其从内存中移除。本文的文件部分包含一些附加细节,这些细节将有助于以编程方式解除根工具包的隐藏。
除了隐藏自己,使自己在植入时更难被检测外,Syslogk 还可以通过采取以下措施完全隐藏恶意负载:
根工具包的 hkprocreaddir 函数会隐藏包含恶意文件的目录,从而有效地从操作系统中隐藏它们。通过 hkgetpr 隐藏恶意进程这是 AdoreNg 中用于隐藏进程的函数的组合。恶意负载将不在 Netstat 等工具的列表中显示;在运行时,它不会出现在服务列表中。为此,根工具包使用 hkt4seqshow 函数。恶意负载并非持续运行。攻击者在需要时通过向感染机器发送特制的 TCP 数据包下面有详细信息来远程执行它,并通过安装 netfilter hook 来检查流量。攻击者也可以远程停止负载。这需要在根工具包中使用 硬编码密钥 并了解用于远程启动负载的 magic packet 的某些字段。我们观察到 Syslogk 根工具包以及 Rekoobe 负载在隐秘地与伪造 SMTP 服务器结合使用时完美对齐。设想一下这种隐蔽性:一个后门不会立即加载,直到向机器发送某些 magic packets。当查询时,它就像一个合法的服务,隐藏在内存中,隐藏在磁盘上,远程“神奇”执行,隐藏在网络中。即使在网络端口扫描期间被发现,它仍然看起来像一个合法的 SMTP 服务器。
为了破坏操作系统并实现上述隐藏功能,Syslogk 使用了已经知晓的 setaddrrw 和 setaddrro 函数,它们用于向 Page Table Entry (PTE) 结构添加或移除写入权限。
在向 PTE 添加写入权限后,根工具包可以对在 hks 内部根工具包结构中声明的函数进行钩取。
函数类型 偏移量 函数名称原始 hks(0x38) 0 procrootreaddir钩子 hks(0x38) 0 0x10 hkprocreaddir原始 hks(0x38) 1 tcp4seqshow钩子 hks(0x38) 1 0x10 hkt4seqshow原始 hks(0x38) 2 sysgetpriority钩子 hks(0x38) 2 0x10 hkgetpr
放置钩子的机制由 /proc/kallsyms 中识别可钩取的内核符号组成,这在根工具包的 getsymboladdress 函数中实现代码重用自 这个代码库。在获取符号地址后,Syslogk 根工具包使用 udis86 项目来钩取函数。
虚拟文件系统VFS是一个抽象层,允许对通常不是传统文件系统的内容执行类似于文件系统的操作。由于它是所有文件系统查询的入口点,因此是根工具包钩取的良好候选者。
Syslogk 根工具包钩取 VFS 函数以隐藏存储在文件 /etc/rcZobk0jpi/PgSD93ql 中的 Rekoobe 负载,这并不令人惊讶。
钩取通过 hkrootreaddir 来完成,调用 nwrootfilldir,在此处进行目录过滤。
正如您所见,任何包含子字符串 Zobk0jpi 的目录都将被隐藏。
函数 hkgetvfs 使用 filpopen 打开文件系统的根。这个内核函数返回一个指向结构 file 的指针,结构中包含一个称为 fop 的 fileoperations 结构,最终存储通过 hkrootreaddir 钩取的 readdir 函数。
当然,这个功能并不是新鲜事。您可以查找 AdoreNg 的源代码,看到 它是如何实现的。
在下面的屏幕截图中,您可以看到 Syslogk 根工具包屏幕右侧的代码为隐藏名为 PgSD93ql 的进程做好了准备。因此,这个根工具包似乎比原始版本屏幕左侧的 AdoreNg更简单。此外,可以在经过身份验证后选择要隐藏的进程。
上面提到的 Syslogk 根工具包的 hkgetpr 函数是 adorefindtask 和 shouldbehidden 函数的组合,但它使用相同的机制来隐藏进程。
AdoreNg 根工具包允许从 Linux 程序例如 Netstat中隐藏一组监听服务。它使用导出的 procnet 结构来 更改 tcp4seqshow 处理程序,该处理程序在 Netstat 查询监听连接时被内核调用。在 adoretcp4seqshow() 函数中,使用 strnstr() 在 seqgtbuf 中查找包含正在尝试隐藏的端口的十六进制表示。如果找到,则该字符串将被删除。
通过这种方式,后门将不会出现在感染机器的连接列表中。下一部分描述了此根工具包的其他有趣功能。
根工具包不是持续运行负载,而是通过发送特制的网络流量数据包按需启动或停止。
这些数据包被称为“魔法数据包”,因为它们具有特定的格式和特殊的能力。在此实现中,攻击者可以触发操作,而无需在感染机器上有一个开放的监听端口,从而使命令以某种方式“神奇”地在系统中执行。
Syslogk 根工具包检查的 magic packet 用于启动 Rekoobe 伪造 SMTP 服务器,过程相对简单。首先,它检查数据包是否为 TCP 数据包,并在这种情况下检查 “源端口”,预期为 59318。
如果魔法数据包符合上述条件,根工具包将执行 Rekobee。
当然,在执行伪服务之前,根工具包会通过调用根工具包函数 pkillclone0 终止所有现有的程序实例。此函数包含硬编码的进程名称 PgSD93ql;它只是通过 sendsig 发出 KILL 信号来终止 Rekoobe 进程。
要在用户模式下执行启动 Rekoobe 伪服务的命令,根工具包通过结合调用以下内核 API 来执行该命令:callusermodehelpersetup, callusermodehelpersetfns,和 callusermodehelperexec。
本文的文件部分展示了如何手动使用 Python构造启动 Rekoobe 负载的 TCP “魔法数据包”。
在下一部分中,我们描述了更复杂的形式的“魔法数据包”。
由于攻击者不希望网络中的其他人能杀死 Rekoobe,因此杀死 Rekoobe 的 magic packet 必须匹配先前用于启动 Rekoobe 的魔法数据包中的某些字段。此外,该数据包还必须满足额外的要求它必须包含一个在根工具包中硬编码的密钥,并位于 magic packet 的一个变量偏移量中。检查的条件包括:
检查当根工具包通过“魔法数据包”执行 Rekoobe 时启用的标志。只有在该标志启用时,它才会继续。检查 TCP 头的 Reserved 字段,确保其为 0x08。源端口 必须在 63400 到 63411 之间包括两者。目标端口 和 源地址 必须与发送 magic packet 启动 Rekoobe 时使用的相同。最后,检查硬编码的密钥。在这种情况下,密钥是:D9sd87JMaij硬编码密钥的偏移量也在数据包中设置,而不是在硬编码的偏移量中;它是计算得出的。更准确地说,它是在数据包的 data offset 字节TCP 头中设置的,该字节在右移 4 位 并乘以 4 后,将指向期待的 Key 的偏移量如下图所示,注意根工具包以反向顺序比较 Key。
在我们的实验中,我们在 data offsetTCP 头使用值 0x50,因为在右移 4 位后,可以得到 5,乘以 4 等于 20。因为 20 恰好是 TCP 报头的大小,通过使用该值,我们能够将密钥放置在数据包的数据显示部分开始的位置。
如果您对我们是如何从零开始实现此 magic packet 感到好奇,请参见本文下面的文件部分。
当感染的机器接收到适当的 magic packet 时,根工具包会在用户模式空间启动隐藏的 Rekoobe 恶意软件。
它看起来像一个无辜的 SMTP 服务器,但在处理 starttls 命令时,存在一个可以被执行的后门命令。在合法的服务中,此命令由客户端发送到服务器,通知服务器希望开始 TLS 协商。
要触发 Rekoobe 的后门命令生成一个 shell,攻击者必须通过 TLS 发送字节 0x03,后跟经过 Tag Length ValueTLV编码的数据。在这里,标签是符号 ,长度由四个数字字符指定,值请注意,长度和值是任意的,但不能为零。
此外,要建立 TLS 连接,您需要在 Rekoobe 中嵌入的证书。
请查看下面的文件部分,以获取证书和我们开发的与 Rekoobe 连接的 Python 脚本。
Rekoobe 显然基于开源项目 TinySHell;这是基于字符和变量赋值中所观察到的顺序,多个地方以相同的顺序出现。
另一方面,如果您查看 Syslogk 根工具包,即使它是新的,您会注意到对 TinySHell 的引用早在 2018 年 12 月 13 日就已存在。
证据表明,威胁行为者开发了 Rekoobe 和 Syslogk 来共同运行它们。我们很高兴地说我们的用户受到了保护,且希望这项研究能帮助他人。
安全软件的一个结构优势是它通常具有在不同权限级别下运行的组件;在较低权限级别上运行的恶意软件无法轻易干扰在较高权限级别上运行的进程,从而便于处理恶意软件。
另一方面,内核根工具包可能很难检测和清除,因为这些恶意软件运行在特权层。这就是为什么系统管理员和安全公司必须尽快了解这种恶意软件,并为其用户编写保护措施的原因。
Syslogk 和 Rekoobe 根工具包的研究工具和 IoCs 可以在我们的 IoC 存储库 中找到。
标记为 分析,linux,恶意软件,根工具包
分享XFacebook