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 ![状态](https://img.shields.io/badge/Status-Completed-brightgreen) ![IDS](https://img.shields.io/badge/IDS-Snort%202.9.20-blue) ![工具](https://img.shields.io/badge/Evasion%20Tool-hping3-red) ![实验环境](https://img.shields.io/badge/Environment-Isolated%20VMware%20Lab-lightgrey) ## 概述 本项目作为 **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, 信息安全, 入侵检测系统, 匿名印度实习, 安全实验, 安全数据湖, 安全测试, 实验报告, 攻击性安全, 数据包分片, 数据展示, 流量伪装, 红队, 网络分流, 网络安全, 网络攻防, 规则绕过, 隐私保护