h3xduck/TripleCross
GitHub: h3xduck/TripleCross
一个基于 Linux eBPF 技术的教育性 rootkit,展示 eBPF 在攻击场景中的库注入、执行劫持、C2 通信和持久化等高级能力。
Stars: 1945 | Forks: 241
# TripleCross




TripleCross 是一个 Linux eBPF rootkit,旨在展示 eBPF 技术的攻击能力。
TripleCross 的灵感来源于该领域之前的植入设计,特别是 Jeff Dileo 在 DEFCON 27[^1]、Pat Hogan 在 DEFCON 29[^2]、Guillaume Fournier 和 Sylvain Afchain 同样在 DEFCON 29[^3] 的工作,以及 Kris Nóva 的 Boopkit[^4]。我们复用并扩展了这些早期探索 eBPF 技术攻击能力时所开创的一些技术。
该 rootkit 是我在 UC3M 的学士论文中创建的。有关其设计的更多细节在[论文文档](https://github.com/h3xduck/TripleCross/blob/master/docs/ebpf_offensive_rootkit_tfg.pdf)中提供。
### 免责声明
该 rootkit **仅用于教育和学术目的**。本软件按“原样”提供,作者不对使用过程中可能发生的任何损害或意外承担责任。
请勿尝试使用 TripleCross 违反法律。滥用所提供的软件和信息可能会导致刑事指控。
## 目录
1. [功能特性](#features)
2. [TripleCross 概览](#triplecross-overview)
3. [构建与安装](#build-and-install)
4. [库注入模块](#library-injection-module)
5. [后门与 C2](#backdoor-and-c2)
6. [执行劫持模块](#execution-hijacking-module)
7. [Rootkit 持久化](#rootkit-persistence)
8. [Rootkit 隐蔽性](#rootkit-stealth)
9. [许可证](#license)
## 功能特性
1. 一个**库注入**模块,通过写入进程的虚拟内存来执行恶意代码。
2. 一个**执行劫持**模块,通过修改传递给内核的数据来执行恶意程序。
3. 一个**本地权限提升**模块,允许以 root 权限运行恶意程序。
4. 一个具备 **C2 功能的后门**,可以监控网络并执行从远程 rootkit 客户端发送的命令。它包含多种激活触发器,以确保这些操作被隐蔽地传输。
5. 一个 **rootkit 客户端**,允许攻击者建立 3 种不同类型的类 shell 连接,以发送控制远程 rootkit 状态的命令和操作。
6. 一个**持久化**模块,确保 rootkit 在重启事件后仍保持安装状态并维持完整权限。
7. 一个**隐蔽**模块,对用户隐藏与 rootkit 相关的文件和目录。
[^1]: J. Dileo. Evil eBPF: Practical Abuses of an In-Kernel Bytecode Runtime. DEFCON 27. [幻灯片](https://raw.githubusercontent.com/nccgroup/ebpf/master/talks/Evil_eBPF-DC27-v2.pdf)
[^2]: P. Hogan. Warping Reality: Creating and Countering the Next Generation of Linux Rootkits using eBPF. DEFCON 27. [演示](https://www.youtube.com/watch?v=g6SKWT7sROQ)
[^3]: G. Fournier and S. Afchain. eBPF, I thought we were friends! DEFCON 29. [幻灯片](https://media.defcon.org/DEF%20CON%2029/DEF%20CON%2029%20presentations/Guillaume%20Fournier%20Sylvain%20Afchain%20Sylvain%20Baubeau%20-%20eBPF%2C%20I%20thought%20we%20were%20friends.pdf)
[^4]: Kris Nóva. Boopkit. [github](https://github.com/kris-nova/boopkit)
## TripleCross 概览
下图展示了 TripleCross 的架构及其模块。
用于 rootkit 传输的原生套接字库 RawTCP_Lib 由我编写,并拥有[其自己的仓库](https://github.com/h3xduck/RawTCP_Lib)。
下表描述了主要的源代码文件和目录,以便于浏览:
| 目录 | 说明 |
| ------------- | ------------- |
| docs | 原始论文文档 |
| src/client | Rootkit 客户端源代码 |
| src/client/lib | RawTCP_Lib 共享库 |
| src/common | Rootkit 的常量和配置。它还包含了 eBPF 和用户空间端共有的元素实现,例如环形缓冲区 |
| src/ebpf | Rootkit 使用的 eBPF 程序源代码 |
| src/helpers | 包含用于测试 rootkit 模块功能的程序,以及在执行劫持和库注入模块中分别使用的恶意程序和库 |
| src/libbpf | 包含集成到 rootkit 中的 libbpf 库|
| src/user | Rootkit 使用的用户态程序源代码|
| src/vmlinux | 包含内核数据结构定义的头文件 (这是使用 libbpf 时推荐的方法) |
### 构建与安装
#### 环境要求
本研究项目已在以下环境中测试:
|| 发行版 | 内核 | GCC | CLANG | GLIBC |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
**版本** | Ubuntu 21.04 | 5.11.0 | 10.3.0 | 12.0.0 | 2.33 |
我们推荐使用 Ubuntu 21.04,默认情况下它将包含此处显示的软件版本。否则,可能会遇到[此处](https://github.com/h3xduck/TripleCross/issues/41#issuecomment-1176642139)描述的一些问题。
#### 编译
Rootkit 源代码使用两个 Makefile 进行编译。
```
# 构建 rootkit
cd src
make all
# 构建 rootkit client
cd client
make
```
下表详细描述了每个 Makefile 的用途:
| MAKEFILE | 命令 | 说明 | 生成文件 |
| ------------- | ------------- | ------------- | ------------- |
| src/client/Makefile | make | 编译 rootkit 客户端 | src/client/injector |
| src/Makefile | make help | 编译用于测试 rootkit 能力的程序,以及执行劫持和库注入模块的恶意程序和库 | src/helpers/simple_timer, src/helpers/simple_open, src/helpers/simple_execve, src/helpers/lib_injection.so, src/helpers/execve_hijack |
| src/Makefile | make kit | 使用 libbpf 库编译 rootkit | src/bin/kit |
| src/Makefile | make tckit | 编译 rootkit TC 出口程序 | src/bin/tc.o |
### 安装
一旦 rootkit 文件在 src/bin/ 下生成,必须按顺序加载 *tc.o* 和 *kit* 程序。在以下示例中,rootkit 后门将在网络接口 *enp0s3* 上运行:
```
// TC egress program
sudo tc qdisc add dev enp0s3 clsact
sudo tc filter add dev enp0s3 egress bpf direct-action obj bin/tc.o sec classifier/egress
// Libbpf-powered rootkit
sudo ./bin/kit -t enp0s3
```
### 攻击场景脚本
有两个脚本,*packager.sh* 和 *deployer.sh*,可以自动编译和安装 rootkit,就像攻击者在真实攻击场景中所做的那样。
* 执行 packager.sh 将在 *apps/* 目录下生成所有 rootkit 文件。
* 执行 deployer.sh 将安装 rootkit 并创建持久化文件。
必须首先使用以下参数配置这些脚本,以确保持久化模块的正常运行:
| 脚本 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/helpers/deployer.sh | CRON_PERSIST | 重启后执行的 Cron 任务 |
| src/helpers/deployer.sh | SUDO_PERSIST | Sudo 条目,用于授予无密码权限 |
## 库注入模块
Rootkit 可以劫持调用 *sys_timerfd_settime* 或 *sys_openat* 系统调用的进程的执行。这是通过覆盖进行调用的进程虚拟内存中的全局偏移表 (GOT) 部分来实现的。这会导致一个恶意库 (*src/helpers/injection_lib.c*) 被执行。该库将向攻击者机器生成一个反向 shell,然后将执行流返回给原始函数,而不会导致进程崩溃。
TripleCross 准备绕过常见的 ELF 加固技术,包括:
* ASLR
* Stack canaries
* DEP/NX
* PIE
* Full RELRO
它也准备好与 Intel CET 兼容的代码一起工作。
可以使用两个测试程序 *src/helpers/simple_timer.c* 和 *src/helpers/simple_open.c* 检查模块功能。或者,您可以尝试劫持任何系统进程(已测试并适用于 systemd)。
模块配置通过以下常量设置:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | TASK_COMM_NAME_INJECTION_
TARGET_TIMERFD_SETTIME | 在 syscall sys_timerfd_settime 处劫持的进程名 | | src/common/constants.h | TASK_COMM_NAME_INJECTION_
TARGET_OPEN | 在 syscall sys_openat 处劫持的进程名 | | src/helpers/injection_lib.c| ATTACKER_IP & ATTACKER_PORT| 攻击者机器的 IP 地址和端口| 在攻击者机器上接收反向 shell 可以使用 netcat 完成: ``` nc -nlvp
```
### 通过 GOT 劫持技术的库注入
TripleCross 中采用的技术包含 5 个阶段:
#### 定位 GOT 和返回地址
Rootkit 使用 tracepoint 程序钩住系统调用。从那里,它定位 GOT 部分中的地址,PLT 桩曾使用该地址调用负责该系统调用的 glibc 函数。
为了到达 GOT 部分,eBPF 程序使用存储在堆栈中的返回地址。请注意:
* .text 对 .plt 进行 *call*,因此 *rip* 作为 *ret* 保存在堆栈中。
* .plt 使用 .got *jump* 到 glibc,因此没有保存其他 *rip*。它也不修改或保存 *rbp* 的值。
* Glibc 执行 *syscall*,这不将 *rip* 保存在堆栈中,而是将其保存在 *rcx* 中。
因此,为了从 eBPF 检查堆栈中的地址是否是将引导我们到达正确 GOT 的返回地址,我们必须检查它是否是 PLT 桩的返回地址,该桩使用的 GOT 地址跳转到从 eBPF 钩住的系统调用的 glibc 函数。
已包含两种用于查找返回地址的技术:
* 对于 sys_timerfd_settime,eBPF 程序使用系统调用参数在堆栈中向前扫描。
* 对于 sys_openat,eBPF 程序使用 tracepoint 的 *pt_regs* 结构中的数据来扫描返回地址。
#### 定位 shellcode 的关键函数
Shellcode 必须动态生成以绕过 ASLR 和 PIE,它们会在每次程序执行时更改诸如 dlopen() 之类的函数地址。
#### 将 shellcode 注入到代码洞中
如果 ASLR 和 PIE 关闭,可以通过逆向工程 ELF 找到代码洞,但通常情况并非如此。eBPF 程序向用户空间 rootkit 程序发出请求,该程序使用 /proc 文件系统在 .text (可执行) 部分定位并写入代码洞。
#### 覆盖 GOT 部分
根据可执行文件上是否启用了 Partial 或 Full RELRO,eBPF 程序直接覆盖 GOT 部分或通过 /proc 文件系统覆盖。
#### 等待下一个系统调用
当被劫持程序中发出下一个系统调用时,PLT 部分使用修改后的 GOT 部分,从而劫持执行流并将其重定向到代码洞中的 shellcode。Shellcode 旨在防止程序崩溃,并调用恶意库 (*src/helpers/lib_injection.so*)。该库发出 fork() 并向攻击者机器生成反向 shell。之后恢复执行流。
## 后门与 C2
后门开箱即用,无需任何配置。可以使用 rootkit 客户端程序远程控制后门:
| 客户端参数 | 动作说明 |
| ------------- | ------------- |
| ./injector -c \<受害者 IP\> | 使用执行劫持模块生成明文伪 shell |
| ./injector -e \<受害者 IP\> | 通过基于模式的触发器命令后门生成加密伪 shell |
./injector -s \<受害者 IP\> | 通过多数据包触发器(两种类型)命令后门生成加密伪 shell |
./injector -p \<受害者 IP\> | 通过基于模式的触发器命令后门生成幽灵 shell |
./injector -a \<受害者 IP\> | 命令 rootkit 激活所有 eBPF 程序 |
./injector -u \<受害者 IP\> | 命令 rootkit 分离所有 eBPF 程序 |
./injector -S \<受害者 IP\> | 展示后门如何从内核隐藏消息 (简单 PoC) |
| ./injector -h | 显示帮助 |
### 后门触发器
动作通过后门触发器发送到后门,触发器根据属性 **K3** 的值指示后门要执行的动作:
| K3 值 | 动作 |
| ------------- | ------------- |
| 0x1F29 | 请求启动加密伪 shell 连接 |
| 0x4E14 | 请求启动幽灵 shell 连接 |
| 0x1D25 | 请求加载并附加所有 rootkit eBPF 程序 |
| 0x1D24 | 请求分离所有 rootkit eBPF 程序 (后门程序除外) |
#### 基于模式的触发器
此触发器隐藏命令和客户端信息,以便后门可以识别它,但同时对于外部网络监视器来说看起来足够随机。它基于最近发现的 NSAkit [Bvp47](https://www.pangulab.cn/files/The_Bvp47_a_top-tier_backdoor_of_us_nsa_equation_group.en.pdf) 使用的触发器。
#### 多数据包触发器
此触发器由多个 TCP 数据包组成,后门负载隐藏在数据包头中。此设计基于 Vault 7 泄露中描述的 CIA [Hive](https://wikileaks.org/vault7/document/hive-DevelopersGuide/hive-DevelopersGuide.pdf) 植入程序。使用以下负载:
然后对上述负载计算滚动 XOR,并根据 rootkit 客户端选择的模式将其分成多个部分。TripleCross 支持隐藏在 TCP 序列号上的负载:
以及 TCP 源端口:
### 后门伪 Shell
客户端可以建立 rootkit 伪 shell,这是一种特殊的 rootkit 到 rootkit 客户端的连接,它模拟 shell 程序,使攻击者能够远程执行 Linux 命令并获得结果,就像直接在受感染机器上执行一样。我们的 rootkit 中包含多种伪 shell:
#### 明文伪 Shell
此 shell 在执行劫持模块成功运行后生成,该模块将执行一个与 rootkit 客户端建立连接的恶意文件,如下所示:
#### 加密伪 Shell
Rootkit 客户端可以随时请求加密伪 shell,它由 rootkit 和 rootkit 客户端之间的 TLS 连接组成。在加密连接内部,遵循传输协议来通信命令和信息,类似于明文伪 shell 中的协议。
生成加密伪 shell 需要后门监听触发器,它接受基于模式的触发器或两种类型的多数据包触发器:
#### 幽灵 Shell
幽灵 shell 结合使用 XDP 和 TC 程序来克服 eBPF 在网络方面的限制,特别是它无法生成新数据包。为此,后门修改现有流量,用 C2 传输的数据覆盖负载。原始数据包不会丢失,因为 TCP 重传会在短时间后再次发送原始数据包(未经修改)。
以下协议说明了使用幽灵 shell 执行命令期间的流量:
幽灵 shell 由 rootkit 客户端请求,客户端发出一个由后门执行的命令:
受感染机器发送任何 TCP 数据包后,后门将其覆盖,客户端显示响应:
## 执行劫持模块
原则上,eBPF 程序不能自行启动程序的执行。该模块展示了恶意 rootkit 如何利用良性程序在用户空间执行恶意代码。该模块实现两个目标:
* 利用其他程序的执行来执行恶意用户程序。
* 对用户空间透明,也就是说,如果我们劫持一个程序的执行以运行另一个程序,原始程序也应该以最少的延迟被执行。
该模块通过劫持 sys_execve() 系统调用来工作,修改其参数以便运行恶意程序 (*src/helpers/execve_hijack.c*)。此修改的方式使得恶意程序随后可以使用原始参数执行原始程序,以避免引起用户空间的疑虑。下图总结了整体功能:
原始 sys_execve() 调用的参数被修改,以便原始参数不会丢失(使用 argv[0]),以便可以在恶意程序之后执行原始程序:
我们包含了一个示例测试程序 (*src/helpers/simple_execve.c*) 用于测试执行劫持模块。该模块也可以劫持系统中的任何调用,具体取决于配置:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | PATH_EXECUTION_HIJACK_PROGRAM | 成功执行 sys_execve 调用后要执行的恶意程序的位置 |
| src/common/constants.h | EXEC_HIJACK_ACTIVE | 停用 (0) 或激活 (1) 执行劫持模块 |
| src/common/constants.h | TASK_COMM_RESTRICT_HIJACK_ACTIVE | 劫持任何 sys_execve 调用 (0) 或仅 TASK_COMM_NAME_RESTRICT_HIJACK 中指定的调用 (1) |
| src/common/constants.h | TASK_COMM_NAME_RESTRICT_HIJACK | 从中劫持 sys_execve 调用的程序名称 |
成功劫持后,该模块将自行停止。恶意程序 *execve_hijack* 将监听来自 rootkit 客户端的明文伪 shell 请求。
## Rootkit 持久化
受感染机器重启后,所有 eBPF 程序将从内核卸载,用户态 rootkit 程序将被杀死。此外,即使 rootkit 可以再次自动运行,它也不再拥有再次附加 eBPF 程序所需的 root 权限。Rootkit 持久化模块旨在解决这两个挑战:
* 在机器重启事件后自动且无需用户交互地执行 rootkit。
* 一旦 rootkit 在机器中第一次执行时获得了 root 权限,即使重启后也必须保持这些权限。
TripleCross 使用在 *cron.d* 和 *sudoers.d* 下创建的两个秘密文件来实现此功能。这些条目确保 rootkit 在重启后自动以完整权限加载。这些文件由 *deployer.sh* 脚本创建和管理:
该脚本包含两个常量,必须为目标系统上要感染的用户配置这些常量:
| 脚本 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/helpers/deployer.sh | CRON_PERSIST | 重启后执行的 Cron 任务 |
| src/helpers/deployer.sh | SUDO_PERSIST | Sudo 条目,用于授予无密码权限 |
## Rootkit 隐蔽性
持久化模块基于创建额外文件,但它们最终可能会被系统所有者或某些软件工具发现,因此将它们留在系统中存在风险。此外,rootkit 文件需要存储在某个位置,在这些位置它们可能会被发现。
考虑到上述情况,隐蔽模块提供以下功能:
* 对用户完全隐藏目录(以便我们可以将所有 rootkit 文件隐藏在其中)。
* 隐藏目录中的特定文件(我们需要隐藏持久化文件,但无法完全隐藏 *sudoers.d* 或 *cron.d* 目录,因为它们属于正常的系统功能)。
Rootkit 隐藏的文件和目录可以通过以下配置常量进行自定义:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | SECRET_DIRECTORY_NAME_HIDE | 要隐藏的目录名称 |
| src/common/constants.h | SECRET_FILE_PERSISTENCE_NAME | 要隐藏的文件名称 |
默认情况下,TripleCross 将隐藏任何名为 "*ebpfbackdoor*" 的文件和一个名为 "*SECRETDIR*" 的目录。该模块在 rootkit 安装后自动激活。
用于实现此功能的技术包括篡改 sys_getdents() 系统调用的参数:
## 许可证
TripleCross rootkit 和 rootkit 客户端根据 GPLv3 许可证授权。参见 [LICENSE](https://github.com/h3xduck/TripleCross/blob/master/LICENSE)。
[RawTCP_Lib](https://github.com/h3xduck/RawTCP_Lib) 库根据 MIT 许可证授权。
原始论文文档和包含的图表根据 [Creative Commons BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) 发布。
用于 rootkit 传输的原生套接字库 RawTCP_Lib 由我编写,并拥有[其自己的仓库](https://github.com/h3xduck/RawTCP_Lib)。
下表描述了主要的源代码文件和目录,以便于浏览:
| 目录 | 说明 |
| ------------- | ------------- |
| docs | 原始论文文档 |
| src/client | Rootkit 客户端源代码 |
| src/client/lib | RawTCP_Lib 共享库 |
| src/common | Rootkit 的常量和配置。它还包含了 eBPF 和用户空间端共有的元素实现,例如环形缓冲区 |
| src/ebpf | Rootkit 使用的 eBPF 程序源代码 |
| src/helpers | 包含用于测试 rootkit 模块功能的程序,以及在执行劫持和库注入模块中分别使用的恶意程序和库 |
| src/libbpf | 包含集成到 rootkit 中的 libbpf 库|
| src/user | Rootkit 使用的用户态程序源代码|
| src/vmlinux | 包含内核数据结构定义的头文件 (这是使用 libbpf 时推荐的方法) |
### 构建与安装
#### 环境要求
本研究项目已在以下环境中测试:
|| 发行版 | 内核 | GCC | CLANG | GLIBC |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
**版本** | Ubuntu 21.04 | 5.11.0 | 10.3.0 | 12.0.0 | 2.33 |
我们推荐使用 Ubuntu 21.04,默认情况下它将包含此处显示的软件版本。否则,可能会遇到[此处](https://github.com/h3xduck/TripleCross/issues/41#issuecomment-1176642139)描述的一些问题。
#### 编译
Rootkit 源代码使用两个 Makefile 进行编译。
```
# 构建 rootkit
cd src
make all
# 构建 rootkit client
cd client
make
```
下表详细描述了每个 Makefile 的用途:
| MAKEFILE | 命令 | 说明 | 生成文件 |
| ------------- | ------------- | ------------- | ------------- |
| src/client/Makefile | make | 编译 rootkit 客户端 | src/client/injector |
| src/Makefile | make help | 编译用于测试 rootkit 能力的程序,以及执行劫持和库注入模块的恶意程序和库 | src/helpers/simple_timer, src/helpers/simple_open, src/helpers/simple_execve, src/helpers/lib_injection.so, src/helpers/execve_hijack |
| src/Makefile | make kit | 使用 libbpf 库编译 rootkit | src/bin/kit |
| src/Makefile | make tckit | 编译 rootkit TC 出口程序 | src/bin/tc.o |
### 安装
一旦 rootkit 文件在 src/bin/ 下生成,必须按顺序加载 *tc.o* 和 *kit* 程序。在以下示例中,rootkit 后门将在网络接口 *enp0s3* 上运行:
```
// TC egress program
sudo tc qdisc add dev enp0s3 clsact
sudo tc filter add dev enp0s3 egress bpf direct-action obj bin/tc.o sec classifier/egress
// Libbpf-powered rootkit
sudo ./bin/kit -t enp0s3
```
### 攻击场景脚本
有两个脚本,*packager.sh* 和 *deployer.sh*,可以自动编译和安装 rootkit,就像攻击者在真实攻击场景中所做的那样。
* 执行 packager.sh 将在 *apps/* 目录下生成所有 rootkit 文件。
* 执行 deployer.sh 将安装 rootkit 并创建持久化文件。
必须首先使用以下参数配置这些脚本,以确保持久化模块的正常运行:
| 脚本 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/helpers/deployer.sh | CRON_PERSIST | 重启后执行的 Cron 任务 |
| src/helpers/deployer.sh | SUDO_PERSIST | Sudo 条目,用于授予无密码权限 |
## 库注入模块
Rootkit 可以劫持调用 *sys_timerfd_settime* 或 *sys_openat* 系统调用的进程的执行。这是通过覆盖进行调用的进程虚拟内存中的全局偏移表 (GOT) 部分来实现的。这会导致一个恶意库 (*src/helpers/injection_lib.c*) 被执行。该库将向攻击者机器生成一个反向 shell,然后将执行流返回给原始函数,而不会导致进程崩溃。
TripleCross 准备绕过常见的 ELF 加固技术,包括:
* ASLR
* Stack canaries
* DEP/NX
* PIE
* Full RELRO
它也准备好与 Intel CET 兼容的代码一起工作。
可以使用两个测试程序 *src/helpers/simple_timer.c* 和 *src/helpers/simple_open.c* 检查模块功能。或者,您可以尝试劫持任何系统进程(已测试并适用于 systemd)。
模块配置通过以下常量设置:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | TASK_COMM_NAME_INJECTION_TARGET_TIMERFD_SETTIME | 在 syscall sys_timerfd_settime 处劫持的进程名 | | src/common/constants.h | TASK_COMM_NAME_INJECTION_
TARGET_OPEN | 在 syscall sys_openat 处劫持的进程名 | | src/helpers/injection_lib.c| ATTACKER_IP & ATTACKER_PORT| 攻击者机器的 IP 地址和端口| 在攻击者机器上接收反向 shell 可以使用 netcat 完成: ``` nc -nlvp
因此,为了从 eBPF 检查堆栈中的地址是否是将引导我们到达正确 GOT 的返回地址,我们必须检查它是否是 PLT 桩的返回地址,该桩使用的 GOT 地址跳转到从 eBPF 钩住的系统调用的 glibc 函数。
已包含两种用于查找返回地址的技术:
* 对于 sys_timerfd_settime,eBPF 程序使用系统调用参数在堆栈中向前扫描。
* 对于 sys_openat,eBPF 程序使用 tracepoint 的 *pt_regs* 结构中的数据来扫描返回地址。
#### 定位 shellcode 的关键函数
Shellcode 必须动态生成以绕过 ASLR 和 PIE,它们会在每次程序执行时更改诸如 dlopen() 之类的函数地址。
#### 将 shellcode 注入到代码洞中
如果 ASLR 和 PIE 关闭,可以通过逆向工程 ELF 找到代码洞,但通常情况并非如此。eBPF 程序向用户空间 rootkit 程序发出请求,该程序使用 /proc 文件系统在 .text (可执行) 部分定位并写入代码洞。
#### 覆盖 GOT 部分
根据可执行文件上是否启用了 Partial 或 Full RELRO,eBPF 程序直接覆盖 GOT 部分或通过 /proc 文件系统覆盖。
#### 等待下一个系统调用
当被劫持程序中发出下一个系统调用时,PLT 部分使用修改后的 GOT 部分,从而劫持执行流并将其重定向到代码洞中的 shellcode。Shellcode 旨在防止程序崩溃,并调用恶意库 (*src/helpers/lib_injection.so*)。该库发出 fork() 并向攻击者机器生成反向 shell。之后恢复执行流。
## 后门与 C2
后门开箱即用,无需任何配置。可以使用 rootkit 客户端程序远程控制后门:
| 客户端参数 | 动作说明 |
| ------------- | ------------- |
| ./injector -c \<受害者 IP\> | 使用执行劫持模块生成明文伪 shell |
| ./injector -e \<受害者 IP\> | 通过基于模式的触发器命令后门生成加密伪 shell |
./injector -s \<受害者 IP\> | 通过多数据包触发器(两种类型)命令后门生成加密伪 shell |
./injector -p \<受害者 IP\> | 通过基于模式的触发器命令后门生成幽灵 shell |
./injector -a \<受害者 IP\> | 命令 rootkit 激活所有 eBPF 程序 |
./injector -u \<受害者 IP\> | 命令 rootkit 分离所有 eBPF 程序 |
./injector -S \<受害者 IP\> | 展示后门如何从内核隐藏消息 (简单 PoC) |
| ./injector -h | 显示帮助 |
### 后门触发器
动作通过后门触发器发送到后门,触发器根据属性 **K3** 的值指示后门要执行的动作:
| K3 值 | 动作 |
| ------------- | ------------- |
| 0x1F29 | 请求启动加密伪 shell 连接 |
| 0x4E14 | 请求启动幽灵 shell 连接 |
| 0x1D25 | 请求加载并附加所有 rootkit eBPF 程序 |
| 0x1D24 | 请求分离所有 rootkit eBPF 程序 (后门程序除外) |
#### 基于模式的触发器
此触发器隐藏命令和客户端信息,以便后门可以识别它,但同时对于外部网络监视器来说看起来足够随机。它基于最近发现的 NSAkit [Bvp47](https://www.pangulab.cn/files/The_Bvp47_a_top-tier_backdoor_of_us_nsa_equation_group.en.pdf) 使用的触发器。
#### 多数据包触发器
此触发器由多个 TCP 数据包组成,后门负载隐藏在数据包头中。此设计基于 Vault 7 泄露中描述的 CIA [Hive](https://wikileaks.org/vault7/document/hive-DevelopersGuide/hive-DevelopersGuide.pdf) 植入程序。使用以下负载:
然后对上述负载计算滚动 XOR,并根据 rootkit 客户端选择的模式将其分成多个部分。TripleCross 支持隐藏在 TCP 序列号上的负载:
以及 TCP 源端口:
### 后门伪 Shell
客户端可以建立 rootkit 伪 shell,这是一种特殊的 rootkit 到 rootkit 客户端的连接,它模拟 shell 程序,使攻击者能够远程执行 Linux 命令并获得结果,就像直接在受感染机器上执行一样。我们的 rootkit 中包含多种伪 shell:
#### 明文伪 Shell
此 shell 在执行劫持模块成功运行后生成,该模块将执行一个与 rootkit 客户端建立连接的恶意文件,如下所示:
#### 加密伪 Shell
Rootkit 客户端可以随时请求加密伪 shell,它由 rootkit 和 rootkit 客户端之间的 TLS 连接组成。在加密连接内部,遵循传输协议来通信命令和信息,类似于明文伪 shell 中的协议。
生成加密伪 shell 需要后门监听触发器,它接受基于模式的触发器或两种类型的多数据包触发器:
#### 幽灵 Shell
幽灵 shell 结合使用 XDP 和 TC 程序来克服 eBPF 在网络方面的限制,特别是它无法生成新数据包。为此,后门修改现有流量,用 C2 传输的数据覆盖负载。原始数据包不会丢失,因为 TCP 重传会在短时间后再次发送原始数据包(未经修改)。
以下协议说明了使用幽灵 shell 执行命令期间的流量:
幽灵 shell 由 rootkit 客户端请求,客户端发出一个由后门执行的命令:
受感染机器发送任何 TCP 数据包后,后门将其覆盖,客户端显示响应:
## 执行劫持模块
原则上,eBPF 程序不能自行启动程序的执行。该模块展示了恶意 rootkit 如何利用良性程序在用户空间执行恶意代码。该模块实现两个目标:
* 利用其他程序的执行来执行恶意用户程序。
* 对用户空间透明,也就是说,如果我们劫持一个程序的执行以运行另一个程序,原始程序也应该以最少的延迟被执行。
该模块通过劫持 sys_execve() 系统调用来工作,修改其参数以便运行恶意程序 (*src/helpers/execve_hijack.c*)。此修改的方式使得恶意程序随后可以使用原始参数执行原始程序,以避免引起用户空间的疑虑。下图总结了整体功能:
原始 sys_execve() 调用的参数被修改,以便原始参数不会丢失(使用 argv[0]),以便可以在恶意程序之后执行原始程序:
我们包含了一个示例测试程序 (*src/helpers/simple_execve.c*) 用于测试执行劫持模块。该模块也可以劫持系统中的任何调用,具体取决于配置:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | PATH_EXECUTION_HIJACK_PROGRAM | 成功执行 sys_execve 调用后要执行的恶意程序的位置 |
| src/common/constants.h | EXEC_HIJACK_ACTIVE | 停用 (0) 或激活 (1) 执行劫持模块 |
| src/common/constants.h | TASK_COMM_RESTRICT_HIJACK_ACTIVE | 劫持任何 sys_execve 调用 (0) 或仅 TASK_COMM_NAME_RESTRICT_HIJACK 中指定的调用 (1) |
| src/common/constants.h | TASK_COMM_NAME_RESTRICT_HIJACK | 从中劫持 sys_execve 调用的程序名称 |
成功劫持后,该模块将自行停止。恶意程序 *execve_hijack* 将监听来自 rootkit 客户端的明文伪 shell 请求。
## Rootkit 持久化
受感染机器重启后,所有 eBPF 程序将从内核卸载,用户态 rootkit 程序将被杀死。此外,即使 rootkit 可以再次自动运行,它也不再拥有再次附加 eBPF 程序所需的 root 权限。Rootkit 持久化模块旨在解决这两个挑战:
* 在机器重启事件后自动且无需用户交互地执行 rootkit。
* 一旦 rootkit 在机器中第一次执行时获得了 root 权限,即使重启后也必须保持这些权限。
TripleCross 使用在 *cron.d* 和 *sudoers.d* 下创建的两个秘密文件来实现此功能。这些条目确保 rootkit 在重启后自动以完整权限加载。这些文件由 *deployer.sh* 脚本创建和管理:
该脚本包含两个常量,必须为目标系统上要感染的用户配置这些常量:
| 脚本 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/helpers/deployer.sh | CRON_PERSIST | 重启后执行的 Cron 任务 |
| src/helpers/deployer.sh | SUDO_PERSIST | Sudo 条目,用于授予无密码权限 |
## Rootkit 隐蔽性
持久化模块基于创建额外文件,但它们最终可能会被系统所有者或某些软件工具发现,因此将它们留在系统中存在风险。此外,rootkit 文件需要存储在某个位置,在这些位置它们可能会被发现。
考虑到上述情况,隐蔽模块提供以下功能:
* 对用户完全隐藏目录(以便我们可以将所有 rootkit 文件隐藏在其中)。
* 隐藏目录中的特定文件(我们需要隐藏持久化文件,但无法完全隐藏 *sudoers.d* 或 *cron.d* 目录,因为它们属于正常的系统功能)。
Rootkit 隐藏的文件和目录可以通过以下配置常量进行自定义:
| 文件名 | 常量 | 说明 |
| ------------- | ------------- | ------------- |
| src/common/constants.h | SECRET_DIRECTORY_NAME_HIDE | 要隐藏的目录名称 |
| src/common/constants.h | SECRET_FILE_PERSISTENCE_NAME | 要隐藏的文件名称 |
默认情况下,TripleCross 将隐藏任何名为 "*ebpfbackdoor*" 的文件和一个名为 "*SECRETDIR*" 的目录。该模块在 rootkit 安装后自动激活。
用于实现此功能的技术包括篡改 sys_getdents() 系统调用的参数:
## 许可证
TripleCross rootkit 和 rootkit 客户端根据 GPLv3 许可证授权。参见 [LICENSE](https://github.com/h3xduck/TripleCross/blob/master/LICENSE)。
[RawTCP_Lib](https://github.com/h3xduck/RawTCP_Lib) 库根据 MIT 许可证授权。
原始论文文档和包含的图表根据 [Creative Commons BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) 发布。标签:0day挖掘, API接口, Docker镜像, EDR绕过, IP 地址批量处理, Rootkit, SSH蜜罐, Zeek, 内核安全, 动态库注入, 协议分析, 后门, 命令与控制, 学士学位论文, 安全渗透, 客户端加密, 客户端加密, 并发处理, 恶意软件, 执行劫持, 攻击路径可视化, 数据展示, 权限提升, 系统编程, 红队, 网络信息收集, 网络安全, 进程注入, 隐私保护, 隐蔽通信, 高交互蜜罐, 黑客工具