AnisBengaji/Detection-Monitoring-homelab
GitHub: AnisBengaji/Detection-Monitoring-homelab
这是一个基于虚拟化技术构建的完整 SOC 家庭实验室,涵盖从攻击模拟、日志采集、威胁检测到自动化响应的全流程安全运营实践环境。
Stars: 0 | Forks: 0
# 网络安全家庭实验室 — 检测与监控
这是一个基于 Pop OS 使用 VMware Workstation 构建的虚拟化 SOC 环境,模拟了一个具有完整网络分段、入侵检测和 SIEM 集成的企业 Active Directory 环境。该实验室涵盖了完整的 SOC 工作流程:攻击模拟 → 日志摄取 → 检测 → 调查 → 自动响应。
## 架构

## 技术栈
| 层级 | 工具 |
|-------|------|
| Hypervisor | VMware Workstation (Pop OS 主机) |
| 防火墙与路由 | pfSense 2.6.0 |
| 网络入侵检测 | Suricata 8.0.4 |
| 端点遥测 | Sysmon (SwiftOnSecurity 配置) |
| SIEM | Splunk Enterprise |
| 身份与访问 | Active Directory (Windows Server 2019) |
| 攻击模拟 | Kali Linux + Atomic Red Team |
| SOAR 自动化 | n8n |
## 网络架构
| 网络 | 子网 | 接口 | 用途 |
|---------|--------|-----------|---------|
| KALI | 192.168.1.0/24 | em1 | 攻击机隔离 |
| VICTIMNET | 192.168.2.0/24 | em2 | 域控制器 + 端点 |
| SEC | 192.168.3.0/24 | em3 | 安全监控 (Suricata) |
| SPANPORT | — | em4 | 流量镜像 |
| SPLUNK | 192.168.4.0/24 | em5 | SIEM 隔离 |
## 摄取的数据源
| 来源 | 数据 | Splunk 索引 |
|--------|------|--------------|
| Suricata IDS | 网络告警, 流数据, DNS, SMB, HTTP | suricata |
| Sysmon (EID 1,3,7,10,11) | 进程创建, 网络连接, 文件事件 | wineventlog |
| Windows 安全日志 | 身份验证, 特权使用, 账户管理 | wineventlog |
| Windows 系统/应用程序 | 服务事件, 应用程序错误 | wineventlog |
| pfSense Syslog | 防火墙允许/拒绝, DNS 查询, DHCP 租约 | pfsense |
## 日志摄取设置
### pfSense Syslog → Splunk
- pfSense 配置为将 syslog 转发到 Splunk UDP 端口 514
- 涵盖防火墙允许/拒绝规则、接口流量、DNS 和 DHCP 活动
### Sysmon → Splunk
- 使用 SwiftOnSecurity 配置在 Windows DC 上安装 Sysmon
- Splunk Universal Forwarder 监控 `Microsoft-Windows-Sysmon/Operational`
- 转发到 `192.168.4.10:9997` 的 Splunk 索引器
### Windows 事件日志 → Splunk
- 安全、系统和应用程序日志通过 Universal Forwarder 转发
- 涵盖 EventID:4624, 4625, 4634, 4672, 4688, 4720, 4732
### Suricata → Splunk
Suricata 部署在监控网络上以检查镜像流量。日志以 EVE JSON 格式生成于 `/var/log/suricata/eve.json`。Suricata VM 上安装的 Splunk Universal Forwarder 将日志转发到 `192.168.4.10:9997` 的 Splunk 索引器。
## 攻击场景与检测
### Kali Linux 攻击链
#### 阶段 1 — 侦察
**工具:** Nmap
```
sudo nmap -sn 192.168.2.0/24
sudo nmap -sS -sV -A -T4 192.168.2.10
sudo nmap -O 192.168.2.10
```
**OS 侦测:**

**端口与服务扫描:**

**Splunk 中检测到:**

**Splunk 查询:**
index=suricata event_type=alert | table timestamp src_ip dest_ip alert.signature
**MITRE:** T1595 - 主动扫描, T1046 - 网络服务扫描
#### 阶段 2 — 枚举
**工具:** Nmap SMB 脚本, CrackMapExec
```
sudo nmap --script=smb-enum-shares,smb-enum-users -p 445 192.168.2.10
crackmapexec smb 192.168.2.10 --users --shares
```
**CrackMapExec AD 枚举:**

