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漏洞, 入侵检测系统, 入侵防御系统, 后门漏洞, 域名解析, 威胁检测与响应, 威胁猎捕, 安全攻防演练, 安全数据湖, 应用安全, 插件系统, 流量监控, 漏洞验证, 网络安全, 网络安全实验, 自定义检测规则, 虚拟网络实验, 虚拟驱动器, 防御绕过, 隐私保护