Rootkit 是非常危险的恶意软件,一旦侵入就很难被发现。开发 Rootkit 通常更加困难,很多攻击者都倾向于重用开源项目。
Adore-Ng 是一个相对较老的、开源的 Linux 内核 Rootkit,最初针对内核 2.x 版本开发,但目前已更新为针对内核 3.x 版本适用。该
Rootkit 可以隐藏进程、文件甚至内核模块,使其更难被发现。它还允许经过身份验证的用户模式进程与 Rootkit 交互以控制进程,从而允许攻击者使用单个
Rootkit 隐藏许多其他恶意软件。
2022 年早期,研究人员发现基于 Adore-Ng 开发而来的在野 Rootkit。根据 .modinfo 可以看出这是为特定内核版本编译的:
内核版本
如果使用 insmod --force 的命令强制将模块加载到内核中,内核找不到所需的符号就会导致系统奔溃。发现的 Rootkit
可以在不强制加载的情况下,在 CentOS 6.10 中成功加载。
Rootkit 中硬编码的文件名为 PgSD93ql,这也是要引用的 Payload 文件名。攻击者想将该名称贴近 PostgreSQL
的文件名称,不被发现。
硬编码文件
按图索骥找到被 Rootkit 隐藏的文件,实际为 C 写的后门。由于写入文件时显示 /proc/syslogk,将其命名为 Syslogk
Rootkit。
分析 Syslogk
Syslogk Rootkit 主要基于 Adore-Ng 开发,但也包含一些更为隐蔽的新功能。
加载内核模块
要将 Rootkit 加载到内核空间,需要与编译时使用的内核版本大致匹配,但不必严格相同。
通过 insmod 命令,即可在 Centos 6.10 中轻松加载该 Rootkit。但加载后使用 lsmod
命令,并不会看到内核模块列表中出现该恶意驱动程序。
掀开隐藏面纱
Rootkit 中的 hide_module 函数,使用内核 API list_del 从内核模块的链表中删除该模块。不过,Rootkit 在函数中实现了
proc_write 函数,当 /proc/syslogk 文件被写入 1 时,就会显示 Rootkit。
现形
一旦 Rootkit 被确认,就可以使用 rmmod 命令将其删除。
功能概述
Syslogk 使用了多种方式隐藏自身:
通过 hk_proc_readdir 隐藏包含恶意文件的目录
通过 hk_getpr 隐藏特定进程
通过 hk_t4_seq_show 隐藏特定服务
通过安装 netfilter hook 控制接收到的特制 TCP 数据包
通过硬编码的密钥利用特制 TCP 数据包远程启动 Payload
Syslogk 非常隐蔽,在特制的 TCP 数据包发送到实现主机前并不会加载后门,执行时也是打着 SMTP 合法服务的旗号进行隐蔽传输。
在为 PTE 增加了写权限后,Rootkit 就可以 Hook 指定函数:
Hook
函数
通过 /proc/kallsyms 获取到可 Hook 的内核符号地址后,Rootkit 使用
udis86对指定函数进行 Hook。
目录隐藏
Syslogk Rootkit Hook 了 VFS 函数来隐藏 /etc/rc-Zobk0jpi/PgSD93ql 文件。Hook 是通过
hk_root_readdir 调用 nw_root_filldir 目录过滤实现的。
部分代码
如上所示,任何包含 -Zobk0jpi 字符串的目录都会被隐藏。这一方式一点都不新鲜,可以查看 Adore-Ng
的[源码](https://github.com/yaoyumeng/adore-ng/blob/master/adore-
ng.c#L300)是如何实现的。
进程隐藏
Syslogk 进程隐藏的方式比 Adore-Ng 更简单,默认隐藏名为 PgSD93ql 的进程。
版本比较
流量隐藏
Rootkit 通过在 adore_tcp4_seq_show() 函数中利用 strnstr 函数查找特定端口的十六进制字符串,如果发现即删掉。以此,将如
netstat 的 Linux 应用程序查询监听连接时的结果进行过滤。
流量隐藏
这样,在查看失陷主机的连接情况时,就不会出现后门的连接。
特制 TCP 数据包
启动虚假 SMTP 服务器的特制 TCP 数据包非常简单,只要数据包符合 TCP 且来源端口为 59318 即可触发。
启动
启动服务前,Rootkit 会调用 pkill_clone_0 终止所有实例。然后通过
call_usermodehelper_setup、call_usermodehelper_setfns 和
call_usermodehelper_exec 的内核 API 启动服务。
/bin/sh -c /etc/rc-Zobk0jpi/PgSD93ql
停止服务的特制 TCP 数据包要求高很多:
检查启用执行标志
检查 TCP 头中的 ReservedTCP 为 0x08
检查源端口在 63400 到 63411 之间
检查源 IP 与目的端口与启动的特制 TCP 数据包一致
检查硬编码的密钥 D9sd87JMaij
硬编码的密钥的偏移量是通过 TCP 头中的 data offset 进行设置的,将 4 bit 的字节向右移动并乘以 4 后即可指向预期偏移量。
偏移量
在分析时,data offset 使用的值为 0x50,右移后会得到 20。这正好是 TCP 头的大小,使用这个值可以将密钥放在数据包数据部分的开头位置。
分析 Rekoobe
通过特制 TCP 数据包启动 Rekoobe 后,Rekoobe 看起来像一个普通的 SMTP 服务器。但其中存在后门指令
starttls,在正常情况下该指令是要开始 TLS 协商。
后门指令
为了触发 Rekoobe 后门,攻击者通过 TLS 发送 0x03 字节,随后是 TLV 格式的编码数据。
传送数据
溯源
如下所示,Rekoobe 显然是基于
TinySHell开源项目。
相似对比
另一方面,在 Syslogk Rootkit 中也有对 TinySHell 的引用,如下所示:
相似引用
最后
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取: