介绍
根工具包是一种危险的恶意软件。一旦被安装,它们通常非常难以检测到。与其他恶意软件相比,它们的代码通常更难编写,因此开发人员常常借用开源项目中的代码。由于根工具包非常引人注意,我们始终在野外寻找这类样本。
是一个相对较老的开源内核根工具包,广泛用于
Linux,最初针对内核 2.x,但目前已更新至针对 3.x内核。它可以隐藏进程、文件,甚至内核模块,使其更难被检测到。它还允许经过身份验证的用户模式进程与根工具包进行交互,以控制它,使攻击者能够通过使用单个根工具包来隐藏许多自定义恶意文件。
在2022 年初
,我们分析了一个主要基于 Adore-Ng
的根工具包,该根工具包在野外被发现,显然还在开发中。在获取样本后,我们检查了
.modinfo
部分,并注意到它是为特定内核版本编译的。
众所周知,即使可以通过使用
Linux 命令的 --force
标志“强制加载”模块,如果内核中找不到所需符号,这个操作也可能失败;这通常会导致系统崩溃。
insmod -f {module}
我们发现,内核模块可以在默认的
发行版中成功加载,因为我们发现的根工具包是为类似的内核版本编译的。
在查看文件的字符串时,我们迅速识别出内核根工具包中硬编码的文件名
PgSD93ql
,该文件名用于指代负载。这个负载的文件名可能被用来使其对系统管理员不那么明显,例如,它看起来像一个合法的
文件。
利用这个硬编码的文件名,我们提取了根工具包隐藏的文件。它是用 C 编程语言编写的一个编译后门木马;Avast 的杀毒引擎将此文件检测并分类为
ELF:Rekoob
——广泛被称为
恶意软件家族。Rekoobe
是一段植入合法服务器的代码。在这种情况下,它嵌入在一个伪造的 SMTP 服务器中,当收到特别构造的命令时会产生一个
shell。在本文中,我们将这个根工具包称为 Syslogk
根工具包,因为它在将特制数据写入 /proc/syslogk
文件时“暴露”了自己。
分析 Syslogk 根工具包
Syslogk
根工具包在很大程度上基于 Adore-Ng
,但加入了新的功能,使用户模式应用程序和内核根工具包更难被检测。
加载内核模块
要将根工具包加载到内核空间,必须大致匹配编译时使用的内核版本;不必严格相同。
vermagic=2.6.32-696.23.1.el6.x86_64 SMP mod_unload modversions
例如,我们能够在
虚拟机中毫不费力地加载此根工具包,使用的命令是 Linux 命令。
加载后,您会发现恶意驱动程序在使用
命令时不会出现在已加载内核模块的列表中。
公开根工具包
此根工具包具有 hide_module
函数,使用 的
函数将模块从内核模块的链接列表中删除。接下来,它也会相应地更新其内部的 module_hidden
标志。
幸运的是,根工具包在 proc_write
函数中实现了一个功能,该功能暴露了一个接口,在将值 1
写入文件 /proc/syslogk
时,可以揭示根工具包。
一旦根工具包被揭示,可以使用 Linux命令将其从内存中移除。本文的文件部分包含一些附加细节,这些细节将有助于以编程方式解除根工具包的隐藏。
Syslogk 根工具包功能概述
除了隐藏自己,使自己在植入时更难被检测外,Syslogk
还可以通过采取以下措施完全隐藏恶意负载:
- 根工具包的
hk_proc_readdir
函数会隐藏包含恶意文件的目录,从而有效地从操作系统中隐藏它们。 - 通过
hk_getpr
隐藏恶意进程——这是 Adore-Ng 中用于隐藏进程的函数的组合。 - 恶意负载将不在
Netstat
等工具的列表中显示;在运行时,它不会出现在服务列表中。为此,根工具包使用hk_t4_seq_show
函数。 - 恶意负载并非持续运行。攻击者在需要时通过向感染机器发送特制的 TCP 数据包(下面有详细信息)来远程执行它,并通过安装
netfilter hook
来检查流量。 - 攻击者也可以远程停止负载。这需要在根工具包中使用
硬编码密钥
并了解用于远程启动负载的magic packet
的某些字段。
我们观察到 Syslogk
根工具包(以及 Rekoobe 负载)在隐秘地与伪造 SMTP服务器结合使用时完美对齐。设想一下这种隐蔽性:一个后门不会立即加载,直到向机器发送某些 。当查询时,它就像一个合法的服务,隐藏在内存中,隐藏在磁盘上,远程“神奇”执行,隐藏在网络中。即使在网络端口扫描期间被发现,它仍然看起来像一个合法的
SMTP 服务器。
为了破坏操作系统并实现上述隐藏功能,Syslogk
使用了已经知晓的
和
函数,它们用于向 Page Table Entry
()
结构添加或移除写入权限。
在向 PTE 添加写入权限后,根工具包可以对在 hks
内部根工具包结构中声明的函数进行钩取。
PTE 钩子
函数类型| 偏移量| 函数名称
原始| hks+(0x38) * 0| proc_root_readdir
钩子| hks+(0x38) * 0 + 0x10| hk_proc_readdir
原始| hks+(0x38) * 1| tcp4_seq_show
钩子| hks+(0x38) * 1 + 0x10| hk_t4_seq_show
原始| hks+(0x38) * 2| sys_getpriority
钩子| hks+(0x38) * 2 + 0x10| hk_getpr
放置钩子的机制由 /proc/kallsyms
中识别可钩取的内核符号组成,这在根工具包的 get_symbol_address
函数中实现(代码重用自 )。在获取符号地址后,Syslogk
根工具包使用
项目来钩取函数。
理解目录隐藏机制
虚拟文件系统(VFS)是一个抽象层,允许对通常不是传统文件系统的内容执行类似于文件系统的操作。由于它是所有文件系统查询的入口点,因此是根工具包钩取的良好候选者。
Syslogk
根工具包钩取 VFS 函数以隐藏存储在文件 /etc/rc-Zobk0jpi/PgSD93ql
中的 Rekoobe负载,这并不令人惊讶。
钩取通过 hk_root_readdir
来完成,调用 nw_root_filldir
,在此处进行目录过滤。
正如您所见,任何包含子字符串 -Zobk0jpi
的目录都将被隐藏。
函数 hk_get_vfs
使用
打开文件系统的根。这个内核函数返回一个指向结构
的指针,结构中包含一个称为
的 file_operations
结构,最终存储通过 hk_root_readdir
钩取的
函数。
当然,这个功能并不是新鲜事。您可以查找 Adore-Ng
的源代码,看到
。
理解进程隐藏机制
在下面的屏幕截图中,您可以看到 Syslogk
根工具包(屏幕右侧的代码)为隐藏名为 PgSD93ql
的进程做好了准备。因此,这个根工具包似乎比原始版本(屏幕左侧的 Adore-Ng)更简单。此外,可以在经过身份验证后选择要隐藏的进程。
上面提到的 Syslogk
根工具包的 hk_getpr
函数是
和 函数的组合,但它使用相同的机制来隐藏进程。
理解网络流量隐藏机制
Adore-Ng
根工具包允许从 Linux 程序(例如 Netstat
)中隐藏一组监听服务。它使用导出的
结构来
处理程序,该处理程序在 Netstat
查询监听连接时被内核调用。在
函数中,使用
在 seq->buf
中查找包含正在尝试隐藏的端口的十六进制表示。如果找到,则该字符串将被删除。
通过这种方式,后门将不会出现在感染机器的连接列表中。下一部分描述了此根工具包的其他有趣功能。
理解魔法数据包
根工具包不是持续运行负载,而是通过发送特制的网络流量数据包按需启动或停止。
这些数据包被称为“魔法数据包”,因为它们具有特定的格式和特殊的能力。在此实现中,攻击者可以触发操作,而无需在感染机器上有一个开放的监听端口,从而使命令以某种方式“神奇”地在系统中执行。
启动 Rekoobe 负载
Syslogk
根工具包检查的 magic packet
用于启动 Rekoobe
伪造 SMTP服务器,过程相对简单。首先,它检查数据包是否为 TCP 数据包,并在这种情况下检查 “源端口”,预期为 59318
。
如果魔法数据包符合上述条件,根工具包将执行 Rekobee
。
当然,在执行伪服务之前,根工具包会通过调用根工具包函数 pkill_clone_0
终止所有现有的程序实例。此函数包含硬编码的进程名称
PgSD93ql
;它只是通过
发出 KILL
信号来终止 Rekoobe
进程。
要在用户模式下执行启动 Rekoobe
伪服务的命令,根工具包通过结合调用以下内核 API 来执行该命令:
,
,和
。
/bin/sh -c /etc/rc-Zobk0jpi/PgSD93ql
本文的文件部分展示了如何手动(使用 Python)构造启动 Rekoobe
负载的 TCP “魔法数据包”。
在下一部分中,我们描述了更复杂的形式的“魔法数据包”。
停止 Rekoobe 负载
由于攻击者不希望网络中的其他人能杀死 Rekoobe
,因此杀死 Rekoobe
的 magic packet
必须匹配先前用于启动
Rekoobe
的魔法数据包中的某些字段。此外,该数据包还必须满足额外的要求——它必须包含一个在根工具包中硬编码的密钥,并位于 magicpacket
的一个变量偏移量中。检查的条件包括:
- 检查当根工具包通过“魔法数据包”执行
Rekoobe
时启用的标志。只有在该标志启用时,它才会继续。 - 检查 TCP 头的
Reserved
字段,确保其为0x08
。 源端口
必须在63400
到63411
之间(包括两者)。目标端口
和源地址
必须与发送magic packet
启动Rekoobe
时使用的相同。- 最后,检查硬编码的密钥。在这种情况下,密钥是:
D9sd87JMaij
硬编码密钥的偏移量也在数据包中设置,而不是在硬编码的偏移量中;它是计算得出的。更准确地说,它是在数据包的 data offset
字节(TCP头)中设置的,该字节在右移 4 位
并乘以 4
后,将指向期待的 Key
的偏移量(如下图所示,注意根工具包以反向顺序比较 Key
)。
在我们的实验中,我们在 data offset
(TCP 头)使用值 0x50
,因为在右移 4 位后,可以得到 5,乘以 4 等于 20
。因为
20 恰好是 TCP 报头的大小,通过使用该值,我们能够将密钥放置在数据包的数据显示部分开始的位置。
如果您对我们是如何从零开始实现此 magic packet
感到好奇,请参见本文下面的文件部分。
分析 Rekoobe
当感染的机器接收到适当的 magic packet
时,根工具包会在用户模式空间启动隐藏的 Rekoobe
恶意软件。
它看起来像一个无辜的 SMTP 服务器,但在处理 starttls
命令时,存在一个可以被执行的后门命令。在合法的服务中,此命令由客户端发送到服务器,通知服务器希望开始 TLS 协商。
要触发 Rekoobe
的后门命令(生成一个 shell),攻击者必须通过 TLS 发送字节 0x03
,后跟经过 Tag LengthValue
(TLV)编码的数据。在这里,标签是符号 %
,长度由四个数字字符指定,值(请注意,长度和值是任意的,但不能为零)。
此外,要建立 TLS 连接,您需要在 Rekoobe
中嵌入的证书。
请查看下面的文件部分,以获取证书和我们开发的与 Rekoobe
连接的 Python 脚本。
Rekoobe 负载和 Syslogk 根工具包的来源
Rekoobe
显然基于开源项目
;这是基于字符和变量赋值中所观察到的顺序,多个地方以相同的顺序出现。
另一方面,如果您查看 Syslogk
根工具包,即使它是新的,您会注意到对 TinySHell
的引用早在 2018 年 12 月 13日就已存在。
证据表明,威胁行为者开发了 Rekoobe
和 Syslogk
来共同运行它们。我们很高兴地说我们的用户受到了保护,且希望这项研究能帮助他人。
结论
安全软件的一个结构优势是它通常具有在不同权限级别下运行的组件;在较低权限级别上运行的恶意软件无法轻易干扰在较高权限级别上运行的进程,从而便于处理恶意软件。
另一方面,内核根工具包可能很难检测和清除,因为这些恶意软件运行在特权层。这就是为什么系统管理员和安全公司必须尽快了解这种恶意软件,并为其用户编写保护措施的原因。
IoCs
Syslogk 样本
68facac60ee0ade1aa8f8f2024787244c2584a1a03d10cda83eeaf1258b371f2
Rekoobe 样本
11edf80f2918da818f3862246206b569d5dcebdc2a7ed791663ca3254ede772d
其他 Rekoobe 样本
fa94282e34901eba45720c4f89a0c820d32840ae49e53de8e75b2d6e78326074
fd92e34675e5b0b8bfbc6b1f3a00a7652e67a162f1ea612f6e86cca846df76c5
12c1b1e48effe60eef7486b3ae3e458da403cd04c88c88fab7fca84d849ee3f5
06778bddd457aafbc93d384f96ead3eb8476dc1bc8a6fbd0cd7a4d3337ddce1e
f1a592208723a66fa51ce1bc35cbd6864e24011c6dc3bcd056346428e4e1c55d
55dbdb84c40d9dc8c5aaf83226ca00a3395292cc8f884bdc523a44c2fd431c7b
df90558a84cfcf80639f32b31aec187b813df556e3c155a05af91dedfd2d7429
160cfb90b81f369f5ba929aba0b3130cb38d3c90d629fe91b31fdef176752421
b4d0f0d652f907e4e77a9453dcce7810b75e1dc5867deb69bea1e4ecdd02d877
3a6f339df95e138a436a4feff64df312975a262fa16b75117521b7d6e7115d65
74699b0964a2cbdc2bc2d9ca0b2b6f5828b638de7c73b1d41e7fe26cfc2f3441
7a599ff4a58cb0672a1b5e912a57fcdc4b0e2445ec9bc653f7f3e7a7d1dc627f
f4e3cfeeb4e10f61049a88527321af8c77d95349caf616e86d7ff4f5ba203e5f
31330c0409337592e9de7ac981cecb7f37ce0235f96e459fefbd585e35c11a1a
c6d735b7a4656a52f3cd1d24265e4f2a91652f1a775877129b322114c9547deb
2e81517ee4172c43a2084be1d584841704b3f602cafc2365de3bcb3d899e4fb8
b22f55e476209adb43929077be83481ebda7e804d117d77266b186665e4b1845
a93b9333a203e7eed197d0603e78413013bd5d8132109bbef5ef93b36b83957c
870d6c202fcc72088ff5d8e71cc0990777a7621851df10ba74d0e07d19174887
ca2ee3f30e1c997cc9d8e8f13ec94134cdb378c4eb03232f5ed1df74c0a0a1f0
9d2e25ec0208a55fba97ac70b23d3d3753e9b906b4546d1b14d8c92f8d8eb03d
29058d4cee84565335eafdf2d4a239afc0a73f1b89d3c2149346a4c6f10f3962
7e0b340815351dab035b28b16ca66a2c1c7eaf22edf9ead73d2276fe7d92bab4
af9a19f99e0dcd82a31e0c8fc68e89d104ef2039b7288a203f6d2e4f63ae4d5c
6f27de574ad79eb24d93beb00e29496d8cfe22529fc8ee5010a820f3865336a9
d690d471b513c5d40caef9f1e37c94db20e6492b34ea6a3cddcc22058f842cf3
e08e241d6823efedf81d141cc8fd5587e13df08aeda9e1793f754871521da226
da641f86f81f6333f2730795de93ad2a25ab279a527b8b9e9122b934a730ab08
e3d64a128e9267640f8fc3e6ba5399f75f6f0aca6a8db48bf989fe67a7ee1a71
d3e2e002574fb810ac5e456f122c30f232c5899534019d28e0e6822e426ed9d3
7b88fa41d6a03aeda120627d3363b739a30fe00008ce8d848c2cbb5b4473d8bc
50b73742726b0b7e00856e288e758412c74371ea2f0eaf75b957d73dfb396fd7
8b036e5e96ab980df3dca44390d6f447d4ca662a7eddac9f52d172efff4c58f8
8b18c1336770fcddc6fe78d9220386bce565f98cc8ada5a90ce69ce3ddf36043
f04dc3c62b305cdb4d83d8df2caa2d37feeb0a86fb5a745df416bac62a3b9731
72f200e3444bb4e81e58112111482e8175610dc45c6e0c6dcd1d2251bacf7897
d129481955f24430247d6cc4af975e4571b5af7c16e36814371575be07e72299
6fc03c92dee363dd88e50e89062dd8a22fe88998aff7de723594ec916c348d0a
fca2ea3e471a0d612ce50abc8738085f076ad022f70f78c3f8c83d1b2ff7896b
2fea3bc88c8142fa299a4ad9169f8879fc76726c71e4b3e06a04d568086d3470
178b23e7eded2a671fa396dd0bac5d790bca77ec4b2cf4b464d76509ed12c51a
3bff2c5bfc24fc99d925126ec6beb95d395a85bc736a395aaf4719c301cbbfd4
14a33415e95d104cf5cf1acaff9586f78f7ec3ffb26efd0683c468edeaf98fd7
8bb7842991afe86b97def19f226cb7e0a9f9527a75981f5e24a70444a7299809
020a6b7edcff7764f2aac1860142775edef1bc057bedd49b575477105267fc67
6711d5d42b54e2d261bb48aa7997fa9191aec059fd081c6f6e496d8db17a372a
48671bc6dbc786940ede3a83cc18c2d124d595a47fb20bc40d47ec9d5e8b85dc
b0d69e260a44054999baa348748cf4b2d1eaab3dd3385bb6ad5931ff47a920de
e1999a3e5a611312e16bb65bb5a880dfedbab8d4d2c0a5d3ed1ed926a3f63e94
fa0ea232ab160a652fcbd8d6db8ffa09fd64bcb3228f000434d6a8e340aaf4cb
11edf80f2918da818f3862246206b569d5dcebdc2a7ed791663ca3254ede772d
73bbabc65f884f89653a156e432788b5541a169036d364c2d769f6053960351f
8ec87dee13de3281d55f7d1d3b48115a0f5e4a41bfbef1ea08e496ac529829c8
8285ee3115e8c71c24ca3bdce313d3cfadead283c31a116180d4c2611efb610d
958bce41371b68706feae0f929a18fa84d4a8a199262c2110a7c1c12d2b1dce2
38f357c32f2c5a5e56ea40592e339bac3b0cabd6a903072b9d35093a2ed1cb75
bcc3d47940ae280c63b229d21c50d25128b2a15ea42fe8572026f88f32ed0628
08a1273ac9d6476e9a9b356b261fdc17352401065e2fc2ad3739e3f82e68705a
cf525918cb648c81543d9603ac75bc63332627d0ec070c355a86e3595986cbb3
42bc744b22173ff12477e57f85fa58450933e1c4294023334b54373f6f63ee42
337674d6349c21d3c66a4245c82cb454fea1c4e9c9d6e3578634804793e3a6d6
4effa5035fe6bbafd283ffae544a5e4353eb568770421738b4b0bb835dad573b
5b8059ea30c8665d2c36da024a170b31689c4671374b5b9b1a93c7ca47477448
bd07a4ccc8fa67e2e80b9c308dec140ca1ae9c027fa03f2828e4b5bdba6c7391
bf09a1a7896e05b18c033d2d62f70ea4cac85e2d72dbd8869e12b61571c0327e
79916343b93a5a7ac7b7133a26b77b8d7d0471b3204eae78a8e8091bfe19dc8c
c32e559568d2f6960bc41ca0560ac8f459947e170339811804011802d2f87d69
864c261555fce40d022a68d0b0eadb7ab69da6af52af081fd1d9e3eced4aee46
275d63587f3ac511d7cca5ff85af2914e74d8b68edd5a7a8a1609426d5b7f6a9
031183e9450ad8283486621c4cdc556e1025127971c15053a3bf202c132fe8f9
文件
Syslogk 研究工具
Rekoobe 研究工具
IoC 存储库
Syslogk 和 Rekoobe 根工具包的研究工具和 IoCs 可以在我们的 中找到。
标记为
,,,
分享:XFacebook