h3xduck/TripleCross

GitHub: h3xduck/TripleCross

一个基于 Linux eBPF 技术的教育性 rootkit,展示 eBPF 在攻击场景中的库注入、执行劫持、C2 通信和持久化等高级能力。

Stars: 1945 | Forks: 241

# TripleCross ![License](https://img.shields.io/github/license/h3xduck/TripleCross) ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/h3xduck/TripleCross?include_prereleases) ![Maintainability](https://img.shields.io/static/v1?label=maintainability&message=B&color=green) ![GitHub last commit](https://img.shields.io/github/last-commit/h3xduck/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/) 发布。
标签:0day挖掘, API接口, Docker镜像, EDR绕过, IP 地址批量处理, Rootkit, SSH蜜罐, Zeek, 内核安全, 动态库注入, 协议分析, 后门, 命令与控制, 学士学位论文, 安全渗透, 客户端加密, 客户端加密, 并发处理, 恶意软件, 执行劫持, 攻击路径可视化, 数据展示, 权限提升, 系统编程, 红队, 网络信息收集, 网络安全, 进程注入, 隐私保护, 隐蔽通信, 高交互蜜罐, 黑客工具