**Splunk 中检测到 (SMB 告警):**

**Splunk 查询:**
index=suricata event_type=alert app_proto=smb | table timestamp src_ip dest_ip alert.signature
**MITRE:** T1135 - 网络共享发现, T1087 - 账户发现
#### 阶段 3 — 凭证攻击 (NTLM 暴力破解)
**工具:** Hydra, Metasploit smb_login, CrackMapExec 密码喷洒
**Hydra 暴力破解:**

**密码喷洒:**

**Metasploit SMB 登录:**

**Splunk 中检测到:**

**Splunk 查询:**
index=suricata event_type=alert app_proto=smb | table timestamp src_ip dest_ip alert.signature direction
index=wineventlog EventCode=4625 | stats count by src_ip user | sort -count
**MITRE:** T1110 - 暴力破解, T1557 - 中间人攻击
### Atomic Red Team — MITRE ATT&CK 模拟
Atomic Red Team 通过 `Invoke-AtomicRedTeam` 安装在 Windows DC 上。每个测试都模拟映射到 MITRE ATT&CK 的真实对手技术,并通过 Sysmon 遥测技术验证 Splunk 中的检测。
#### T1057 — 进程发现
```
Invoke-AtomicTest T1057
```
**检测到的进程:** `whoami`, `hostname`, `tasklist`, `wmic process get`, `Get-Process`, `Taskmgr.exe`

#### T1087.001 — 账户发现 + T1059.001 PowerShell + T1003.001 凭证转储
```
Invoke-AtomicTest T1087.001
Invoke-AtomicTest T1059.001
Invoke-AtomicTest T1003.001
```

#### 更多 Atomic Red Team 结果



**用于所有 Atomic 测试的 Splunk 查询:**
index=wineventlog source="WinEventLog:Microsoft-Windows-Sysmon/Operational"
| rex field=_raw "(?[^<]+) "
| rex field=_raw "(?[^<]+) "
| rex field=_raw "(?[^<]+) "
| where NOT match(Image, "splunk")
| table _time Image CommandLine User
| sort -_time
## 自动化检测与响应 (n8n SOAR 工作流)
为了将实验室扩展到被动检测之外,我们为三种攻击场景配置了 Splunk 告警,并将其连接到 n8n SOAR 工作流,该工作流会自动对威胁进行分类、在防火墙上封锁攻击者,并发送实时 Discord 通知 —— 从而将平均响应时间 (MTTR) 减少到接近于零。
### 工作流架构
Splunk 告警 → Webhook → n8n → JavaScript (解析 + 分类) → SSH (pfSense 封锁) → Discord (通知)
### 配置的 Splunk 告警
Splunk 中的三个保存的搜索配置了 Webhook 动作,指向位于 `192.168.3.10:5678` 的 n8n 实例。每个告警在其条件满足时触发,并通过 HTTP POST 将完整的结果 payload 转发给 n8n。
**侦察告警:**

**暴力破解告警:**

**进程发现告警:**

### n8n 工作流

| 节点 | 类型 | 用途 |
|------|------|---------|
| Webhook | 触发器 | 接收来自 Splunk 告警动作的 POST |
| Code in JavaScript | 转换 | 解析告警 payload,分类攻击类型,构建 Discord 消息 |
| Execute a command | SSH | 在 pfSense 上运行 pfctl 命令以封锁攻击者 IP |
| HTTP Request | POST | 将格式化后的告警发送到 Discord webhook |
JavaScript 节点根据 payload 将传入的告警分为两种类型之一:
- **网络告警** (侦察 / 暴力破解):从 Suricata 字段中提取 `src_ip`, `dest_ip`, `alert.signature`
- **端点告警** (进程发现):从 Sysmon 字段中提取 `ComputerName`, `Image`, `CommandLine`
对于网络告警,工作流通过 SSH 连接到 pfSense 并执行:
```
pfctl -t blocklist -T add && echo "" >> /var/db/aliastables/blocklist.txt && echo "Blocked "
```
这会立即在防火墙层丢弃来自攻击者 IP 的流量,并将该条目写入持久化别名表,以便在规则重新加载后封锁依然有效。
### Discord 通知
每种告警类型都会生成实时发送的格式化 Discord 消息。
**侦察:**

