防护思路
点击放大


uname -r查看,如果内核版本号低,可以使用apt的包进行升级,如果过高可以自行搜索kernel downgrade的方法5.4.0-126-generic + ssh remote 到虚拟机,并使用虚拟机快照,当rootkit将环境搞崩之后可以快速恢复git clone仓库到本地make,生成目标文件make install安装模块具体细节参见项目Makefile的编写
rootkit是一种恶意软件,攻击者可以在获得 root 或管理员权限后安装它,从而隐藏入侵并保持root权限访问。rootkit可以是用户级的,也可以是内核级的。关于rootkit的详细介绍可以参考
有许多技术可以实现rootkit,本项目使用的是通过编写LKM(Linux kernel module)并hook系统调用表的方式。这种方式具有诸多优点,比如,rootkit作为内核模块可以动态的加载和卸载。大多数rootkit也都是通过LKM的方式实现的
一个简单的LKM示例
在完成了对应Makefile的编写之后,使用make命令可以编译出ko文件(kernel object),使用insmod rootkit.ko命令可以安装内核模块,使用rmmod rootkit可以卸载rootkit模块,使用dmesg命令可以打印程序中printk的信息
用户进程通过系统调用使用内核服务。系统调用会进入内核,让内核执行服务然后返回,关于系统调用的更多信息,可以使用man -k syscall获取。如下图所示,hook可以劫持正常的系统调用,让内核执行我们自行设计的函数,从而实现我们自己想要的功能
!hook
比如,当用户使用ls命令列出该目录下所有文件的时候,本质上是使用了getdents64系统调用,如果我们将getdents64的地址替换为我们自己构造的函数hook_getdents64 ,即可劫持系统调用流程。因此,只要我们分析清楚了某一个shell命令底层所执行的系统调用,并成功对其进行hook,那么就可以成功实现rootkit的种种目的
strace 命令可以对系统调用进行跟踪,这可以帮助我们分析命令的函数调用链
回到hook系统调用这个事情上来,内核中有一张系统调用表,存放了所有的系统调用的地址,我们需要找到这张表的地址,才能对系统调用“偷梁换柱”——将原本的syscall的地址替换为我们自己实现的syscall地址。也可以将系统调用表看做是一个数组,系统调用号为其索引,不同的系统调用号对应着不同的系统调用。需要小心的是,相同的系统调用函数,对于不同的架构,调用号是不同的。这个页面列出了 Linux 支持的架构的所有系统调用
查找系统调用表的地址有很多方法,比如:
注意,由于rootkit与系统内核版本是强相关的,所以对于不同的内核,查找系统调用表的方式也不同,比如有的版本的内核无法使用kallsyms得到系统调用表地址,那么就可以考虑使用ftrace
使用kallsyms:
使用ftrace:
在某些内核版本中,/proc/kallsyms文件存储了系统调用和系统调用的地址信息,我们可以使用命令行获取:
同样的,对于不同的内核,系统调用函数的声明不同,这是一个对比:
asmlinkage是一个宏,告诉编译器在 CPU 堆栈上查找函数参数,而不是寄存器。众所周知,用户态程序调用syscall的时候,会下陷到内核态,此时会保存 CPU 堆栈中的所有寄存器(eax、ebx、ecx 等)。因此,从用户空间传递到内核空间的有关参数的信息都被保存在堆栈中,这也即是使用asmlinkage的原因
对于新的系统调用,存储在寄存器中的参数会先被复制到pt_regs结构体中,因此当我们编写hook函数的时候,需要先从这个结构体中获取对应的参数值
此外由于内核空间和用户空间是隔离的,地址的映射并不互通,因此需要使用copy_to_user和copy_from_user进行数据的传输
cred是一个记录进程credentials信息的结构体,具体定义在cred.c头文件中prepare_creds()返回当前进程的cred结构commit_creds()将这个cred应用于当前进程,因此我们只需要对cred结构体进行修改即可实现提权hook kill实现提权,当我们在shell中输入kill -64 \<num\>的时候会将shell提权到root,可以使用id命令验证这一点
lsmod命令可以列出已安装的内核模块,rmmod可以删除。模块隐藏也即是让lsmod命令无法输出我们的模块
内核使用module结构体存储模块信息,可以看到module封装了list双向链表,下面的源码可以在module.h中找到
为了隐藏模块,我们只需把对应rootkit模块的list从全局链表中删除即可。内核已经替我们实现了list_del和list_add函数,它们被封装在list.h头文件中,我们调用即可。在下面的代码中,THIS_MODULE宏指向当前模块的module struct
值得注意的是,为了恢复节点,我们需要临时保存节点的信息
ls命令可以打印出文件,为了深入研究ls做了什么,可以使用strace命令进行追踪。strace具有许多有趣的选项,比如-c可以打印出统计表格, -p可以追踪某一进程,等等
一通分析后可以发现ls命令调用了getdents64 syscall(实际上有些较新的内核版本仍然会调用getdents函数而不是较新的getdents64,这个后面还会提到),该函数可以得到目录的entry,并返回读取的字节数。我们可以通过对该函数进行hook从而达到隐藏文件的目的
下面是hook_getdents64函数的设计,省略了一些报错处理和别的细节
为了设计出上面的代码我们需要详细理解linux_dirent结构体和linux_dirent64结构体,它们分别对应getdents函数和getdents64函数,后者是为了处理更大的文件系统和偏移而设计的,细节如下:
对于getdents函数的hook,与getdents64函数的hook有一些不同,这里暂且略去
linux内核维护了task_struct和pid两个链表,分布记录了进程的task_struct结构和pid结构
想要查看当前是否有rootkit进程有两个常规操作:
要想隐藏进程,就要考虑将rootkit相关的task struct和pid都摘除列表,即要从下面两点出发:
那么首先看下linux中使用的相关的结构
相关的函数
自定义的数据结构
使用的函数
大致的流程:
此时进程已经成功摘除链表被隐藏,但是需要记录对应结构,方便之后恢复
到此完成隐藏进程功能,并未后面恢复做准备
>端口隐藏即隐藏已经被使用的端口,在linux中查看已经使用的端口有两个命令,一个是netstat,一个是ss,两个命令调用的系统调用不同,因此实际隐藏的过程也不同
seq_operations定义的结构体为
seq_operations的show函数即为netstat要输出的信息,我们只需要将该函数的 hook掉,在hook之前需要先保存show函数的地址,对应的函数为set_seq_opeartions
我们在全局变量中声明了一个链表,变量名为hidden_port_list_head,它的作用为存储需要被隐藏的端口的信息,当想隐藏端口时,调用hide_connect函数,它的定义为
其中type为网络类型(tcp/udp/tcp6/udp6),port为端口号,该函数会将需要隐藏的端口添加到链表上。
当不想隐藏该端口时,使用hide_unconnect函数将该节点从链表中删除
隐藏端口的链表会在我们定义的hook函数中用到
首先要让定义的hook函数的参数与需要被hook的函数参数相同
hook函数首先判断网络类型,之后调用原show函数,如下
show函数会将需要展示的端口信息放在seq->buf中,而seq->count记录了buf的缓冲区长度,代码的逻辑为判断新增的缓冲区的字符串是否和想要的隐藏的端口信息相同,如下
模块编译、安装、卸载:
提权:
![]()
模块隐藏与恢复
![]()
进程隐藏与恢复
![]()
文件隐藏与恢复
![]()
端口隐藏与恢复
![]()
开发语言:C
Star 数:119
该项目属于防护思路方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕An LKM-based Linux kernel security research prototype for studying rootkit behavior and defensive detection techniques.展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。
从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。
1. 下载源码压缩包,解压到本地环境。
2. 根据项目类型准备对应的运行环境与依赖。
3. 按照 README 中的步骤完成配置与部署。
4. 在隔离的测试环境中运行验证,避免影响生产系统。
本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。
| 资源标题 | hello-rootkit - An LKM-based Linux kernel security research protot |
| 所属分类 | 防护思路 |
| 发布作者 | admin |
| 发布时间 | 2026-10-06 00:08:43 |
| 下载权限 | 免费下载 |
| 附件数量 | 2 个下载链接 |
| 浏览次数 | 506 |
| 讨论数量 | 0 |
| 主题状态 | 正常讨论中 |