saiadityaprojects/IDS-Evasion-Fragmented-Ping
GitHub: saiadityaprojects/IDS-Evasion-Fragmented-Ping
本项目演示了通过 hping3 发送 IP 分片的 ICMP 小负载报文,成功绕过 Snort 2.9.20 自定义 dsize 检测规则的完整方法与防御对策。
Stars: 0 | Forks: 0
# 使用分片 Ping 绕过 IDS




## 概述
本项目作为 **Anonymous India 道德黑客实习(2026 年 3 月)** 的一部分,在一个隔离的虚拟实验室环境中演示了一套完整的端到端 IDS 规避技术。
本次目标为:
1. 在 Ubuntu 24.04 上部署并配置 **Snort 2.9.20** 作为实时 IDS
2. 编写自定义 ICMP 检测规则,并确认其能检测正常的 ping 流量
3. 使用带有 IP 分片功能的 **hping3** 发送低于规则检测阈值的报文 — 在保持完全连通性的同时实现 **零告警**
## 实验环境
| 组件 | 详情 |
|-----------|---------|
| 攻击机 | Kali Linux — `192.168.109.129` |
| 防御机 / IDS | Ubuntu 24.04.4 LTS — `192.168.109.132` |
| IDS 软件 | Snort 2.9.20 GRE (Build 82) |
| 规避工具 | hping3 |
| 网络 | VMware VMnet8 (NAT) — 隔离,无外部流量 |
## 技术原理
标准的 `ping` 发送 **56 字节的 ICMP 负载**。Snort 规则被配置为仅在负载大小超过 7 字节时触发告警(`dsize:>7`)。通过使用带有 **1 字节负载**(`-d 1`)和**强制 IP 分片**(`-f`)的 hping3,报文成功降至该阈值以下 — 因此规则永远不会被触发。
```
Normal ping → 56-byte payload → dsize:>7 = TRUE → ALERT fired
hping3 -d 1 → 1-byte payload → dsize:>7 = FALSE → NO alert
```
同时,`snort.conf` 中的 `frag3` 分片重组预处理器已被禁用,这阻止了 Snort 在进行规则检测前重组分片 — 从而消除了防御此技术的最后一道防线。
## Snort 规则
编写于 `/etc/snort/rules/local.rules`:
```
# Rule v1 — 捕获所有 ICMP (仅作为基准测试)
#alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)
# Rule v2 — 结合 payload 阈值优化 (可利用)
alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Detected"; itype:8; dsize:>7; sid:1000001; rev:2;)
```
| 组件 | 值 | 作用 |
|-----------|-------|---------|
| `itype:8` | ICMP 类型 8 | 仅匹配回显请求 |
| `dsize:>7` | 负载大于 7 字节 | **可被利用的阈值** |
| `sid:1000001` | 自定义 ID | 本地规则范围 (>1,000,000) |
## 规避命令
```
# 具有 1-byte payload 的 Fragmented ICMP — 带有时间戳以作证明
date && sudo hping3 -1 -f -d 1 -c 5 192.168.109.132 && date
```
| 标志 | 含义 |
|------|---------|
| `-1` | ICMP ping 模式 |
| `-f` | 在 IP 层强制进行 IP 分片 |
| `-d 1` | 1 字节数据负载 — **低于 dsize:>7 阈值** |
| `-c 5` | 发送 5 个报文 |
## 结果
| | 正常 `ping` | hping3 分片报文 |
|--|--------------|-------------------|
| 负载 | 56 字节 | 1 字节 |
| IP 分片 | 否 | 是 |
| Snort 告警? | ✅ 是 — 5 次告警 | ❌ 零告警 |
| 连通性 | 0% 丢包率 | 0% 丢包率 |
| **结论** | **已检测** | **已规避** |
带有时间戳的证据表明,在整个 hping3 执行期间(IST 02:43:33–02:43:37),确认产生了 **零次 SID:1000001 告警**,而在此之前的几分钟内,同一个 Snort 实例还在主动检测正常的 ping。
## 阶段
| 阶段 | 操作 | 状态 |
|-------|--------|--------|
| 1 | 安装 Ubuntu 24.04,启用 SSH,验证网络 | ✅ |
| 2 | 安装 Snort 2.9.20,配置 HOME_NET,检测到 ens33 | ✅ |
| 3 | 编写自定义 ICMP 规则(`itype:8`, `dsize:>7`, SID:1000001) | ✅ |
| 4 | 正常 ping 在每个报文上触发 SID:1000001 — 基线已确认 | ✅ |
| 5 | hping3 `-1 -f -d 1` 发送 5 个报文 — Snort 零告警 — 规避成功证明 | ✅ |
## 防御建议
以下是可以防止此类规避的修复措施:
```
-- 1. Remove dsize restriction entirely
alert icmp any any -> $HOME_NET any (msg:"ICMP Echo"; itype:8; sid:1000001; rev:3;)
-- 2. Explicitly catch tiny payloads
alert icmp any any -> $HOME_NET any (msg:"Tiny ICMP Probe"; itype:8; dsize:<8; sid:1000003; rev:1;)
-- 3. Detect fragmented packets directly
alert ip any any -> $HOME_NET any (msg:"Fragmented IP Detected"; fragbits:M; sid:1000002; rev:1;)
```
- 在生产环境中保持 `frag3` 预处理器处于**启用**状态 — 切勿将其注释掉
- 以**内联 IPS 模式**部署 Snort,而不是被动的 IDS 模式,从而进行拦截而不仅仅是告警
- 定期审查自定义规则中可能导致检测盲区的过度限制性条件
## 本仓库中的文件
```
IDS-Evasion-Fragmented-Ping/
├── README.md
├── report/
│ └── Assessment_11C_IDS_Evasion.pdf
├── snort-rules/
│ └── local.rules
└── screenshots/
├── figure_08_snort_baseline_detection.png
└── figure_10_evasion_confirmed_zero_alerts.png
```
## 免责声明
*Sai Aditya — 道德黑客实习生,Anonymous India — 2026 年 3 月*
标签:hping3, ICMP, IDS规避, IP分片, meg, VMware, 信息安全, 入侵检测系统, 匿名印度实习, 安全实验, 安全数据湖, 安全测试, 实验报告, 攻击性安全, 数据包分片, 数据展示, 流量伪装, 红队, 网络分流, 网络安全, 网络攻防, 规则绕过, 隐私保护