s225645819/splunk-soc-detection-dashboard
GitHub: s225645819/splunk-soc-detection-dashboard
基于 Splunk 和 BOTS v3 数据集构建的蓝队 SOC 检测仪表板项目,通过四种映射 MITRE ATT&CK 的检测规则还原完整入侵杀伤链。
Stars: 0 | Forks: 0
# SOC 检测仪表板 — Splunk + BOTS v3
这是一个蓝队检测工程项目,使用 **Boss of the SOC (BOTS) v3** 数据集在 **Splunk Enterprise** 中构建。该仪表板接收真实的安全遥测数据,并呈现出四种检测,这些检测共同重构了整个入侵过程——从初始访问到命令与控制 (C2)——并将每种检测映射到 **MITRE ATT&CK** 框架。
## 概述
| | |
|---|---|
| **平台** | Splunk Enterprise (Dashboard Studio, Grid 布局) |
| **数据集** | [Splunk BOTS v3](https://github.com/splunk/botsv3) — 约 208 万条预索引事件 |
| **使用的数据源** | Azure AD 登录日志、Sysmon 进程创建、网络流 (TCP/IP) |
| **检测** | 4 种(身份验证暴力破解、恶意 PowerShell、伪装、C2 / 出站) |
| **框架** | MITRE ATT&CK |
BOTS v3 中的场景以虚构公司 **Frothly** (`froth.ly`) 为中心。以下检测追踪了攻击者在 **2018 年 8 月 20 日至 21 日**夜间在网络中的行踪。
## 作为杀伤链的攻击过程
这四个检测并非孤立存在——它们对应着同一次入侵的连续阶段。将它们结合起来阅读,就能还原整个故事:
```
1. Initial Access → Brute force / password spraying against Azure AD
2. Execution → Malicious encoded PowerShell + masquerading binary
3. Command & Control→ Reverse shell + outbound traffic to attacker IP
4. Impact → High-volume outbound (exfil / resource hijacking)
```
分析的关键部分:攻击者 IP **45.77.53.176** 和端口 **8088** 在进程日志(检测 2)和网络日志(检测 4)中被*独立*识别出来——这种跨源关联从两个角度证实了命令与控制 (C2) 通道。
## 检测 1 — 暴力破解 / 密码喷洒 (Azure AD)
**目标:** 识别产生异常数量登录失败,或涉及多个不同用户帐户(密码喷洒的典型特征)的源 IP。
**数据源:** `ms:aad:signin` (Azure Active Directory 登录日志)
**SPL:**
```
index=botsv3 sourcetype=ms:aad:signin earliest=0
| stats count AS attempts,
sum(eval(if(loginStatus="Failure", 1, 0))) AS failures,
dc(userPrincipalName) AS distinct_users,
values(userPrincipalName) AS users
by ipAddress
| where failures >= 3 OR distinct_users >= 2
| sort - failures
| table ipAddress attempts failures distinct_users users
```
**逻辑:** 该检测不仅仅依赖失败次数,还会统计每个源 IP 所针对的*不同帐户*数量(`dc(userPrincipalName)`)。即使失败次数较少,一个 IP 涉及多个帐户也是强烈的喷洒指标。
**发现:**
| 源 IP | 尝试次数 | 失败次数 | 不同用户 | 备注 |
|---|---|---|---|---|
| `199.66.91.253` | 51 | 5 | 2 | 主要攻击者 — 对两个帐户进行了大量尝试 |
| `157.97.121.132` | 8 | 3 | 2 | 次要嫌疑人 |
| `104.207.83.63` | 27 | 0 | 2 | 零失败但涉及两个帐户 → 可能是*成功的*喷洒 |
**MITRE ATT&CK:**
- **T1110** — Brute Force
- **T1110.003** — Password Spraying
## 检测 2 — 可疑的 PowerShell 与伪装 (Sysmon)
**目标:** 捕获显示混淆/编码 PowerShell 的进程创建事件,或伪装成合法软件的二进制文件。
**数据源:** `XmlWinEventLog:Microsoft-Windows-Sysmon/Operational` (EventID 1 — 进程创建)
**SPL:**
```
index=botsv3 sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" earliest=0 "EventID>1<"
| rex field=_raw "Name='Image'>(?[^<]+)<"
| rex field=_raw "Name='CommandLine'>(?[^<]+)<"
| rex field=_raw "Name='User'>(?[^<]+)<"
| search CommandLine="*-enc*" OR CommandLine="*-nop*" OR CommandLine="*hidden*"
OR CommandLine="*DownloadString*" OR CommandLine="*IEX*" OR CommandLine="*Invoke-Expression*"
| stats count BY host, User, Image, CommandLine
| sort - count
| table host User Image CommandLine count
```
**发现:**
- 主机 `BSTOLL-L`(用户 `AzureAD\BudStoll`)上的**编码 PowerShell**:
`powershell.exe -noP -sta -w 1 -enc ` — 无配置文件、隐藏窗口、Base64 编码的 payload。这是向防御者隐藏意图的经典混淆手法。
- **基于注册表的 PowerShell**(用户 `FyodorMalteskesko`):
`-NoP -NonI -W Hidden -c $x=$((gp HKCU:Software\...` — 从注册表读取。
- **伪装的二进制文件:** 运行自 `C:\Windows\Temp\unziped\lsof-master\` 的 `iexeplorer.exe` — 这是一个伪装成 Internet Explorer 的重命名可执行文件(真正的二进制文件是 Program Files 中的 `iexplore.exe`),正向 `192.168.9.30:8080` 发送信标。
- 命令行中观察到的**反向 shell**:
`/bin/sh 0/tmp/backpipe` — netcat 通过命名管道将 shell 重定向到外部主机。
**MITRE ATT&CK:**
- **T1059.001** — Command and Scripting Interpreter: PowerShell
- **T1027** — Obfuscated Files or Information (编码命令)
- **T1036** — Masquerading (临时目录中的重命名二进制文件)
## 检测 3 — 身份验证时间轴(可视化)
**目标:** 绘制随时间变化的登录成功与失败情况,以便一眼就能看到暴力破解的爆发。
**数据源:** `ms:aad:signin`
**SPL:**
```
index=botsv3 sourcetype=ms:aad:signin earliest=0
| timechart span=1h count BY loginStatus
| where Success > 0 OR Failure > 0
```
**可视化:** 柱状图(每小时的成功与失败对比)。`where` 子句会移除空的时间段,以便图表聚焦于活动窗口。
**发现:** 失败情况集中在 **2018-08-20 21:00**(5 次失败),并在 **8 月 21 日**凌晨出现了较小的峰值——这在正常登录活动的背景下,从视觉上准确定位了攻击窗口。
**MITRE ATT&CK:**
- 支持 **T1110**(为暴力破解活动提供时间上下文)
## 检测 4 — C2 / 连接到已知恶意 IP 的出站流量(网络流)
**目标:** 使用独立于主机日志的网络遥测数据,确认命令与控制 (C2) 并识别指向攻击者基础设施的大批量出站流量。
**数据源:** `stream:tcp`、`stream:ip`
**SPL:**
```
index=botsv3 (sourcetype=stream:tcp OR sourcetype=stream:ip) earliest=0 dest_ip="45.77.53.176"
| stats count AS connections,
sum(bytes_out) AS bytes_sent,
values(dest_port) AS dest_ports,
earliest(_time) AS first_seen,
latest(_time) AS last_seen
BY src_ip, dest_ip
| convert ctime(first_seen) ctime(last_seen)
| sort - connections
```
**发现:** 三个内部主机正在与攻击者 IP `45.77.53.176` 通信:
| 源 IP | 目标端口 | 连接数 | 发送字节数 | 解释 |
|---|---|---|---|---|
| `192.168.70.186` | 3333, 443 | 8,371 | ~13.1 MB | 批量很大;端口 3333 暗示挖矿 / 可能存在数据窃取 |
| `192.168.24.128` | 443 | 2,769 | ~489 KB | 通过 HTTPS 的持续出站流量 |
| `192.168.9.30` | 8088 | 6 | ~85 KB | **反向 shell** — 与检测 2 中的 `nc ... 8088` 命令相符 |
**跨源关联:** `192.168.9.30` → `45.77.53.176:8088` 同时出现在 Sysmon 命令行和网络流中,从两个独立的数据源证实了 C2 通道。
**MITRE ATT&CK:**
- **T1071** — Application Layer Protocol (C2)
- **T1041** — Exfiltration Over C2 Channel
- **T1496** — Resource Hijacking (端口 3333 / 挖矿指标)
## 如何复现
1. 安装 **Splunk Enterprise**(免费 60 天试用版)。
2. 下载 **BOTS v3** 数据集,并通过 *Manage Apps → Install app from file* 进行安装(数据已预先索引,因此不会消耗许可证配额)。
3. 重启 Splunk 并确认数据已加载:
index=botsv3 earliest=0
4. 在 **Dashboard Studio** 仪表板(Grid 布局)中将每个检测构建为一个面板。
## 展示的技能
- 编写和调整 **SPL** 检测(`stats`、`timechart`、`eval`、`rex`、`convert`)
- 在没有可用 add-on 时,从未解析的 XML 中进行**搜索时字段提取**
- **阈值调优**,以适应数据并减少误报
- **跨源关联**(主机日志 ↔ 网络日志)以确认发现
- **MITRE ATT&CK** 映射和杀伤链重构
- 构建结合表格和可视化的多面板 **Splunk 仪表板**
## 注意事项与限制
- 检测阈值是根据此数据集的大小进行调整的;生产环境中的阈值会有所不同。
- 为了简单起见,有意跳过了几个 BOTS v3 add-on,这就是为什么 Sysmon 的字段提取是在搜索时完成的。
- 这是一个针对静态预索引数据集构建的学习/作品集项目,而非实时环境。
标签:BOTS, DNS 解析, IP 地址批量处理, 安全可视化, 安全运营, 扫描框架