malathi-cyber-sketch/SOC-Home-Lab-Network-Threat-Detection-with-Suricata-Zeek
GitHub: malathi-cyber-sketch/SOC-Home-Lab-Network-Threat-Detection-with-Suricata-Zeek
一个基于VirtualBox构建的开源SOC防御实验室,通过模拟真实攻击并利用Suricata和Zeek进行网络威胁检测与流量分析。
Stars: 0 | Forks: 0
# 🛡️ SOC 家庭实验室 — 使用 Suricata + Zeek 进行网络威胁检测









## 📌 我为什么要构建这个实验室
仅仅阅读 IDS/NSM 工具的资料与实际运行它们是完全不同的。我想亲身体验坐在 SOC 防御者一端到底是什么感觉:观察攻击者探测网络,在告警流中捕获该活动,然后——带着证据——解释发生了什么、是如何发生的以及为什么它很重要。
因此,我从零开始构建了一个包含三台机器的实验室,攻击了我自己的目标,并使用两款行业标准工具来进行检测:
- **Suricata** — 基于特征的 IDS。回答:*“这个活动是恶意的吗?”*
- **Zeek** — 网络安全监控器。回答:*“网络上到底发生了什么?”*
**结果:** 在整个攻击序列中触发了 7 个不同的 Suricata 告警特征。Zeek 生成了涵盖 12 种日志类型的结构化日志(`conn.log`、`dns.log`、`dhcp.log`、`weird.log`、`notice.log` 等)。每一个攻击者的动作都至少被一个工具捕获——其中一些甚至被两者同时捕获,这正是真实 SOC 所依赖的重叠覆盖。
## 🗺️ 实验室架构
```
┌──────────────────────────────────────────────────────┐
│ VirtualBox Host-Only Network │
│ 192.168.56.0/24 │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Kali Linux │ │ Windows 10 │ │
│ │ (Attacker) │─────▶│ (Target) │ │
│ │192.168.56.103│ │192.168.56.102│ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └──────────┬──────────┘ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Ubuntu — Dora │ │
│ │ DEFENDER / NSM │ │
│ │ 192.168.56.104 │ │
│ │ │ │
│ │ • Suricata 7.0.3 │ │
│ │ • Zeek 8.0.8 │ │
│ │ • tcpdump │ │
│ │ • interface enp0s8 │ │
│ └──────────────────────┘ │
│ │
│ DHCP Server: 192.168.56.100 │
└──────────────────────────────────────────────────────┘
```
| 机器 | 操作系统 | IP | 角色 |
|---|---|---|---|
| Dora (防御者) | Ubuntu 24.04 LTS | 192.168.56.104 | IDS / NSM 传感器 |
| Kali (攻击者) | Kali Linux 2026 | 192.168.56.103 | 攻击者 |
| Client (目标) | Windows 10 Pro (build 17763) | 192.168.56.102 | 目标 |
| DHCP Server | VirtualBox Host-Only | 192.168.56.100 | 地址分配 |
## 🧱 第一阶段 — 构建网络
**工具:** VirtualBox Network Manager(NAT + Host-Only 适配器)
**原因:** 每台虚拟机都需要两个独立的网络——一个用于连接互联网以获取更新和安装软件包(NAT),另一个是私有、隔离的网段,让攻击者、目标和传感器能够在不接触外部世界的情况下互相通信(Host-Only)。这种隔离正是让运行真实攻击工具变得*安全*的原因。
**我做了什么:**
```
VirtualBox → File → Network Manager → Host-Only Networks
Subnet: 192.168.56.0/24
DHCP Server: enabled (192.168.56.100)
Assign each VM's 2nd adapter to this network
```
**输出:**
- Ubuntu (Dora): `enp0s3` (NAT) + `enp0s8` (host-only, 混杂模式抓包接口)
- Kali: `eth0` (NAT) + `eth1` (host-only, DHCP 分配)
- Windows 10: Ethernet 2 on host-only → `192.168.56.102`,暴露端口 **135 (MSRPC)**, **139 (NetBIOS)**, **445 (SMB)**
| Ubuntu (Dora) IP 配置 | Kali IP 配置 | Windows 10 IP 配置 |
|---|---|---|
|  |  |  |
## ✅ 第二阶段 — 验证连通性
**工具:** `ping`, `ip a`, `ip route`, `nmap -sn`
**原因:** 在信任任何 IDS 告警之前,您需要知道您的基线网络确实是端到端畅通的。跳过这一步是典型的初学者错误——当真正的问题出在路由时,您却最终在调试 IDS 配置。
**我做了什么:** 在 host-only 子网中,从每台机器向所有其他机器发送了 ping。
**输出:**
- Ubuntu ↔ Windows/Kali: 0% 丢包,TTL=128 (Windows) / TTL=64 (Kali),仅凭 TTL 就能确认 OS 指纹
- Kali ↔ 所有: 0% 丢包,低于 3ms 延迟
- Windows ↔ 所有: 确认了完整的三向连通性
| Ubuntu ping 结果 | Kali ping 结果 | Windows ping 结果 |
|---|---|---|
|  |  |  |
## ⚙️ 第三阶段 — 安装与配置 Suricata
**工具:** Suricata 7.0.3 (基于特征的 IDS)
**原因:** Suricata 根据数以万计的社区威胁特征检查每一个数据包,并在流量匹配到已知的恶意模式(端口扫描、畸形的协议字段、已知的漏洞利用字符串等)的那一刻触发告警。
**我做了什么:**
```
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update && sudo apt install suricata -y
sudo suricata-update
# 编辑 /etc/suricata/suricata.yaml → 设置 HOME_NET 和 interface
sudo suricata -T -c /etc/suricata/suricata.yaml -v # validate config
sudo systemctl enable --now suricata
```
**输出:** 设置 `HOME_NET` 以覆盖实验室子网。成功加载 **50,896 条特征**。`systemctl status suricata` → **active (running)**,PID 61075,约 280MB 内存。
**Suricata 已安装:**

