操作系统:Ubuntu 20.04 LTS
Linux内核版本:5.15.0-50-generic
- Makefile
- rootkit.h
- DEVICE_NAME是insmod后在/dev中的名称
- rootkit.c
- rootkit_init,初始化时执行,流程为:
- 注册设备
- 创建device class
- 创建device inode
- 打开device,更改i_mode=0666,使得用户态可以写入
- /proc/modules 信息隐藏
- /sys/module/ 信息隐藏
- rootkit_exit
- rootkit_init,初始化时执行,流程为:
- functions.c
- 自定义的open、read、write、release和ioctl函数,应用于file_operations结构体
- write根据输入内容实现各种功能,具体见使用方法
- ioctl实现进程间通信,功能包括:
- 0x1001,隐藏进程
- 0x1002,恢复隐藏进程
- hidefile,隐藏文件
- 自定义的open、read、write、release和ioctl函数,应用于file_operations结构体
- hide_itself.c
- 打开/dev/intel_rapl_msrdv后,调用0x1001命令,隐藏本进程
- reshow.c
- 打开/dev/intel_rapl_msrdv后,调用0x1002命令,恢复隐藏的进程,传入的为进程编号
lsmod指令&/proc/modules文件,通过从__this_module.list双向链表中脱链实现 /sys/module/,通过调用kobject_del实现
隐藏.ko文件和/dev/设备名,使用ls和find指令,通过将文件的dentry从d_child中脱链实现,目前存在一些问题:
不能隐藏:
可以隐藏:
遍历/proc/pid,或使用 ps 指令,均无法找到 hide_itself 进程。通过从 task_struct 链表与 pid 链表中摘除进程实现。
make # 编译后获得rootkit.ko
sudo insmod rootkit.ko # 装载rootkit模块
echo 'hide xxx' > /dev/intel_rapl_msrdv # 隐藏文件xxx
echo 'root' > /dev/intel_rapl_msrdv # id和组id都提权为r0级
./hide_itself & # 执行用户态进程,进行自我隐藏
./reshow 0 # 恢复0号隐藏进程,即hide_itself
sudo rmmod rootkit # 卸载rootkit