dinesh3690/splunk-bots-investigation
GitHub: dinesh3690/splunk-bots-investigation
使用 Splunk BOTS v1 数据集对 Joomla Web 服务器入侵事件进行全流程 SIEM 调查分析的实战实验项目。
Stars: 0 | Forks: 0
# Splunk BOTS v1 — Joomla Web 服务器入侵调查
这是一个使用 Splunk 的 Boss of the SOC (BOTS) v1 数据集进行的 SIEM 动手调查项目。本项目模拟了真实的 L1 SOC 分析师的调查过程——通过分析 22 个数据源中的 955,807 条日志事件,重构了针对某公司 Joomla CMS Web 服务器的一场协同网络攻击。无需编程——所有发现均通过 SPL 查询和分析推理得出。
## 场景
**目标组织:** Frothly(虚构的啤酒公司)
**受感染资产:** Joomla CMS Web 服务器 — 192.168.250.70
**攻击日期:** 2016-08-10
**数据集:** BOTS v1 Attack-Only(135MB — 955,807 条事件)
## 可用数据源
| Sourcetype | 事件计数 | 描述 |
|------------|-------------|-------------|
| stream:ip | 62,083 | 原始 IP 网络流量 |
| fgt_traffic | 55,279 | Fortinet 防火墙流量日志 |
| fgt_utm | 25,586 | Fortinet URL/威胁过滤 |
| stream:http | 23,936 | HTTP Web 流量 |
| iis | 22,615 | IIS Web 服务器访问日志 |
| stream:icmp | 12,858 | ICMP/ping 流量 |
| stream:dns | 7,434 | DNS 查询日志 |
| nessus:scan | 65 | 漏洞扫描结果 |
| fgt_event | 57 | Fortinet 安全事件 |
## 调查方法论
每个调查问题均通过以下流程进行解答:
1. 确定与问题相关的数据源
2. 编写 SPL 查询以提取和过滤相关事件
3. 分析结果并记录发现
4. 跨多个日志源进行交叉比对以确认
5. 将确认的发现映射到 MITRE ATT&CK 框架
6. 记录 IOC 和检测盲点
## 使用的 SPL 查询
### 查询 1 — 识别所有数据源
```
index=botsv1 | stats count by sourcetype
```
**发现:** 共有 22 个 sourcetype 可用 — 包括防火墙、Web 服务器、网络流量、DNS、漏洞扫描日志
### 查询 2 — 在防火墙日志中查找主要流量源
```
index=botsv1 sourcetype=fgt_traffic | table srcip, dstip, action | head 20
```
**发现:** 192.168.250.100 正在扫描连续的 IP(85.93.43.64 到 85.93.43.75)— 典型的 Nmap IP 范围扫描模式
### 查询 3 — 识别最活跃的源/目的对
```
index=botsv1 sourcetype=fgt_traffic | stats count by srcip dstip | sort -count | head 20
```
**发现:** 23.22.63.114 到 71.39.18.126 共有 1,431 次连接 — 可疑的外部到外部流量
### 查询 4 — 查找访问 Web 服务器的主要 IP
```
index=botsv1 sourcetype=iis | stats count by c_ip | sort -count | head 20
```
**发现:** 40.80.148.42 向该 Web 服务器发起了 20,967 次请求 — 确认为主要攻击者
### 查询 5 — 分析攻击者在 Web 服务器上的活动
```
index=botsv1 sourcetype=iis c_ip=40.80.148.42 | table _time, cs_uri_stem, sc_status | head 30
```
**发现:** 攻击者从 2016-08-10 18:01:44 开始,使用自动化请求对 /joomla/index.php/component/search/ 进行高频打击
### 查询 6 — 映射主要攻击者针对的所有 URL
```
index=botsv1 sourcetype=iis c_ip=40.80.148.42 | stats count by cs_uri_stem | sort -count | head 20
```
**发现:** 对 search 组件发起 16,871 次命中,对 admin panel 发起 35 次命中,可疑文件 /joomla/images/imnotbatman.jpg 被访问 13 次
### 查询 7 — 调查可疑的 Web Shell (imnotbatman.jpg)
```
index=botsv1 sourcetype=iis cs_uri_stem="/joomla/images/imnotbatman.jpg" | table _time, c_ip, sc_status, cs_method
```
**发现:** 40.80.148.42 从 17:41 开始发起了 13 次成功的 GET 请求(状态码 200)— 确认存在 Web Shell
### 查询 8 — 针对 Web 服务器的全面 HTTP 流量分析
```
index=botsv1 sourcetype=stream:http dest_ip=192.168.250.70 | stats count by src_ip, http_method, uri | sort -count | head 20
```
**发现:** 识别出第二名攻击者 23.22.63.114 — 向 admin panel 发起了 823 次 GET + 412 次 POST 请求,/joomla/agent.php 被访问 194 次
### 查询 9 — 调查第二个 Web Shell (agent.php)
```
index=botsv1 sourcetype=iis cs_uri_stem="/joomla/agent.php" | table _time, c_ip, sc_status, cs_method
```
**发现:** 23.22.63.114 从 17:55 开始发起了 194 次成功的 GET 请求(状态码 200)— 确认存在第二个 Web Shell
### 查询 10 — 检查来自 Web 服务器的出站 C2 连接
```
index=botsv1 sourcetype=fgt_traffic srcip=192.168.250.70 | stats count by dstip | sort -count | head 10
```
**发现:** Web 服务器向攻击者 23.22.63.114 发起了 5 次出站连接,并向未知 IP 108.161.187.134 发起了 6 次连接 — 确认存在 C2 回连
## 攻击时间线
| 时间 (2016-08-10) | 攻击者 | 行为 | 证据 |
|-------------------|---------|--------|----------|
| 17:41 | 40.80.148.42 | Web Shell imnotbatman.jpg 被上传并执行 | IIS 日志中的 13 次 HTTP 200 GET 请求 |
| 17:55 | 23.22.63.114 | 第二个 Web Shell agent.php 被执行 | IIS 日志中的 194 次 HTTP 200 GET 请求 |
| 18:01 | 40.80.148.42 | 开始大规模漏洞利用 — Joomla 搜索组件 | stream:http 日志中的 11,923 次 POST 请求 |
| 18:01-18:21 | 40.80.148.42 | 路径遍历尝试 | IIS 日志中的 24 次 GET /windows/win.ini |
| 18:21 | 23.22.63.114 | 管理面板暴力破解 | 对 /joomla/administrator/index.php 发起 412 次 POST |
| 后渗透阶段 | 192.168.250.70 | Web 服务器向攻击者 C2 回连 | 防火墙日志中向 23.22.63.114 发起的 5 次出站连接 |
## IOC 主列表
| IOC | 类型 | 角色 |
|-----|------|------|
| 40.80.148.42 | IP 地址 | 主要外部攻击者 |
| 23.22.63.114 | IP 地址 | 次要攻击者 / C2 服务器 |
| 108.161.187.134 | IP 地址 | Web 服务器的可疑出站目的地 |
| 192.168.250.100 | IP 地址 | 内部扫描主机 |
| 192.168.250.70 | IP 地址 | 受感染的 Joomla Web 服务器 |
| /joomla/images/imnotbatman.jpg | 文件路径 | Web Shell 1 — 伪装为图片 |
| /joomla/agent.php | 文件路径 | Web Shell 2 |
| /joomla/index.php/component/search/ | URI | 主要漏洞利用端点 |
| /joomla/administrator/index.php | URI | 管理面板暴力破解目标 |
| /windows/win.ini | URI | 路径遍历尝试 |
## MITRE ATT&CK 映射
| 战术 | 技术 ID | 技术名称 | 证据 |
|--------|-------------|----------------|----------|
| 侦察 | T1595 | 主动扫描 | 防火墙日志中 192.168.250.100 扫描连续的 IP |
| 初始访问 | T1190 | 利用面向公众的应用 | 对 Joomla 搜索组件发起 11,923 次 POST 请求 |
| 初始访问 | T1110 | 暴力破解 | 23.22.63.114 对 Joomla 管理面板发起 412 次 POST 请求 |
| 执行 | T1505.003 | Web Shell | imnotbatman.jpg 和 agent.php — 均返回 HTTP 200 且执行成功 |
| 发现 | T1083 | 文件和目录发现 | /windows/win.ini 路径遍历 — 尝试 24 次 |
| 持久化 | T1505 | 服务器软件组件 | 在受感染的 Joomla 服务器上安装了两个 Web Shell |
| 命令与控制 | T1071 | 应用层协议 | Web 服务器 192.168.250.70 向 23.22.63.114 发起出站连接 |
## 调查报告
### 执行摘要
2016-08-10,Frothly 的 Joomla CMS Web 服务器 (192.168.250.70) 遭到两名外部威胁行为者的协同攻击而沦陷。主要攻击者 (40.80.148.42) 利用了 Joomla 搜索组件,并上传了一个伪装成图片文件的 Web Shell。次要攻击者 (23.22.63.114) 部署了第二个 Web Shell,并对 Joomla 管理面板进行了暴力破解。后渗透阶段,受感染的 Web 服务器向攻击者基础设施建立了出站的命令与控制连接——确认已成功实现远程代码执行。
### 关键发现
**发现 1 — 确认两名协同攻击者**
外部 IP 40.80.148.42 和 23.22.63.114 对 Joomla Web 服务器同时发起了攻击,表明这是一场协同行动。两名攻击者在间隔 14 分钟内就在服务器上预先部署了 Web Shell。
**发现 2 — 伪装成图片文件的 Web Shell**
文件 imnotbatman.jpg 被上传到 Joomla images 目录,并作为可执行的 Web Shell 运行(HTTP 200 响应确认了其执行)。使用图片扩展名命名 Web Shell 是一种常见的规避技术,用于绕过文件类型限制。
**发现 3 — 大规模自动化漏洞利用**
主要攻击者向 Joomla 搜索组件发送了 11,923 次自动化 POST 请求 — 这与 SQLi 模糊测试或使用 sqlmap 等自动化工具利用已知的 Joomla CVE 漏洞的行为一致。
**发现 4 — 成功建立 C2 通道**
受感染的 Web 服务器向攻击者 IP (23.22.63.114) 发起了 5 次出站连接,确认漏洞利用成功并建立了反弹 Shell 或 C2 beacon。
### 检测盲点
- 单一外部 IP 向 Web 服务器发起 20,967 次请求未触发告警
- Web Shell 文件上传在应用层未被阻止或检测到
- Web 服务器向外部 IP 发起的出站连接被防火墙放行
- 对自动化 POST 洪泛(向单个 endpoint 发起 11,923 次请求)缺乏异常检测
### 建议
- 立即在边界防火墙阻断 IP 40.80.148.42 和 23.22.63.114
- 从 Web 服务器文件系统中移除 Web Shell imnotbatman.jpg 和 agent.php
- 将 Joomla CMS 补丁更新至最新版本 — 搜索组件漏洞正被积极利用
- 实施 WAF 规则,针对每个源 IP 每分钟的 POST 请求进行限流
- 配置防火墙以阻断 Web 服务器发往未知外部 IP 的出站连接
- 创建 Splunk 告警:单一 IP 在 60 秒内向 Web 服务器发起超过 1,000 次请求
## 经验教训
- **流量异常就是信号** — 单一 IP 向 Web 服务器发起 20,967 次请求绝不是正常现象。仅靠一个阈值告警就能在第一分钟内捕获此次攻击。
- **Web Shell 能绕过简单的扩展名检查** — imnotbatman.jpg 证明了为什么内容检查比文件扩展名过滤更重要。
- **跨源关联至关重要** — 只有将 IIS 日志与防火墙出站流量日志结合,才能看到 C2 回连。任何单一来源都无法讲述完整的经过。
- **攻击者会协同行动** — 两个 IP 同时发起攻击,且部署 Web Shell 的时间间隔仅为 14 分钟,暗示这是有组织的威胁行为者,而非机会主义的扫描。
- **进攻方知识有助防守** — 从进攻性安全经验中识别出的连续 IP 扫描模式,极大地加速了此次调查。
## 展示的技能
- 使用 Splunk SPL 跨 22 个数据源和 955,807 条事件进行 SIEM 调查
- 多源日志关联 — 防火墙、Web 服务器和网络流量日志
- 攻击者识别与攻击时间线重构
- Web Shell 检测与分析
- MITRE ATT&CK 框架映射
- IOC 提取与文档记录
- SOC 调查报告编写
## 截图
调查截图位于 `screenshots/` 文件夹中:
- `sourcetypes.png` — BOTS 数据集中的所有 22 个数据源
- `firewall-scanning.png` — 防火墙日志中的连续 IP 扫描
- `top-attacker-ip.png` — 40.80.148.42 被识别为主要攻击者(,967 次请求)
- `attacker-urls.png` — 主要攻击者针对的所有 URL
- `webshell-imnotbatman.png` — Web Shell 执行确认(13 次 HTTP 200)
- `http-traffic-analysis.png` — 揭示第二名攻击者的全面 HTTP 流量
- `agent-php-webshell.png` — 第二个 Web Shell 确认(194 次 HTTP 200)
- `c2-callback.png` — Web 服务器出站 C2 连接确认
## 参考
- [Splunk BOTS v1 数据集](https://github.com/splunk/botsv1)
- [MITRE ATT&CK — Web Shell T1505.003](https://attack.mitre.org/techniques/T1505/003/)
- [MITRE ATT&CK — 利用面向公众的应用 T1190](https://attack.mitre.org/techniques/T1190/)
- [MITRE ATT&CK — 暴力破解 T1110](https://attack.mitre.org/techniques/T1110/)
- [Splunk SPL 文档](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/WhatsInThisManual)
标签:CISA项目, Cloudflare, MITRE ATT&CK, 安全运营中心, 网络映射