**Suricata 配置 (HOME_NET + 接口):**

**Suricata 运行中:**

## ⚙️ 第四阶段 — 安装与配置 Zeek
**工具:** Zeek 8.0.8 (网络安全监控器)
**原因:** 当 Suricata 告诉您*“这匹配到了恶意特征”*时,Zeek 会告诉您*发生的所有事情*——每一个连接、它的持续时间、字节数、状态和协议行为——无论它是否匹配了已知的特征。这对于捕获没有现有规则的活动至关重要。
**我做了什么:**
```
sudo apt install zeek-8.0 -y
sudo nano /opt/zeek/etc/node.cfg # set interface=enp0s8
sudo zeekctl check
sudo zeekctl deploy
ls /opt/zeek/logs/current/
```
**输出:** Zeek 作为独立节点部署,监听 `enp0s8`。`zeekctl status` → **running**,生成 12 种活动日志。
**安装 Zeek:**

**Zeek node.cfg 配置:**

## ⚔️ 第五阶段 — 模拟攻击者活动
**工具:** `ping`、`nmap`(激烈扫描、服务版本扫描、SYN 扫描)
**原因:** IDS/NSM 组合的效果仅取决于针对它测试的流量。我模拟了真实攻击者在入侵网络最初几分钟执行的确切侦查行为:主机发现、端口扫描、服务指纹识别和 OS 探测。
**我做了什么(从 Kali):**
```
ping 192.168.56.102
sudo nmap -sS 192.168.56.102
sudo nmap -A 192.168.56.102
nmap -sV 192.168.56.102
```
**输出:**
- **ICMP 扫描:** 超过 15 个然后是超过 50 个数据包,TTL=128,平均 RTT 1.389ms
- **`nmap -A`:** 以 97% 的置信度识别出 Windows 10 Pro build 17763,主机名 `CLIENT`,WORKGROUP 域,2小时19分钟的时钟偏移,开放端口 135/139/445
- **`nmap -sV`:** 在 445/tcp 上抓取到 `Microsoft Windows 7–10 microsoft-ds` 的 Banner
**从 Kali 产生流量:**

**Ping 扫描结果:**

**对目标进行 Nmap 扫描:**

**Nmap -sV 服务探测结果:**

**Kali 侧的 Zeek 视图:**

## 🚨 第六阶段 — Suricata 告警结果
**工具:** `fast.log`, `eve.json`
**原因:** 这就是收获所在——确认传感器确实按正确的顺序和正确的严重程度捕获了我对它进行的测试。
**输出 — 完整告警时间线:**
| 时间 | 告警 |
|---|---|
| 08:42:26 | DHCP 请求中可能存在的 Kali Linux 主机名 (规则 2022973, 优先级 1) |
| 08:47:26 | 相同的告警再次出现 |
| 08:49:19 | 应用层不匹配 — 端口 135 |
| 08:49:20–22 | ICMPv4 未知代码 (Ping 扫描) |
| 08:49:24 | SMB 畸形协商方言 ×3 |
| 08:49:24 | NTLM 协商 → NTLMv1 挑战 → NTLM 认证 |
| 08:49:29–30 | SMB 畸形协商方言 (最后爆发) |
**7 个不同的特征被触发**——从攻击者在第一次扫描开始之前就在 DHCP 广播中泄露了自己的身份开始。
**Suricata fast.log 告警输出:**

