ICMP-Ghost:一款纯汇编打造的轻量级C2Agent

admin 2026-04-13 02:45:51 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: ICMP-Ghost是一款纯x64汇编编写的LinuxC2Agent,采用无文件内存执行和ICMP协议隐蔽通信。核心特性包括通过memfd_create实现命令输出不落盘、使用原始ICMP套接字建立无端口C2信道、ptrace注入技术规避检测。项目验证了纯用户空间隐蔽能力边界,对红队研究具有参考价值,同时暴露了当前EDR和NIDS在直接syscall检测、协议伪装载荷分析等方面的盲区。 综合评分: 85 文章分类: 渗透测试,红队,内网渗透,恶意软件,二进制安全


cover_image

ICMP-Ghost:一款纯汇编打造的轻量级 C2 Agent

NaNaBot NaNaBot

0x33 SEC

2026年4月7日 11:14 贵州

在小说阅读器读本章

去阅读

ICMP-Ghost:一款纯汇编打造的轻量级 C2 Agent

项目概述

ICMP Ghost 是一款面向 Linux 的 C2 Agent,使用纯 x64 汇编编写,零 libc 依赖,所有操作通过直接 syscall 完成。

其核心设计理念可以概括为三点:

  • 无文件:通过 memfd_create 实现全内存执行,命令输出不落盘
  • 隐蔽信道:以 ICMP 协议作为 C2 通信隧道,无端口、无连接状态
  • 轻量:无 ELF 导入表、无动态链接器痕迹、无 libc 调用链

ICMP Ghost 运行演示


技术栈一览

| 维度 | 选型 | | — | — | | 语言 | 纯 x64 Assembly(NASM) | | 目标平台 | Linux x86_64 | | 通信协议 | Raw ICMP(Echo Request/Reply) | | 进程注入 | ptrace 状态机(Phantom Loader) | | 内存执行 | memfd_create + execve | | 加密方式 | Rolling XOR |


架构组成

整个项目由三个核心组件构成:

┌────────────────────────┐
│       client.asm       │  ← 攻击端控制台
│  发送加密 ICMP Request  │
└───────────┬────────────┘
            │  Raw ICMP
┌───────────▼────────────┐
│       sniff.asm        │  ← 目标端植入体(PIC shellcode)
│  驻留内存,监听/执行/回传 │
└───────────▲────────────┘
            │  ptrace 注入
┌───────────┴────────────┐
│       loader.asm       │  ← Phantom Loader 注入引擎
│  扫描 /proc,注入后退出  │
└────────────────────────┘

client.asm — 操作端,接收目标 IP 和命令,加密后封装为 ICMP Echo Request 发出,监听 Reply 并重组输出。

sniff.asm — 植入体,编译为裸二进制(无 ELF 头,位置无关),通过原始 ICMP 套接字被动监听,校验认证字段后解密执行命令,结果经 memfd_create 捕获后分片回传。

loader.asm — 注入器,遍历 /proc 定位目标进程,通过多阶段 ptrace 操作完成 shellcode 注入后自行退出,不留驻。


关键特性

ICMP 隧道 —— 隐藏在 ping 里的 C2 信道

所有 C2 流量伪装为标准 Linux ping 报文,填充字段与 iputils 一致。加密载荷被放置在大多数 DPI 引擎扫描深度之后的偏移位置。

非对称认证 —— 静默过滤噪声流量

植入体仅响应 ICMP ID + SEQ = 45000 的报文,其他所有 ICMP 流量(扫描器、蜜罐、常规 ping)均被静默丢弃。回传报文使用 ID + SEQ = 55000,双向数学隔离,避免操作系统回显混淆。

无文件执行 —— 全程内存操作

命令执行链路:fork → dup2(memfd, stdout) → execve("/bin/sh", ["-c", cmd])。输出写入匿名内存文件描述符,在 /proc/PID/fd 中呈现为 [shm],与合法共享内存映射一致。

内存注入 —— 绕过现代内核缓解

Phantom Loader 采用两阶段注入:先以 PROT_READ|PROT_WRITE 分配远程内存写入 shellcode,再通过 mprotect 切换为 PROT_READ|PROT_EXEC。任何时刻内存页都不会同时具备写和执行权限,规避 EDR 的 RWX 异常扫描。

进程伪装

植入体运行后覆写 argv[0],在 ps 输出中伪装为系统服务进程(如 systemd-resolved),仅通过 /proc/PID/exe 软链接可追溯真实路径。


快速使用

环境要求

  • NASM + GNU ld
  • Root 权限(原始套接字 + ptrace)

编译与部署

# 编译植入体
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

二进制命名建议不少于 15 个字符(如 systemd-resolved),以确保 argv[0] 覆写时栈缓冲区足够,避免环境变量泄漏。

Phantom Loader 注入模式(v3.5)

# 编译注入器
cd Phantom_Loader
nasm -f elf64 loader.asm -o loader.o && ld loader.o -o loader
strip --strip-all loader

# 执行注入(目标进程需已运行)
sudo strace ./loader

使用 strace 包裹执行是有意为之 —— 利用 LotL(Living off the Land)手法产生大量合法 ptrace 调试日志,淹没 eBPF 传感器(如 Falco)的告警队列,使真正的注入事件被误判为噪声。

Phantom Loader 注入演示


局限性

  • 目标进程受 AppArmor/SELinux enforce 模式约束时,mprotect 跨区域调用会被拦截,当前版本仅支持注入非受限的 root 进程(如 cronVBoxService
  • 不提供交互式 TTY —— 这是架构层面的取舍:ICMP 无状态协议不适合流式会话,且 PTY 分配产生的 /dev/ptmx + ioctl 调用是 EDR 重点监控对象
  • Rolling XOR 属于轻量级混淆而非强加密,侧重于规避 DPI 熵值检测,不提供密码学安全保证

意义

ICMP Ghost 的价值不在于作为一个”可用的 C2 框架”与 Cobalt Strike 等成熟工具竞争,而在于它用极度精简的实现验证了一个问题:

在不触及内核模块、不依赖任何用户态库的前提下,纯用户空间的隐蔽能力边界在哪里?

从防御视角来看,它暴露了当前安全产品在以下环节的检测盲区:

  • 基于 libc hook 的 EDR 对直接 syscall 无感知
  • 基于签名的 NIDS 对协议字段伪装后的载荷缺乏深度检查
  • 基于进程行为的检测对 ptrace 注入后自毁的 Loader 缺少关联分析

对于红队研究者,它是一个极具参考价值的底层实现范本;对于蓝队防御者,它指明了下一代检测能力需要覆盖的方向。


项目地址:https://github.com/JM00NJ/ICMP-Ghost-A-Fileless-x64-Assembly-C2-Agent

免责声明:本文仅用于安全研究与授权渗透测试场景下的技术交流。未经授权对非自有系统使用此类工具属于违法行为,一切后果由使用者自行承担。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:0x33 SEC NaNaBot NaNaBot《ICMP-Ghost:一款纯汇编打造的轻量级 C2 Agent》

评论:0   参与:  0