TripleCross是一个Linux eBPF rootkit,演示了eBPF技术的攻击性功能。
TripleCross的灵感来自于该领域之前的植入物设计,特别是Jeff Dileo在DEFCON 271、Pat Hogan在DEFCON 292、Guillaume Fournier和Sylvain Afchain也在DEFCON 293以及Kris Nóva的Boopkit4的作品。我们重用和扩展了eBPF技术攻击能力的这些先前探索中所开创的一些技术。
这个rootkit是为我在UC3M的学士论文而创建的。有关其设计的更多详细信息,请参见 论文文件。
免责声明
这个新手纯粹是为了教育和学术目的。本软件按“原样”提供,作者对使用过程中可能发生的任何损坏或事故概不负责。
不要试图使用TripleCross违反法律。滥用所提供的软件和信息可能会导致刑事指控。
特点
1.一个库注入模块,通过写入进程的虚拟内存来执行恶意代码。
2.一个执行劫持模块,修改传递给内核的数据以执行恶意程序。
3.允许以 root 权限运行恶意程序的本地权限提升模块。
4.具有 C2 功能的后门,可以监控网络并执行从远程 Rootkit 客户端发送的命令。它结合了多个激活触发器,以便这些操作被秘密传输。
5.一个Rootkit 客户端,允许攻击者建立 3 种不同类型的类似 shell 的连接,以发送远程控制 Rootkit 状态的命令和操作。
6.一个持久性模块,确保 rootkit 保持安装状态,即使在重新启动事件后也能保持完全特权。
7.向用户隐藏与 rootkit 相关的文件和目录的隐形模块。
TripleCross概述
下图显示了TripleCross及其模块的体系结构。
用于rootkit传输的原始套接字库RawTCP_Lib是我的著作,并有自己的存储库。
下表介绍了主要的源代码文件和目录,以便于其导航:
目录 |
命令 |
src/client |
rootkit客户端的源代码 |
src/client/lib |
RawTCP_Lib共享库 |
src/common |
rootkit的常量和配置。它还包括eBPF和rootkit的用户空间端所共有的元素的实现,例如环形缓冲区 |
src/ebpf |
rootkit使用的eBPF程序的源代码 |
src/helpers |
包括用于测试几个rootkit模块功能的程序,以及分别用于执行劫持和库注入模块的恶意程序和库 |
src/libbpf |
包含与rootkit集成的libbpf库 |
src/user |
rootkit使用的用户级程序的源代码 |
src/vmlinux |
包含内核数据结构定义的标头(这是使用libbpf时推荐的方法) |
构建和安装
所需资源
本 研究项目在以下环境下进行了测试:
|
VERSION |
我们建议使用Ubuntu 21.04,默认情况下,它将包含此处显示的软件版本。否则,您可能会遇到一些问题 这里。
汇编
使用两个Makefile编译rootkit源代码。
# Build rootkit
cd src
make all
# Build rootkit client
cd client
make
下表详细描述了每个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 |
安装
在src/bin/下生成rootkit文件后,必须按顺序加载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 将生成下的所有rootkit文件应用程序/目录。
•执行 deployer.sh 将安装rootkit并创建持久性文件。
为了使持久性模块正常工作,必须首先使用以下参数配置这些脚本:
脚本 |
常数 |
描述 |
src/helpers/deployer.sh |
病例持续 |
重新启动后要执行的Cron作业 |
src/helpers/deployer.sh |
SUDO_持续 |
授予无密码权限的Sudo条目 |
库注入模块
rootkit可以劫持调用sys_timerfd_settime或sys_openat系统调用的进程的执行。这是通过在进行调用的进程的虚拟存储器中重写全局偏移表(GOT)部分来实现的。这会导致执行恶意库(src/helpers/injection_lib. c)。该库将为攻击者的机器生成一个反向shell,然后将执行流返回到原始函数,而不会使进程崩溃。
TripleCross准备绕过常见的ELF强化技术,包括:
•ASLR
•Stack canaries
•DEP/NX
•PIE
•Full RELRO
它还可以使用英特尔CET兼容代码。
可使用两个测试程序检查模块功能 src/helpers/simple_timer.c 以及 src/helpers/simple_open.c。或者,您可能会尝试劫持任何系统进程(已测试并使用systemd)。
模块组态通过以下常量设置:
文件名 |
常数 |
描述 |
src/common/constants.h |
任务通信名称进样 目标定时器FD设置时间 |
要在系统调用sys_timerfd_settime时劫持的进程的名称 |
src/common/constants.h |
任务通信名称进样 目标_打开 |
要在syscall sys_openat上劫持的进程的名称 |
src/helpers/injection_lib.c |
攻击者IP和攻击者端口 |
攻击者计算机的IP地址和端口 |
可以使用netcat从攻击者计算机接收反向shell:
nc -nlvp
基于GOT劫持技术的库注入
TripleCross采用的技术包括5个阶段:
查找GOT和返回地址
rootkit使用跟踪点程序来挂钩系统调用。从那里,它在GOT段定位PLT存根用来调用负责系统调用的glibc函数的地址。
为了到达GOT段,eBPF程序使用存储在堆栈中的返回地址。请注意:
•.text 调用 .plt,因此 rip 在堆栈中保存为 ret
•.plt 使用 .got 跳转至 glibc,因此不会保存其他 rip。它也不会修改或保存 rbp 的值。
•Glibc 进行 syscall ,它不会将 rip 保存在堆栈中,而是将其保存在 rcx 中。
因此,为了从eBPF检查堆栈中的地址是将我们引导到正确GOT的返回地址,我们必须检查它是PLT存根的返回地址,该PLT存根使用跳转到glibc函数的GOT地址,该glibc函数进行我们从eBPF钩住的系统调用。
已经合并了两种用于查找返回地址的技术:
•使用 sys_timerfd_settime,eBPF 程序使用系统调用参数在扫描中向前扫描。
•使用 sys_openat,eBPF 程序扫描使用跟踪点的 pt_regs 结构中的数据来扫描返回地址。
查找外壳代码的键函数
必须动态生成 shellcode 以绕过 ASLR 和 PIE,它们会在每次程序执行时更改 dlopen() 等函数的地址。
在代码洞穴中注入 shellcode
如果 ASLR 和 PIE 关闭,可以通过对 ELF 进行逆向工程找到代码洞,但通常情况并非如此。eBPF 程序向用户空间 rootkit 程序发出请求,该程序使用 /proc 文件系统定位并写入 .text(可执行)部分的代码洞穴。
覆盖GOT部分
根据可执行文件上激活的是部分RELRO还是完全RELRO,eBPF程序直接或使用/proc文件系统覆盖GOT部分。
正在等待下一个系统调用
当在被劫持的程序中发出下一个系统调用时,PLT 部分使用修改后的 GOT 部分,劫持被重定向到代码洞穴中的 shellcode 的执行流。shellcode准备防止程序崩溃,并调用恶意库(src/helpers/lib_injection.so)。该库发出一个 fork() 并使用攻击者机器生成一个反向 shell。之后执行流程恢复。
后门和C2
后门程序可以开箱即用,不需要任何配置。可以使用rootkit客户端程序远程控制后门:
客户论据 |
行动描述 |
./injector -c |
使用执行劫持模块生成纯文本伪shell |
./injector -e |
通过使用基于模式的触发器命令后门来生成加密的伪shell |
./injector -s |
通过使用多数据包触发器(两种类型)命令后门来生成加密的伪shell |
./injector -p |
通过使用基于模式的触发器命令后门来生成幻像shell |
./injector -a |
命令rootkit激活所有eBPF程序 |
./injector -u |
命令rootkit分离其所有eBPF程序 |
./injector -S |
展示后门如何隐藏消息不让内核看到(简单PoC) |
./injector -h |
显示帮助 |
后门触发器
使用后门触发器将操作发送到后门,后门触发器根据属性值指示要执行的操作 K3:
K3值 |
行动 |
0x1F29 |
请求启动加密的伪shell连接 |
0x4E14 |
请求启动幻像shell连接 |
0x1D25 |
请求加载和附加所有rootkit eBPF程序 |
0x1D24 |
请求分离所有rootkit eBPF程序(后门程序除外) |
基于模式的触发器
这个触发器隐藏了命令和客户端信息,以便它可以被后门识别,但同时对于外部网络管理员来说似乎足够随机。它基于最近发现的 NSA rootkit Bvp47 使用的触发器。
多包触发
此触发器由多个 TCP 数据包组成,后门负载隐藏在数据包标头中。该设计基于Vault 7 泄漏中描述的CIA Hive植入物。使用以下有效负载:
然后根据 rootkit 客户端选择的模式,对上述有效负载计算滚动 XOR,并将其分为多个部分。TripleCross 支持隐藏在 TCP 序列号上的有效载荷:
在 TCP 源端口上:
后门伪壳
客户端可以建立 rootkit 伪 shell,一种模拟 shell 程序的特殊 rootkit 到 rootkit 客户端连接,使攻击者能够远程执行 Linux 命令并获得结果,就像直接在受感染的机器上执行它们一样。我们的 rootkit 中包含多个伪外壳:
明文伪壳
该shell是执行劫持模块成功运行后生成的,执行劫持模块会执行一个恶意文件,该文件与rootkit客户端建立连接,如下所示:
加密伪壳
rootkit 客户端可以随时请求一个加密的伪外壳,它由 rootkit 和 rootkit 客户端之间的 TLS 连接组成。在加密连接内部,遵循一种传输协议来传达命令和信息,类似于明文伪外壳中的传输协议。
产生一个加密的伪 shell 需要后门来监听触发器,它接受基于模式的触发器或两种类型的多数据包触发器:
phantom shell
phantom shell 使用 XDP 和 TC 程序的组合来克服网络上的 eBPF 限制,特别是它不能生成新数据包。为此,后门修改现有流量,用 C2 传输的数据覆盖有效载荷。原始数据包不会丢失,因为 TCP 重传会在短时间后再次发送原始数据包(未修改)。
以下协议说明了使用虚拟 shell 执行命令期间的流量:
rootkit 客户端请求一个 phantom shell,它发出一个由后门执行的命令:
受感染的机器发送任何 TCP 数据包后,后门会覆盖它,客户端显示响应:
执行劫持模块
原则上,eBPF 程序不能自行启动程序的执行。该模块展示了恶意 rootkit 如何利用良性程序在用户空间执行恶意代码。该模块实现了两个目标:
•利用其他程序的执行执行恶意用户程序。
•对用户空间是透明的,也就是说,如果我们劫持一个程序的执行以便另一个程序运行,那么原始程序也应该以最少的延迟执行。
该模块的工作原理是劫持 sys_execve() 系统调用,修改其参数,以便运行恶意程序 ( src/helpers/execve_hijack.c )。进行此修改的方式使得恶意程序可以使用原始参数执行原始程序,以避免在用户空间引起关注。下图总结了整体功能:
原始 sys_execve() 调用的参数以不丢失原始参数的方式进行修改(使用 argv[0]),以便可以在恶意程序之后执行原始程序:
我们已经合并了一个示例测试程序(src/helpers/simple_execve.c)来测试执行劫持模块。该模块还可以劫持系统中的任何调用,具体取决于配置:
文件名 |
src/common/constants.h |
src/common/constants.h |
src/common/constants.h |
src/common/constants.h |
成功劫持后,该模块将自行停止。恶意程序execve_hijack会监听来自rootkit 客户端的明文伪shell 请求。
Rootkit 持久性
受感染机器重启后,所有的eBPF程序将从内核中卸载,userland rootkit程序将被杀死。而且,即使rootkit可以自动再次运行,它也不再享有再次附加eBPF程序所需的root权限。Rootkit 持久性模块旨在应对这两个挑战:
•在机器重启事件后自动执行 rootkit,无需用户交互。
•一旦 rootkit 在机器中第一次执行时获得了 root 权限,即使在重新启动后它也必须保留这些权限。
TripleCross 使用在cron.d和sudoers.d下创建的两个秘密文件来实现此功能。这些条目确保 rootkit 在重新启动后自动加载并具有完全权限。这些文件由deployer.sh脚本创建和管理:
该脚本包含两个常量,用户必须配置这些常量才能感染目标系统:
脚本 |
src/helpers/deployer.sh |
src/helpers/deployer.sh |
Rootkit隐身
持久化模块基于创建附加文件,但它们最终可能会被系统所有者或某些软件工具找到,因此存在将它们留在系统中的风险。此外,rootkit 文件需要存储在某个位置,它们可能会被发现。
考虑到上述情况,隐形模块提供以下功能:
•对用户完全隐藏一个目录(这样我们就可以隐藏里面的所有rootkit文件)。
•隐藏目录中的特定文件(我们需要隐藏持久化文件,但我们不能完全隐藏sudoers.d或cron.d目录,因为它们属于正常的系统功能)。
rootkit 隐藏的文件和目录可以通过以下配置常量进行自定义:
文件名 |
src/common/constants.h |
src/common/constants.h |
默认情况下,TripleCross 将隐藏任何名为“ ebpfbackdoor ”的文件和名为“ SECRETDIR ”的目录。此模块在安装 rootkit 后自动激活。
用于实现此功能的技术包括篡改 sys_getdents() 系统调用的参数:
翻译自网络
原文始发于微信公众号(闲聊知识铺):TripleCross -具有后门、C2、库注入、执行劫持、持久性和隐身功能