**Ubuntu 传感器抓取流量:**

## 🔍 第七阶段 — Zeek NSM 结果
**工具:** `conn.log`, `dns.log`, `dhcp.log`, `notice.log`, `weird.log`, `tcpdump`
**原因:** 为了证明这两个工具是互补的——Suricata 捕获了*发生了什么*,Zeek 捕获了*是怎么发生的*。
**输出:**
- `conn.log` (462 KB) 捕获了触发 Suricata 规则 2022973 的同一个 DHCP 握手——从两个角度都可见。
- nmap SYN 扫描产生了教科书般的 Zeek 指纹:从 `192.168.56.103` 到 `192.168.56.102` 上连续端口的数百个 `S0` 状态连接(发送了 SYN,无响应),每一个都持续了近零毫秒——这是纯粹基于行为的检测,无需任何特征。
- `tcpdump -i enp0s8 host 192.168.56.103` 确认所有三个工具(Suricata、Zeek、tcpdump)都在同时监听同一根网线,捕获到了相同的 ARP 解析和 SYN 数据包。
**Zeek conn.log 结果:**

**Ping 扫描的 Zeek 结果:**

**Nmap SYN 扫描的 Zeek 结果 (S0 模式):**

**tcpdump 交叉验证:**

## 🧩 遇到的挑战与解决方案
这个构建的每个阶段都遇到了实际的障碍。说实话,记录这些挑战正是我学习到最多的地方。
| # | 挑战 | 根本原因 | 解决方案 |
|---|---|---|---|
| 1 | 不确定使用哪个 Ubuntu ISO | N/A | 选择了 Ubuntu Server 24.04.4 LTS (amd64) — 轻量级,仅限 CLI,比 Desktop 占用更少,非常适合做传感器 |
| 2 | 虚拟机之间无法通信 | 只配置了一个适配器 | 给每台虚拟机分配了两个适配器:NAT (互联网) + Host-Only (内部实验室流量) |
| 3 | Kali 没有显示 host-only IP | VirtualBox 中未启用适配器 2 | 启用它并重启 — `eth1` 出现并被分配了 `192.168.56.x` 地址 |
| 4 | Kali 随机丢失其 NAT 地址 | 接口被 NetworkManager 丢弃 | `sudo nmcli device connect eth0`,并通过 `ip a` 验证 |
| 5 | Windows ↔ Kali ping 失败 (100% 丢包) | 路由/ARP 看起来正常(`nmap -sn` 显示主机在线)—实际原因是 Windows 防火墙阻止了 ICMP | 在 Windows Defender 防火墙中启用了 *文件和打印机共享 (Echo Request – ICMPv4-In)* |
| 6 | 不同 OS 之间的接口名称不匹配 | Ubuntu 使用 `enp0s3/enp0s8`,Kali 使用 `eth0/eth1` | 在每次更改配置之前,针对每个 OS 使用 `ip a` 验证实际名称 |
| 7 | `Package zeek has no installation candidate` | Ubuntu 的默认软件库不提供当前版本的 Zeek | 添加了官方的 Zeek OpenSUSE Build Service 软件库,直接安装了 Zeek 8.0 |
| 8 | Suricata 崩溃: `ioctl: Failure ... for 'eth0': No such device` | `suricata.yaml` 在几处仍引用了错误的接口 | 使用 `grep` 查找配置中的每一个接口引用,将其全部更新为 `enp0s8`,并使用 `suricata -T -c ... -v` 进行验证 — 成功加载了 50,896 条特征 |
| 9 | Postfix 安装提示打断了 Zeek 设置 | Zeek 将邮件传输代理作为依赖项拉取 | 选择了 **“Local Only”** — 对于单主机的家庭实验室来说足够了 |
| 10 | Zeek 看不到任何实验室流量 | `node.cfg` 仍然指向 NAT 接口(`eth0`)而不是 host-only 网卡 | 在 `/opt/zeek/etc/node.cfg` 中将 `interface=` 更改为 `enp0s8`,并使用 `zeekctl deploy` 重新部署 |
| 11 | Kali 上的 Zsh 历史记录损坏 | 非正常关机 | 删除了损坏的历史记录文件,让 Zsh 重新生成它(对实验室数据无影响) |
## 🧠 MITRE ATT&CK 映射
| 技术 | ID | 证据 |
|---|---|---|
| 网络服务扫描 | T1046 | `nmap -sS/-sV`;Zeek 的 `S0` 爆发模式 |
| 主动扫描 — IP 块 | T1595.001 | `nmap -A`;Suricata ICMPv4 告警 |
| 系统信息发现 | T1082 | Nmap OS 指纹: Windows 10 Pro 17763 |
| SMB / Windows 管理共享 | T1021.002 | Suricata SMB 协商方言告警 (规则 2225005) |
| NTLM 中继 / 认证探测 | T1557.001 | Suricata NTLM 链 (规则 2067085/86/87) |
| 攻击者身份暴露 | T1016 | Kali 主机名在 DHCP 请求中泄露 (规则 2022973) |
## 🔑 关键发现
1. **攻击者在发送第一个攻击数据包之前就已经暴露了自己。** Kali 的主机名在其自身的 DHCP 广播中泄露——这是一个优先级为 1 的 Suricata 告警,也是真实调查中的第一个枢纽指标。
2. **Nmap SYN 扫描具有 unmistakable 的 Zeek 指纹。** 在不到一秒钟的时间内,从一个源向连续端口发起数百个 `S0` 连接——纯粹通过行为即可检测,无需任何特征。
3. **端口 445 (SMB) 是一个丰富的告警面。** 一次简单的 nmap SMB 交互就触发了三个独立的 Suricata 规则:畸形协商方言、应用层不匹配以及 NTLM 认证链。
4. **NTLMv1 在 Windows 10 目标上仍然处于活动状态**——这是一个已知的中继攻击弱点。现实世界的强化建议:通过组策略强制要求最低使用 NTLMv2。
5. **Suricata 和 Zeek 是互补的,而不是冗余的。** Suricata 回答*发生了什么*(已知的恶意特征);Zeek 回答*是怎么发生的*(连接状态、时间、字节数)。SOC 分析师需要两者兼顾才能构建出完整的全貌。
## 🚀 如何复现此实验室
```
# 1. Host-only 网络
VirtualBox → File → Network Manager → Host-Only Networks
Subnet: 192.168.56.0/24 | DHCP: enabled (192.168.56.100)
# 2. 安装 Suricata(在 sensor VM 上)
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update && sudo apt install suricata -y
sudo suricata-update
sudo suricata -T -c /etc/suricata/suricata.yaml -v
sudo systemctl enable --now suricata
# 3. 安装 Zeek(在 sensor VM 上)
sudo apt install zeek-8.0 -y
sudo nano /opt/zeek/etc/node.cfg # interface=enp0s8
sudo zeekctl deploy
# 4. 从 Kali 发起攻击
ping 192.168.56.102
sudo nmap -sS 192.168.56.102
sudo nmap -A 192.168.56.102
nmap -sV 192.168.56.102
# 5. 查看 detections
sudo tail -f /var/log/suricata/fast.log
cd /opt/zeek/logs/current && tail -f conn.log
sudo tcpdump -i enp0s8 host 192.168.56.103
```
## 📁 仓库结构
```
soc-home-lab/
├── README.md
└── screenshots/
├── server_ip.png
├── kali_ip.png
├── windows_10_ip.png
├── ubuntu_can_talk.png
├── kali_talk.png
├── windows_can_talk.png
├── suricata_installed.png
├── suricata_configuration.png
├── suricata_troubleshoot.png
├── suricata_running.png
├── installing_zeek.png
├── conf_zeek.png
├── generating_traffic.png
├── kali_ping_flood.png
├── nmap_scan_on_target.png
├── nmap_sV_results.png
├── zeek_on_kali.png
├── suricata_results.png
├── ubuntu_capturing.png
├── zeek_results.png
├── zeek_results_on_ping.png
├── zeek_nmap.png
└── tcpdump_results.png
```
## 👤 关于我
**Malathi Mittapalli (Enola)** — 有志成为 SOC 分析师 | VAPT 爱好者 | 蓝队与威胁狩猎
拥有 6 个月的网络安全实习经验,涵盖网络/数据包分析、IDS/防火墙运维、VAPT、Web 应用安全以及 SOC 运维。这个实验室是端到端构建的——从网络设计和工具安装,到实时攻击模拟、检测以及 MITRE 映射分析——旨在展示 SOC Tier 1 岗位在第一天就需要具备的这种实战型蓝队技能。
[](https://linkedin.com/in/malathi-mittapalli-enola-b73208413)
[](https://github.com/malathi-cyber-sketch)
*MIT License — 免费使用、复刻和拓展。*
标签:CTI, Metaprompt, Rootkit, Suricata, VirtualBox, Zeek, 安全运营, 扫描框架, 插件系统, 现代安全运营, 网络流量分析, 靶场环境