**暴力破解:**

**进程发现:**

### 自动化响应摘要
| 攻击 | 检测源 | 封锁 | Discord 告警 |
|--------|-----------------|-------|---------------|
| 侦察 | Suricata | ✅ pfSense pfctl | ✅ |
| 暴力破解 | Suricata + EID 4625 | ✅ pfSense pfctl | ✅ |
| 进程发现 | Sysmon EID 1 | ❌ 本地进程,无 IP | ✅ |
## MITRE ATT&CK 覆盖范围
| 阶段 | 技术 ID | 技术 | 工具 | 已检测 |
|-------|-------------|-----------|------|----------|
| 侦察 | T1595 | 主动扫描 | Nmap | ✅ Suricata |
| 侦察 | T1046 | 网络服务扫描 | Nmap | ✅ Suricata |
| 枚举 | T1135 | 网络共享发现 | CrackMapExec | ✅ Suricata |
| 枚举 | T1087 | 账户发现 | Nmap SMB 脚本 | ✅ Suricata |
| 凭证访问 | T1110 | 暴力破解 | Hydra + Metasploit | ✅ Suricata + EID 4625 |
| 凭证访问 | T1557 | 中间人攻击 | NTLM Capture | ✅ Suricata |
| 发现 | T1057 | 进程发现 | Atomic Red Team | ✅ Sysmon EID 1 |
| 发现 | T1087.001 | 本地账户发现 | Atomic Red Team | ✅ Sysmon EID 1 |
| 执行 | T1059.001 | PowerShell | Atomic Red Team | ✅ Sysmon EID 1 |
| 凭证访问 | T1003.001 | LSASS 转储 | Atomic Red Team | ✅ Sysmon EID 10 |
## 检测覆盖范围
| 战术 | 检测方法 | 来源 |
|--------|-----------------|--------|
| 侦察 | ET SCAN 签名, ICMP 检测 | Suricata |
| 网络扫描 | SMB 畸形请求检测 | Suricata |
| 暴力破解 | NTLM 认证尝试签名 | Suricata |
| 失败登录 | EventID 4625 阈值告警 | Windows/Splunk |
| 进程创建 | Sysmon EID 1 | Sysmon/Splunk |
| 凭证转储 | Sysmon EID 10 (LSASS 访问) | Sysmon/Splunk |
| PowerShell 滥用 | Sysmon EID 1 + 脚本块日志记录 | Sysmon/Splunk |
| 防火墙活动 | pfSense syslog 允许/拒绝 | pfSense/Splunk |
## 关键 Splunk 查询
**所有 Suricata 告警:**
index=suricata event_type=alert | table timestamp src_ip dest_ip alert.signature alert.severity | sort -timestamp
**SMB 攻击检测:**
index=suricata event_type=alert app_proto=smb | table timestamp src_ip dest_ip alert.signature direction | sort -timestamp
**暴力破解检测:**
index=wineventlog EventCode=4625 | stats count by src_ip user | sort -count
**Sysmon 进程创建:**
index=wineventlog source="WinEventLog:Microsoft-Windows-Sysmon/Operational"
rex field=_raw "(?[^<]+) "
| rex field=_raw "(?[^<]+) "
| where NOT match(Image, "splunk")
| table _time Image CommandLine User
| sort -_time
**完整攻击时间线:**
index=suricata OR index=wineventlog (EventCode=4625 OR EventCode=4624 OR event_type=alert)
| table _time src_ip dest_ip alert.signature EventCode user
| sort -_time
## 展示的技能
- 在 Linux 主机上使用 pfSense 进行网络分段和 VLAN 设计
- VMware Workstation 家庭实验室设计与配置
- Suricata IDS 部署、规则管理和告警调优
- Splunk 日志摄取、索引和跨源关联
- Sysmon 部署和配置以实现端点可见性
- pfSense syslog 转发到 Splunk 进行网络层检测
- Active Directory 管理和攻击面认知
- 使用 Kali Linux, Hydra, 和 Metasploit 进行进攻性安全测试
- 使用 Atomic Red Team 进行 MITRE ATT&CK 技术模拟
- 使用 n8n 进行 SOAR 工作流设计和实施
- Splunk 与外部自动化之间的基于 Webhook 的集成
- 通过 SSH 和 pfctl 进行自动化防火墙响应
- 使用 JavaScript 进行告警分类和丰富
- 到 Discord 的实时通知管道
- 端到端 SOC 工作流程:攻击模拟 → 检测 → 自动化响应
## 经验教训
从头构建这个实验室暴露了许多现实世界的挑战,这些挑战显著加深了我对 SOC 基础设施、网络工程和检测工程的理解。我遇到的问题 —— 以及解决它们的过程 —— 比任何引导式教程教会我的都要多。
### 基础设施与网络
**VMware Host-Only 网络与混杂模式**
这个实验室中最耗时的挑战是让 Suricata 看到网络流量。Linux 上的 VMware Workstation 默认在内核层面阻止混杂模式,这意味着即使 VMnet 分配正确,Suricata VM 也收不到镜像流量。修复方法需要直接编辑 VM 的 `.vmx` 文件以添加 `ethernet0.noPromisc = "FALSE"`,并在每次重启后在主机上运行 `chmod a+rw /dev/vmnet*`。我最终通过 systemd 服务实现了自动化。这反映了一个现实世界的挑战,即网络分流器和 SPAN 端口需要仔细的物理和逻辑配置才能正常工作。
**pfSense 作为网络核心**
使用 pfSense 来分割五个独立的网络教会了我企业防火墙的实际工作原理 —— 不仅仅是允许/拒绝规则,还包括每个接口的 DHCP 作用域、VLAN 间路由决策,以及每个网段的 DNS 解析有何不同。一个微妙但重要的教训是:VMware 自己的 DHCP 服务在与 pfSense 竞争并获胜,给 VM 分配了错误的 IP。在所有仅主机网络上禁用 VMware DHCP 并让 pfSense 处理一切,解决了整个实验室中持续存在的连接问题。
**跨网段的 IP 寻址与路由**
让 Windows DC 上的 Splunk Universal Forwarder 能够连接到不同子网上的 Splunk 服务器,需要理解 pfSense 必须在 VICTIMNET 和 SPLUNK 网络之间具有显式路由。仅仅让两个 VM 运行是不够的 —— 防火墙规则必须明确允许流量流动。这是我在真实 SOC 环境中排查日志缺口时会直接应用的一个教训。
### 检测与日志摄取
**Splunk Forwarder 指向错误的 IP**
将 Splunk VM 从 NAT 迁移到专用网段后,Windows DC 上的 Universal Forwarder 仍然指向旧的 NAT IP (`172.16.5.128`)。日志看起来配置正确,但 Splunk 中什么也没收到。一旦确定问题,修复方法很简单 —— 删除并重新添加转发服务器 —— 但这强化了一个重要的 SOC 教训:始终验证端到端的连接性,而不仅仅是配置文件。配置错误的转发器会静默丢弃日志,且没有明显的警报。
**Sysmon XML 渲染与纯文本**
在 Splunk forwarder inputs.conf 中设置 `renderXml = true` 导致 Sysmon 事件以原始 XML 块而不是解析后的字段形式到达。这意味着标准的 Splunk 搜索(如 `Image=` 或 `CommandLine=`)没有返回结果。变通方法是使用 `rex` 字段提取来内联解析 XML。永久修复方法是设置 `renderXml = false`。这教会了我验证日志源不仅仅是到达 SIEM,而是以实际上可搜索且对检测有用的格式到达的重要性。
**Windows DC 与 Splunk 之间的时区不匹配**
Windows DC 在 UTC+1 下运行,而 Splunk 索引器在 UTC 下运行。这导致了一致的一小时差距,即在使用相对时间过滤器搜索时,最近的事件显示“0 个结果”。将 Splunk 搜索切换为“All time”立即揭示了这些事件。永久修复方法是对齐所有 VM 的时区并正确配置 NTP。在真实的 SOC 环境中,日志源之间的时区不一致是一个已知的盲点,可能导致分析师在调查期间错过警报。
### 入侵检测
**Suricata 接口配置**
默认的 Suricata 配置在 `suricata.yaml` 的多个部分中引用 `eth0`。在 Ubuntu 22.04 上,接口名为 `ens33`。尽管更新了主要的 `af-packet` 部分,配置的其他部分仍然引用 `eth0`,导致 Suricata 启动但处理零数据包的静默失败。教训:始终验证完整的配置文件,而不仅仅是显而易见的部分,并在部署前使用 `suricata -T -c suricata.yaml -v` 进行测试。
**虚拟环境中的 SPAN 端口限制**
物理 SPAN 端口将交换机上的所有流量镜像到指定的监控端口。在 VMware Workstation 中,复制此行为需要在 pfSense 中进行桥接配置,并在 Hypervisor 层面启用混杂模式。当这不能可靠地工作时,我转向将 Suricata 直接放置在 VICTIMNET 网段上,这证明更有效且更易于维护。这里的教训是,与物理基础设施相比,虚拟环境有时需要创造性的变通方法。
### 攻击模拟
**Atomic Red Team 与字段解析**
运行 Atomic Red Team 测试时,Sysmon 事件以原始 XML 格式到达 Splunk,这使得无法使用标准字段名按进程名或命令行进行过滤。这导致我编写自定义 `rex` 提取来从原始 XML 中解析 `Image`, `CommandLine`, 和 `User` 字段。这是一个意想不到的有价值的练习 —— 理解如何从未解析的日志中提取字段是任何处理非标准日志源的 SOC 分析师的核心技能。
**暴力破解检测需要基线**
运行 Metasploit SMB 登录扫描器最初在 Suricata 中产生了告警,但没有产生有意义的 Windows EventID 4625 条目,因为 Windows Server 上的默认审核策略并不总是记录失败的网络身份验证尝试。需要使用 `auditpol /set /subcategory:"Logon" /failure:enable` 启用审核策略。这反映了一个现实世界的差距 —— 许多组织运行默认的 Windows 审核策略,这不足以检测凭证攻击。
### 通用
**文档是实验室的一部分**
这个项目中最被低估的部分是文档。记录什么有效、什么无效以及为什么,所花费的时间与技术工作本身一样多。这种记录决策、配置和失败的纪律,直接适用于需要清晰时间线和证据链的事件响应工作。
**迭代解决问题胜过完美**
几乎没有什么是在第一次尝试时就奏效的。最有效的方法是一次隔离一个变量 —— 在调试 Suricata 之前用 `tcpdump` 确认流量存在,在调试 Splunk 转发之前用 `Test-NetConnection` 确认端口连接。这种系统化方法正是 SOC 分析师和事件响应者在生产环境中处理未知问题的方式。
**SOAR 集成调试**
构建 n8n 自动化管道引入了一类不同于基础设施工作的挑战。调试需要同时追踪四个不同系统的故障 —— Splunk 告警交付、n8n webhook 接收、pfSense 上的 SSH 命令执行以及 Discord API 响应。每个节点都可能静默失败或发出误导性的错误消息。关键教训是在连接每个节点之前单独测试,并始终验证数据在每个阶段是否以预期格式流动,而不是假设上游节点输出正确。
## 参考资料
- [Cyberwox Academy Homelab Guide](https://blog.cyberwoxacademy.com/post/building-a-cybersecurity-homelab)
- [Suricata 文档](https://docs.suricata.io)
- [Splunk 文档](https://docs.splunk.com)
- [MITRE ATT&CK 框架](https://attack.mitre.org)
- [SwiftOnSecurity Sysmon 配置](https://github.com/SwiftOnSecurity/sysmon-config)
- [Atomic Red Team](https://github.com/redcanaryco/atomic-red-team)
- [Invoke-AtomicRedTeam](https://github.com/redcanaryco/invoke-atomicredteam)
- [n8n 文档](https://docs.n8n.io)
标签:Active Directory, AMSI绕过, Atomic Red Team, HTTP/HTTPS抓包, IPS, Metaprompt, n8n, PE 加载器, pfSense, Plaso, SOAR, SOC实验室, Suricata, Sysmon, Terraform 安全, VMware, Web报告查看器, Windows Server, 企业防御, 威胁检测, 威胁检测与响应, 安全运营, 家庭实验室, 库, 应急响应, 态势感知, 扫描框架, 攻击模拟, 数据泄露检测, 日志 ingestion, 流量镜像, 漏洞分析, 现代安全运营, 端点 telemetry, 网络分段, 网络安全, 自动化响应, 虚拟化环境, 蜜罐, 证书利用, 路径探测, 防火墙, 隐私保护, 驱动签名利用