Real-Fruit-Snacks/Aquifer

GitHub: Real-Fruit-Snacks/Aquifer

基于 Linux 内核命名空间隔离的后渗透框架,提供多通道 C2 通信和 36 个隐蔽模块以实现高隐匿性的红队行动。

Stars: 0 | Forks: 0

Aquifer
**利用内核命名空间隔离的 Linux 后渗透框架** [![Go](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat-square&logo=go&logoColor=white)](https://go.dev) [![Platform](https://img.shields.io/badge/Platform-Linux-FCC624?style=flat-square&logo=linux&logoColor=black)](https://kernel.org) [![License](https://img.shields.io/badge/License-Authorized%20Use%20Only-red?style=flat-square)](.) 内核命名空间隔离让操作系统的防御机制反噬自身。多通道 C2 配合多态信标使流量隐形。36 个隐蔽模块负责处理其余工作。
## 目录 - [亮点](#highlights) - [快速开始](#quick-start) - [执行流程](#execution-flow) - [C2 传输](#c2-transport) - [C2 服务器](#c2-server) - [隐蔽模块](#stealth-modules) - [规避](#evasion) - [OPSEC](#opsec) - [高级持久化](#advanced-persistence) - [通信协议](#wire-protocol) - [架构](#architecture) - [配置](#configuration) - [测试](#testing) ## 亮点
### 命名空间隔离 PID、Mount、Network、UTS 和 Cgroup 命名空间隔离,配合 veth pair 路由和 NAT 伪装。Implant 在其内核强制执行的沙箱中运行,通过 DNAT 环回路由连接主机。 ### 多通道 C2 以支持域前置的 HTTPS 为主。通过 TXT 记录的 DNS 隧道作为备选。DNS-over-HTTPS 用于受限网络。在 netfilter/iptables 之下的原始二层以太网帧用于其他所有方法都失败的环境。
### 多态信标 每个周期轮换 18 个路径、8 个 content-type、13 个 user-agent 和随机化头部。每个会话进行 JA3 指纹随机化。流量整形配合加密抖动模拟合法的浏览行为。 ### 内存保护 `ProtectedConfig` 使用异或重密钥加密静态的 C2 URL 和会话密钥。带有确定性擦除的 `[]byte` API。`DisableKeepAlives` + `FlushConnections()` + `runtime.GC()` 清除瞬态。
### 进程伪装 内核级 argv 和 `/proc/[pid]/comm` 重写,伪装成 `accounts-daemon`。直接对 `/proc/self/mem` 的 environ 区域清零以对抗 `cat /proc/PID/environ`。`GOMAXPROCS(1)` 减少可见的 OS 线程。 ### 36 个隐蔽模块 eBPF 隐身技术在 BPF map 中隐藏 PID。`memfd_create` + `execveat` 实现无文件执行。内核密钥环存储对用户态取证不可见的秘密。反转储区域阻止 LiME/AVML。`io_uring` 共享环形缓冲区绕过系统调用监控。
### 目标密钥 主机名、CIDR 范围、MAC 地址、机器 ID、金丝雀文件和终止日期护栏防止实验室逃逸。如果任何护栏失败,Implant 会自动终止并清理。不会在目标环境之外意外触发。 ### 高级持久化 Systemd generators 在启动时早于所有单元运行。NSS 模块在任何 DNS 或用户查询时触发。Logrotate、DHCP、APT 和 audit dispatcher 钩子在常规系统事件中触发。`binfmt_misc` 和 modprobe 钩子覆盖其余情况。
## 快速开始 ### 前置条件 | 需求 | 版本 | 备注 | |-------------|---------|-------| | Go | 1.21+ | 1.25+ 用于 garble 混淆 | | Platform | Linux | 需要 Kernel namespace 支持 | | garble | latest | 可选,用于混淆构建 | | UPX | latest | 可选,用于发布版压缩 | | Python | 3.9+ | 用于 C2 服务器 | ### 构建 ``` # 开发构建 (stripped, static) make build # ARM64 交叉编译 make build-arm64 # 混淆构建 (需要 garble) make build-garble # 生产发布 (garble + UPX + 签名修补) make build-release # 完整 CI 检查 (vet + fmt + build) make check ``` 输出的二进制文件放在 `build/` 中。 ### 验证 ``` # 检查 Go 元数据泄露 make strings-check # 对比常规构建与 garble 构建 make gobuild-check # 在发布二进制文件上运行 OPSEC 验证套件 make opsec-check ``` OPSEC 检查验证:二进制字符串中没有 Go 模块路径,没有明文 C2 URL,没有 Go 运行时符号引用,UPX 签名完全清除(通过 `scripts/patch_upx.py`),没有 Go section headers (gosymtab, gopclntab, go.buildinfo),以及确认压缩/加密的高二进制熵。 ## 执行流程 ### 1. 父进程阶段 在隔离前运行预命名空间检查: - 目标密钥护栏(主机名、IP 范围、机器 ID、金丝雀文件、终止日期) - 环境指纹识别(VM/沙箱/调试器检测) - EDR 检测和行为调整 - OPSEC 加固(禁用核心转储、反 ptrace、进程伪装) ### 2. 命名空间引导 重新执行进入隔离的 PID + Mount + Network + UTS + Cgroup 命名空间,带有 veth pair、NAT 伪装和用于主机连接的 DNAT 环回路由。父进程设置主机端 veth pair,然后等待子进程。 父进程处理 SIGTERM/SIGINT:杀死子进程,清理主机端网络产物(veth、iptables、sysctl),移除 cgroup 目录,然后退出。正常的子进程退出也会在父进程终止前触发完整的主机端清理。 ### 3. 子进程阶段 命名空间内的操作循环: - 进程隐藏和内存保护 - 与 C2 服务器进行 ECDH 密钥交换 - 带有抖动睡眠和指数退避的信标循环 - 任务执行与加密结果交付 - 信号驱动的优雅关闭与完整清理(网络产物、cgroups、工作区、持久化) ## C2 传输 | 通道 | 描述 | 用例 | |---------|-------------|----------| | HTTPS | 支持域前置的主通道 | 标准出口 | | DNS | TXT 记录渗出 | 防火墙绕过 | | DoH | DNS-over-HTTPS | 受限网络 | | Raw L2 | netfilter/iptables 之下的 AF_PACKET 原始以太网帧 | 防火墙检测之下 | ### 传输特性 | 特性 | 描述 | |---------|-------------| | JA3 随机化 | 每个会话唯一的 TLS 指纹 | | 流量整形 | 模拟合法的浏览行为 | | 多态间隔 | 信标时序上的加密抖动 | | 服务端覆盖 | 通过 `BeaconResponse` 调整睡眠和抖动 | | 自动故障转移 | 级联传输通道回退 | | 确定性路由 | `X-Request-ID` 头用于 O(1) 会话解析 | ## C2 服务器 用于管理 implant 的 Python 操作员控制台。使用 cmd2 + Rich 构建,采用 Catppuccin Mocha 主题。 ``` # 安装依赖 pip install -r c2server/requirements.txt # 启动操作员控制台 python3 -m c2server --db c2.db --keys server_keys.pem ``` ### 组件 | 组件 | 描述 | |-----------|-------------| | ECDH P-256 | 持久化的服务器密钥交换,与 Go implant 协议完全匹配 | | AES-256-GCM | 加密的信标流量与流量整形 | | HTTPS listener | Starlette + uvicorn,TLS 1.2+ 加固,通过 X-Request-ID 实现 O(1) 会话查找 | | DNS listener | TXT 记录 C2,base32 编码和响应截断 | | 多态路由 | 18 个轮换信标路径 + 默认路径 | | SQLite backend | 会话、任务、结果、战利品、监听器(WAL 模式,每线程连接) | | Rich CLI | Catppuccin Mocha 主题的表格、面板和状态显示 | | 上下文切换 | 主上下文(会话/监听器/战利品)和 implant 上下文(shell/upload/persist/等) | ### 操作员命令 **主上下文:** `sessions`, `interact`, `listeners`, `loot`, `generate` **Implant 上下文:** `shell`, `upload`, `download`, `ls`, `ps`, `netstat`, `ifconfig`, `whoami`, `sysinfo`, `persist`, `cleanup`, `sleep`, `kill`, `info`, `tasks`, `results`, `back` ## 隐蔽模块 36 个用于深度主机级融合的模块 (`pkg/stealth/`): | 模块 | 文件 | 描述 | |--------|------|-------------| | Argv masquerade | `process_blend.go` | 完整的 `/proc/[pid]` 配置文件模拟(FDs、CWD、OOM score) | | Process genealogy | `genealogy.go` | 双重 fork 重定父进程到 PID 1 | | PID manipulation | `pid_manip.go` | 在 PID 命名空间内消耗 PID 以避免 PID 1 | | PID recycling defense | `pid_recycle.go` | 落在与系统服务匹配的密集 PID 区域 | | eBPF cloaking | `ebpf_cloak.go` | 基于 BPF map 的 PID 隐藏列表(存根过滤器,map 功能正常) | | Environment cloning | `env_clone.go` | 从活动目标进程克隆环境变量 | | Network blending | `network_blend.go` | 伪造连接和服务旗标响应器 | | Decoy processes | `decoy.go` | 生成和管理诱饵服务进程 | | History obfuscation | `history.go` | Shell 历史记录操作和 RC 文件注入 | | Cgroup camouflage | `cgroup_camo.go` | 模仿 systemd 服务 cgroup 层级 | | Namespace hiding | `ns_hide.go` | 容器 ID 欺骗和命名空间混淆 | | Nested namespaces | `ns_layers.go` | 外部诱饵 + 内部操作命名空间 | | Group blending | `group_blend.go` | 匹配目标服务的补充组 | | Capability management | `capabilities.go` | Ambient capability 提权 | | Syscall proxying | `syscall_proxy.go` | 基于 Ptrace 的系统调用注入到目标进程 | | Memory spoofing | `mem_spoof.go` | 通过 PR_SET_VMA 进行 `/proc/[pid]/maps` 区域名称欺骗 | | TCP/IP fingerprinting | `tcpip_spoof.go` | 内核 TCP 协议栈参数欺骗 | | D-Bus blending | `dbus_blend.go` | 注册为合法的 D-Bus 服务 | | lsof misdirection | `lsof_spoof.go` | 通过绑定挂载进行 FD 欺骗 | | Benign strings | `benign_strings.go` | 向二进制文件注入看起来合法的字符串 | | Seccomp awareness | `seccomp_aware.go` | 检测 seccomp 过滤器并调整系统调用行为 | | Socket inheritance | `socket_inherit.go` | 从目标服务继承 socket 以进行融合 | | Timestamp freezing | `ts_freeze.go` | tmpfs 时间戳操作以对抗取证 | | Polymorphic engine | `polymorphic.go` | 检测到分析时对数据区域进行异或加密 | | Exe link spoofing | `exe_spoof.go` | 通过 PR_SET_MM_EXE_FILE 进行 `/proc/self/exe` 操作 | | Seccomp forensic block | `seccomp_notif.go` | BPF 过滤器阻止 ptrace/perf_event/process_vm_readv | | Kernel keyring storage | `keyring_store.go` | 在内核内存中存储秘密(对内存取证不可见) | | io_uring covert I/O | `iouring.go` | 绕过系统调用级监控的共享环形缓冲区 I/O | | Anti-dump regions | `antidump.go` | MADV_DONTDUMP 和 MADV_WIPEONFORK 内存保护 | | Cross-process injection | `vmwrite_inject.go` | 无需 ptrace 的 process_vm_writev shellcode 注入 | | Userfaultfd decoy | `uffd_decoy.go` | 通过页面错误处理器向取证工具提供虚假内存页 | | Kernel tunable manipulation | `ktune.go` | 通过 /proc/sys 和 /sys/kernel 禁用 kprobes、ftrace、perf | | Abstract unix sockets | `abstract_sock.go` | 通过抽象命名空间 socket 实现无文件系统 IPC | | Fileless execution | `memfd_exec.go` | memfd_create + execveat 用于无磁盘 ELF 执行 | | eBPF program pinning | `bpf_pin.go` | 通过 bpffs 实现进程死亡后仍存活的持久内核钩子 | | Landlock self-sandboxing | `landlock_cage.go` | 用于伪装的非特权 Landlock LSM 配置文件 | ## 规避 - VM/沙箱检测(hypervisor、时序、MAC OUI、BIOS 字符串) - EDR 产品检测与行为适应 - Auditd 规则解析和系统调用规避 - 命名入侵检测(nsenter 监控) - 文件系统监控检测(inotify/fanotify/audit) - `/proc` 条目隐藏和自解除链接 - eBPF 程序检测和枚举 ## OPSEC - **Guardrails** -- 目标密钥防止实验室逃逸(主机名、CIDR、机器 ID、金丝雀、终止日期) - **Kill switch** -- 检测到取证工具或用户登录时自动清理 - **内存加密** -- 会话密钥静态时进行异或加密,解密到短生命周期缓冲区 - **核心转储防止** -- RLIMIT_CORE=0 和 PR_SET_DUMPABLE=0 - **Anti-ptrace** -- 阻止调试器附加 - **进程伪装** -- 内核级 argv 重写,伪装成 `accounts-daemon` - **环境擦除** -- `os.Clearenv()` + 直接对 `/proc/self/mem` 的 environ 区域清零 - **线程数减少** -- `GOMAXPROCS(1)` 最小化 `/proc/PID/status` 中可见的 OS 线程 - **I/O 噪声注入** -- 信标周期之间的随机 procfs 读取破坏 `/proc/PID/io` 关联性 - **Heap 保护** -- `ProtectedConfig` 静态加密 C2 URL/密钥,每个周期异或重密钥;`GetC2ServersBytes()` 返回调用者在使用后擦除的 `[]byte` 切片;传输和配置 blob 在关闭时销毁 - **多态信标** -- 每个周期 18 个轮换路径、8 个 content-type、13 个 user-agent、随机化头部(应用于信标循环和初始注册) - **Crypto 卫生** -- 注册后销毁 ECDH 客户端公钥;消除会话密钥栈残留;重密钥失败跟踪,熵耗尽后优雅关闭;通过拒绝采样实现无偏差的 `CryptoRandIntn` - **内存映射加载器** -- 无磁盘产物内存中 ELF 执行 - **反取证** -- Timestomping、二进制自删除、退出时完整清理 - **Kernel keyring** -- 秘密存储在内核内存中,对用户态取证不可见 - **Anti-dump** -- MADV_DONTDUMP/WIPEONFORK 防止 LiME/AVML 进行内存捕获 - **NSS 安全防护** -- 如果 NSS .so 在磁盘上不存在,拒绝修改 nsswitch.conf(防止破坏主机 DNS) - **主机端清理** -- 退出时移除 veth 接口、iptables 规则、sysctl 覆盖和 cgroup 目录 - **父进程信号处理器** -- 父进程捕获 SIGTERM/SIGINT 以确保即使父进程被直接杀死也能清理主机产物 - **Sysctl 恢复** -- 移除 sysctl.d 持久化恢复运行时内核参数(ptrace_scope、kptr_restrict、ftrace、BPF、perf)而无需重启 ## 高级持久化 除标准持久化(cron、systemd、init.d、bashrc)外,该框架包含高级机制: | 方法 | 描述 | |--------|-------------| | Systemd generators | `/etc/systemd/system-generators/` -- 启动时在所有单元之前运行 | | NSS modules | `/etc/nsswitch.conf` 注入 -- 由任何 DNS/用户查询触发 | | Logrotate hooks | `/etc/logrotate.d/` post-rotate 脚本 -- 定期执行 | | DHCP client hooks | `/etc/dhcp/dhclient-exit-hooks.d/` -- 网络事件时运行 | | APT hooks | `/etc/apt/apt.conf.d/` -- 包操作时执行 | | Audit dispatcher | `/etc/audit/plugins.d/` -- 审计事件时运行 | | binfmt_misc | `/etc/binfmt.d/` -- 特定文件执行时触发 | | Modprobe hooks | `/etc/modprobe.d/` install 命令 -- 模块加载时运行 | | NM dispatcher | `/etc/NetworkManager/dispatcher.d/` -- 网络状态变化时运行 | | Sysctl.d | `/etc/sysctl.d/` -- 启动时应用的内核可调参数(禁用追踪/调试) | ## 通信协议 Go implant 和 Python C2 服务器通过 JSON 编码、AES-256-GCM 加密的负载进行通信。 | 字段 | Go JSON Tag | Python Key | 备注 | |-------|-------------|------------|-------| | Sleep override | `json:"sleep"` | `"sleep"` | 秒数 (int) | | Jitter override | `json:"jitter"` | `"jitter"` | 0.0-1.0 (float64) | | Task result ID | `json:"id"` | `"id"` | UUID 字符串 | | Task result output | `json:"output"` | `"output"` | Go `[]byte` -> JSON 中的 base64,Python base64 解码 | | Shutdown flag | `json:"shutdown"` | `"shutdown"` | 布尔值 | CLI 任务参数序列化为 `map[string]string` -- 线上所有值必须是字符串。 ## 架构 ``` . ├── cmd/ │ ├── implant/main.go Entry point (parent -> namespace child) │ └── test-implant/main.go Integration test implant (no namespaces) ├── pkg/ │ ├── c2/ C2 transports │ │ ├── dns.go DNS TXT record transport │ │ ├── doh.go DNS-over-HTTPS transport │ │ ├── fronting.go Domain fronting │ │ ├── https.go Primary HTTPS transport │ │ ├── ja3.go JA3 fingerprint randomization │ │ ├── polymorphic_beacon.go Polymorphic beacon encoding │ │ ├── protocol.go Beacon encode/decode │ │ ├── rawl2.go Raw Layer 2 Ethernet transport │ │ ├── traffic_shape.go Traffic pattern shaping │ │ └── transport.go Transport manager with failover │ ├── config/config.go Compile-time configuration │ ├── evasion/ Detection and evasion │ ├── namespace/ Linux namespace management │ ├── opsec/ Operational security │ ├── stealth/ 36 stealth modules │ ├── tasking/ Task handler framework │ └── version/ Build version metadata ├── internal/ │ └── shared/ Internal shared utilities ├── scripts/ │ ├── integration_test.sh End-to-end C2 + implant test │ └── patch_upx.py UPX signature scrubber ├── c2server/ Python C2 operator console │ ├── __main__.py Entry point │ ├── crypto/ ECDH, AES-GCM, traffic shaping │ ├── protocol/ Beacon encode/decode, polymorphic paths │ ├── models/ SQLite models (sessions, tasks, loot) │ ├── listeners/ HTTPS + DNS listeners │ ├── cli/ cmd2 app, Rich theme, commands │ └── requirements.txt Python dependencies ├── docs/ Planning docs and landing page │ └── index.html Project landing page ├── Makefile Build targets ├── Dockerfile Container build ├── go.mod └── go.sum ``` ### 关键模式 | 模式 | 实现 | |---------|----------------| | 两阶段执行 | 父进程运行检查,重新执行进入命名空间子进程 | | 编译时配置 | 所有设置通过 `-ldflags` 嵌入,无运行时配置文件 | | 传输故障转移 | HTTPS -> DNS -> DoH -> Raw L2 级联 | | 内存优先 | `ProtectedConfig`、`[]byte` API、确定性擦除 | | 内核级隐藏 | 命名空间隔离 + eBPF 隐身 + procfs 操作 | ## 配置 所有配置通过 `pkg/config/config.go` 在编译时进行。在构建时使用 `-ldflags` 覆盖默认值: | 字段 | 默认值 | 描述 | |-------|---------|-------------| | `C2Servers` | `https://127.0.0.1:8443/api/v1/beacon` | 主 HTTPS 端点 | | `DNSDomains` | `ns1.example.com` | DNS 回退域名 | | `CallbackInterval` | 30s | 信标间隔 | | `Jitter` | 0.2 | 睡眠抖动 (0.0-1.0) | | `MasqueradeName` | `accounts-daemon` | 进程名伪装 | | `KillDate` | +30 days | 自动过期日期 | | `SandboxEvasion` | true | VM/沙箱检测 | | `EDRAwareness` | true | EDR 行为适应 | ## 测试 ### 集成测试 完整端到端测试:C2 服务器 + 在 localhost 上运行信标循环的测试 implant。 ``` ./scripts/integration_test.sh ``` 测试: 1. 构建一个禁用沙箱规避的测试 implant (`cmd/test-implant/`) 2. 在 `127.0.0.1:8443` 上启动 C2 HTTPS 监听器 3. 启动执行 ECDH 密钥交换并注册会话的 implant 4. 验证 C2 数据库中记录了一个会话 5. 确认至少发送并接收了一个信标 测试 implant 在没有命名空间隔离或规避检查的情况下运行,使其适用于实验室/VM 环境。使用 `-tags testbuild` 构建。 ## 法律声明 本软件仅用于授权渗透测试、红队操作和安全研究。作者对滥用不承担任何责任。用户对在任何系统上部署此工具前确保拥有适当授权负全责。
**Aquifer** -- 隐藏的基础设施,深藏于地表之下。
标签:DNS隧道, Docker镜像, DOH, EVTX分析, EVTX分析, Go语言, HTTPS, IP 地址批量处理, Layer 2, Rootkit, Zeek, 伦理授权, 内核命名空间, 反向代理, 后渗透框架, 命令控制, 嗅探欺骗, 域名前置, 多态信标, 安全渗透, 攻击模拟, 数据采集, 日志审计, 权限维持, 沙箱逃逸, 流量伪装, 知识库安全, 程序破解, 网络安全, 进程隔离, 逃避检测, 逆向工具, 隐匿通信, 隐私保护, 驱动签名利用