Taisa456/network-security-snort

GitHub: Taisa456/network-security-snort

在Kali虚拟化实验环境中完整部署Snort 3,通过IDS与IPS两阶段对比实验,验证自定义规则对ICMP侦察、Nmap扫描、Hydra暴力破解和vsftpd后门攻击的检测与阻断效果。

Stars: 0 | Forks: 0

# Snort IDS/IPS 部署实验 在 Kali Linux 的三台虚拟机构成的网络中,完整部署 **Snort 3** 作为入侵检测系统(被动监控)和入侵防御系统(通过 iptables 主动阻断),并针对四种攻击向量进行了验证。 该实验通过运行完全相同的四向量攻击链两次,证明了**检测**和**防御**之间的操作区别——首先针对只能记录日志但无法阻断的 IDS,然后针对结合了 iptables IPS 层的 IDS,该层能够选择性地丢弃攻击,同时保留合法流量。 ## 目录 - [实验环境](#lab-environment) - [网络拓扑](#network-topology) - [方法论](#methodology) - [Snort 配置](#snort-configuration) - [自定义检测规则](#custom-detection-rules) - [阶段 1 — IDS 模式](#stage-1--ids-mode) - [阶段 2 — IPS 模式](#stage-2--ips-mode) - [IDS 与 IPS — 结果对比](#ids-vs-ips--side-by-side-results) - [讨论](#discussion) - [架构说明](#architecture-note) - [仓库结构](#repository-structure) - [复现实验](#reproducing-the-lab) - [道德声明](#ethical-disclaimer) - [许可证](#license) ## 实验环境 | 组件 | 详情 | |---|---| | **分析器 / 路由器** | Kali Linux — 3 块网卡:`eth0` WAN (192.168.10.143, NAT)、`eth1` LAN1 (10.10.10.1, 仅主机模式)、`eth2` LAN2 (192.168.50.1, 仅主机模式) | | **攻击者** | Kali Linux — `eth0` 位于 VMnet9 (10.10.10.10) — 默认网关 10.10.10.1 | | **目标机** | Metasploitable 2 — `eth0` 位于 VMnet10 (192.168.50.10) — 默认网关 192.168.50.1 | | **Snort 版本** | Snort++ 3.12.1.0-0kali1(安装在分析器上) | | **攻击工具** | Nmap 7.99, Hydra v9.6, Metasploit Framework (`msfconsole`) | | **虚拟化环境** | VMware — VMnet9 = 10.10.10.0/24, VMnet10 = 192.168.50.0/24 (均为仅主机模式) | ## 网络拓扑 攻击者与 Metasploitable 之间的所有流量都被强制通过分析器,使其成为进行监控和执行策略的天然咽喉点。 ``` ┌─────────────────────────┐ │ Analyzer / Router │ │ Kali + Snort 3 │ │ │ Attacker Kali ──VMnet9──┤ eth1: 10.10.10.1 │ 10.10.10.10 │ │ │ eth0: 192.168.10.143 ───┼──> WAN (NAT) │ │ Metasploitable 2 ─VMnet10┤ eth2: 192.168.50.1 │ 192.168.50.10 │ │ └─────────────────────────┘ ``` ## 方法论 实验分两个阶段执行,每个阶段均采用完全相同的四向量攻击链: 1. **ICMP 侦察** — 使用 `ping` 进行主机发现 2. **Nmap SYN 扫描** — 使用 `nmap -sS` 进行端口枚举(1000 个端口) 3. **Hydra FTP 暴力破解** — 针对 vsftpd 服务的凭证攻击 4. **vsftpd 2.3.4 后门** — 使用 Metasploit 利用 [CVE-2011-2523](https://nvd.nist.gov/vuln/detail/CVE-2011-2523) **阶段 1 (IDS)** 在分析器上以被动模式运行 Snort,并配置五条自定义规则——实时观察警报,并确认攻击依然能够得逞。 **阶段 2 (IPS)** 将 Snort 与使用精准丢弃规则的 `iptables` 执行层结合——确认攻击被阻断,同时 ICMP ping 和合法的 FTP 登录仍能正常运行。 ### 预部署设置 1. 在 VMware 中为分析器配置三块 NIC(两块仅主机模式,一块 NAT/桥接模式)。 2. 启用 IP 转发并添加 `MASQUERADE` + `FORWARD` 规则,使分析器能在子网之间以及向外到 WAN 进行路由——参见 `scripts/router_config.sh`。 3. 在安装 Snort 之前,使用 `scripts/ping_check.sh` 验证每台虚拟机的端到端连通性。 ## Snort 配置 通过 Kali 包管理器(`sudo apt install snort -y`)安装 Snort,并在 `/etc/snort/snort.conf` 中进行配置: ``` HOME_NET = "10.10.10.0/24,192.168.50.0/24" EXTERNAL_NET = "any" ips = { enable_builtin_rules = true, include = "/etc/snort/rules/local.rules", variables = default_variables } alert_fast = { file = true, packet = false } ``` `HOME_NET` 覆盖了两个内部子网,因此 Snort 会将分析器上的所有子网间流量视为需要检查的流量。`alert_fast` 会生成紧凑的单行警报(每个数据包都记录日志会产生庞大的数据量)。 **配置验证:** ``` sudo snort -T -c /etc/snort/snort.conf # 结果:已加载 652 条规则(5 条自定义文本 + 647 条内置),0 个警告 ``` ## 自定义检测规则 `/etc/snort/rules/local.rules` 中的五条规则(完整文件见 [`scripts/local.rules`](scripts/local.rules)): | SID | 名称 | 触发条件 | |---|---|---| | **1000001** | ICMP Ping Detected | 任意方向的 ICMP 流量 — 捕获侦察 ping | | **1000002** | FTP Connection Attempt | 目标端口为 21 的任何 TCP 连接 — 捕获合法和暴力破解流量 | | **1000003** | Possible Nmap SYN Scan | **仅**设置了 SYN 标志(`flags:S`)的 TCP 数据包 — 半开扫描的特征 | | **1000004** | VSFTPD 2.3.4 Backdoor Attempt | FTP 端口 21 上的 `content:":)"` — 确切的 CVE-2011-2523 触发字符串 | | **1000005** | Possible Metasploit Shellcode | `content:"|90 90 90|"` — 通常前置在 Metasploit 载荷中的 x86 NOP 雪橇 | ## 阶段 1 — IDS 模式 Snort 在两个内部接口上以被动模式运行: ``` sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 \ -A alert_fast -l /var/log/snort/ # 在第二个终端中观察告警: sudo tail -f /var/log/snort/alert_fast.txt ``` 启动输出确认了 `pcap DAQ configured to passive`——Snort 能看到每个数据包,但无法丢弃或修改其中任何一个。 ### IDS 结果 从攻击者执行 `scripts/attack_simulator.sh` 后: | 攻击 | 检测 | 结果 | |---|---|---| | ICMP 侦察 | ✅ SID 1000001 — 双向警报 | Ping 完成 | | Nmap SYN 扫描 | ✅ SID 1000003 — 在不到 1 秒内产生数千条警报 | **成功枚举出 23 个开放端口** | | Hydra FTP 暴力破解 | ✅ SID 1000002 — 重复的 FTP 连接警报 | **成功破解 `msfadmin:msfadmin` 凭证** | | vsftpd 2.3.4 后门 | ✅ SID 1000004 — 触发 `:)` 内容匹配 | **获得 Root Meterpreter shell** | 次要观察结果:Snort 的内置规则(`116:408`, `116:414`)会对 DHCP 广播流量发出警报——这并非恶意行为,但在生产环境部署中,需要使用抑制规则来保持警报日志的可操作性。 ## 阶段 2 — IPS 模式 IPS 层使用 [`scripts/ips_setup.sh`](scripts/ips_setup.sh) 进行部署,该脚本执行以下操作: 1. 清除现有的 iptables 规则 2. 重新启用 IP 转发并重新应用基础路由 3. 应用四条针对特定攻击特征的精准丢弃规则 4. 以守护进程模式(`-D`)启动 Snort 以继续记录日志 ### iptables 规则 | 规则 | 作用 | |---|---| | `ACCEPT icmp` | 明确允许所有 ICMP — 保留连通性检查 | | `DROP tcp dpt:21 STRING ":)"` | 丢弃端口 21 上包含 vsftpd 2.3.4 后门触发器的数据包 | | `ACCEPT tcp --syn -m limit --limit 10/s --limit-burst 20` | 允许速率限制内的正常 TCP 握手 | | `DROP tcp --syn`(超出限制后) | 丢弃超过 10/s 的 SYN 洪水 — 击败 Nmap SYN 扫描 | | `DROP tcp dpt:21 -m connlimit --connlimit-above 5 --connlimit-mask 32` | 阻断每个源超过 5 个并发 FTP 连接 — 击败 Hydra 的并行性 | | `ACCEPT eth1→eth0`, `ACCEPT eth2→eth0` | 正常的出站路由 | | `ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED` | 有状态的 — 保留已建立的会话 | ### IPS 结果 在攻击者上重新运行了相同的攻击脚本: | 攻击 | 阶段 2 结果 | |---|---| | ICMP 侦察 | ✅ 被允许(符合预期) | | **Nmap SYN 扫描** | ❌ **被阻断** — `1000 filtered tcp ports (no-response)`,扫描耗时 21.71 秒而非不到 1 秒 | | **Hydra FTP 暴力破解** | ❌ **被阻断** — `all children were disabled due too many connection errors — 0 valid password found` | | **vsftpd 后门** | ❌ **被阻断** — `Rex::ConnectionTimeout — Exploit completed, but no session was created` | ### 正常流量得以保留 两项手动检查证实了策略执行的精准性: - `ping -c 4 192.168.50.10` → 传输了 4 个数据包,接收了 4 个,0% 丢失 - 使用 `msfadmin:msfadmin` 通过 `ftp 192.168.50.10` → `220 (vsFTPd 2.3.4)` … `230 Login successful` 运行期间 iptables 数据包计数器的定量证明:**接受 2051 个数据包,被 FTP connlimit 规则丢弃 12 个数据包,接受 808 个 ICMP 数据包**——用数据证明了策略执行的精准性。 ### 持续的 Snort 日志记录 即使在 IPS 模式下,对于那些在后续数据包被 iptables 丢弃之前已到达其被动检测点的数据包,Snort 仍继续触发 SID 1000002 / 1000003 警报——这意味着 **iptables 提供执行策略而 Snort 提供审计日志**,两者协同工作。 ## IDS 与 IPS — 结果对比 | 攻击 / 流量 | 阶段 1 (仅 IDS) | 阶段 2 (IDS + iptables IPS) | |---|---|---| | ICMP ping | 已检测 ✅ | 已允许 ✅ (符合预期) | | Nmap SYN 扫描 | 已检测 — **发现 23 个开放端口** | **被阻断** — 1000 个已过滤端口 | | Hydra FTP 暴力破解 | 已检测 — **`msfadmin:msfadmin` 被破解** | **被阻断** — 0 个密码被发现 | | vsftpd 2.3.4 漏洞利用 | 已检测 — **获得 Root Meterpreter shell** | **被阻断** — 连接超时 | | 合法 FTP 登录 | 不适用 | 得以保留 (`230 Login successful`) | ## 讨论 ### IDS 模式下是否检测到了所有模拟攻击? 是的——SID 1000001 至 1000004 在攻击模拟期间全部正确触发: - **ICMP ping (1000001)** — 每个 echo/reply 的双向警报。 - **Nmap SYN 扫描 (1000003)** — 在毫秒内产生海量警报,展现出特征性的源端口随机化。 - **FTP 暴力破解 (1000002)** — Hydra 并发连接尝试及其准确时间戳的清晰审计追踪。 - **vsftpd 后门 (1000004)** — `:)` 内容匹配捕获了确切的漏洞利用字节序列。 **但是检测 ≠ 预防。** 在所有警报不断触发的同时,vsftpd 漏洞利用成功开启了一个 root Meterpreter shell。实时监控 IDS 的 SOC 分析师本可以*看到*这次入侵——但由于攻击者几秒钟内就获得了 root 权限,单靠警报是远远不够的。这正是 IPS 存在的核心运营价值。 ### IPS 在不中断正常流量的情况下阻断攻击的效果如何? 该实现实现了对攻击的完全缓解,且对合法流量没有任何可观察到的影响。其有效性源于**精准的规则设计**——每条 iptables 规则针对的都是一种行为特征,而不是广泛的协议: - **SYN 速率限制** 破坏了端口扫描的*洪水模式*,而不影响正常的握手。 - 每个源地址的 **`connlimit`** 阻断了暴力破解工具的*并行性*,而不会中断单会话 FTP。 - **`STRING` 匹配** 丢弃了*确切的漏洞利用载荷*,而不会过滤合法的 FTP 登录流量。 需要承认的一个局限性:ICMP 被完全允许,这意味着攻击者仍然可以通过 ping 确认 Metasploitable 处于活跃。在安全性要求更高的环境中,这将被限制速率或仅限于受信任的来源。在本实验中,ICMP 是主要的连通性验证机制,因此保持开放。 ### 专用 Snort 机器 vs. pfSense/OPNsense 插件 本实验使用了专用的 Snort 机器。与在 pfSense 或 OPNsense 等防火墙设备内将 Snort 作为插件运行相比: **专用方法的优势:** - **性能隔离** — 完整的 CPU 和 RAM 专用于数据包检查;不会与路由、DHCP、VPN、DNS 产生资源争用。 - **定位灵活性** — IDS/IPS 可以串行部署在 SPAN/镜像端口上,或者部署在内部网段边界,以监控从未到达边界防火墙的横向流量。 - **完全的配置控制** — 每个预处理器、DAQ 设置、输出插件和规则更新计划都可以通过 CLI 进行配置。pfSense 仅通过其 GUI 暴露了一小部分功能。 - **弹性** — IDS/IPS 机器可以独立于路由器进行故障转移(故障时开放或故障时关闭)。在 pfSense 中,Snort 崩溃会同时导致路由和检测瘫痪。 **权衡:** - **学习曲线更陡峭** — 需要 CLI 熟练度和直接的规则集管理能力。 - **维护开销** — 规则更新、版本升级、日志轮换等全部需要手动完成。 对于需要高性能、灵活定位和高度定制化的企业环境来说,专用 Snort 是正确的选择。pfSense/OPNsense 插件方法更适合优先考虑易用性的小型企业或家庭实验室环境。 ## 架构说明 阶段 2 技术上是 **被动 Snort + iptables 执行**,而不是运行在真正串行模式下的 Snort——Snort 本身负责记录日志(`pcap DAQ configured to passive`),而 `iptables` 根据速率限制、字符串匹配和连接计数执行丢弃操作。 这是一种合法且常见的部署模式(这也是许多现实世界中基于 Linux 的 IDS/IPS 堆栈的运行方式)。一个自然的后续步骤是将阶段 2 迁移到真正的串行配置,使用 `snort --daq nfq`(或串行模式下的 `afpacket`)以及 Snort 的 `reject` / `drop` 规则动作,从而让 Snort 自己基于完整的特征匹配来执行丢弃操作,而不是委派给 iptables。 ## 仓库结构 ``` snort-ids-ips-lab/ ├── README.md ← this file ├── report/ │ ├── Snort-IDS-IPS-Report.pdf ← full lab report │ └── Snort-IDS-IPS-Report.docx ← editable source ├── scripts/ │ ├── router_config.sh ← IP forwarding + iptables routing │ ├── ping_check.sh ← connectivity verification │ ├── attack_simulator.sh ← 4-vector attack chain │ ├── ips_setup.sh ← IPS iptables rules + Snort daemon │ └── local.rules ← 5 custom Snort rules (SID 1000001-1000005) ├── screenshots/ ← report figures ├── .gitignore └── LICENSE ``` ## 复现实验 1. 在 VMware 中按照上述拓扑构建三台虚拟机(VMnet9 和 VMnet10 设为仅主机模式)。 2. 在**分析器**上:运行 `scripts/router_config.sh`,然后运行 `scripts/ping_check.sh` 以确认网络完全互通。 3. 在分析器上安装 Snort 3: sudo apt update && sudo apt install snort -y 4. 将 `scripts/local.rules` 放置到 `/etc/snort/rules/local.rules`,并在 `/etc/snort/snort.conf` 中设置 `HOME_NET = "10.10.10.0/24,192.168.50.0/24"`。 5. 验证:`sudo snort -T -c /etc/snort/snort.conf` — 预期加载 652 条规则,0 个警告。 6. **阶段 1 — IDS:** sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 -A alert_fast -l /var/log/snort/ # 在另一个终端中: sudo tail -f /var/log/snort/alert_fast.txt 在攻击者上:`sudo ./scripts/attack_simulator.sh` — 观察警报触发并获取 Meterpreter shell。 7. **阶段 2 — IPS:** 在分析器上,运行 `sudo ./scripts/ips_setup.sh`,然后在攻击者上重新运行攻击链。确认攻击被阻断后,手动测试: ping -c 4 192.168.50.10 # should succeed ftp 192.168.50.10 # msfadmin / msfadmin — should succeed ## 道德声明 本仓库中记录的所有活动均仅在自包含的 VMware 虚拟实验环境中进行,旨在用于有监督的学术学习。没有以任何方式针对、扫描或影响任何外部、生产或真实世界的系统。Metasploitable 2 是一台专为安全训练设计的、存在故意漏洞的虚拟机。 **未经系统所有者明确的书面授权,严禁将本材料用于对任何真实系统复制这些活动。** 在大多数司法管辖区,未经授权的端口扫描、凭证攻击或网络服务利用都是非法的。 ## 许可证 MIT — 参见 [LICENSE](LICENSE)。本实验报告仅供教育参考。
标签:CISA项目, CTI, CVE-2011-2523, FTP暴力破解, Hydra, ICMP侦察, IPS, iptables, Maven, Metasploitable2, Nmap, Snort3, SYN扫描, vsftpd漏洞, 入侵检测系统, 入侵防御系统, 后门漏洞, 域名解析, 威胁检测与响应, 威胁猎捕, 安全攻防演练, 安全数据湖, 应用安全, 插件系统, 流量监控, 漏洞验证, 网络安全, 网络安全实验, 自定义检测规则, 虚拟网络实验, 虚拟驱动器, 防御绕过, 隐私保护