johnwilliamestacio/DetectionEngineering-Attack1
GitHub: johnwilliamestacio/DetectionEngineering-Attack1
该项目记录了在虚拟靶场中模拟 Web 侦察攻击并通过 Zeek 与 Elastic Security 分析日志、构建及验证检测规则的完整实践过程。
Stars: 0 | Forks: 0
# 检测工程:第 2 部分 — 首次攻击模拟与检测规则
### 实战靶场上的 Web 侦察检测:Nmap · Nikto · OWASP ZAP · Elastic Security




在以下文章构建的靶场上进行的首次实战攻击模拟:
[第 1 部分](https://github.com/cleversec/detection-engineering-lab-part1)。
Windows 目标上的 Python Web 服务器受到了来自 Parrot OS 的三种工具的扫描 —
Nmap、Nikto 和 OWASP ZAP — 产生的流量在 Elastic
Security 中进行了分析,以构建两条有效的检测规则。
**结果:** 在 Elastic Security 中部署了两条经过验证的检测规则 — 一条用于检测
Nmap 和 Nikto 侦察活动的自定义
查询规则,以及一条在异常 HTTP 流量上触发的阈值
规则 — 两者都进行了 MITRE ATT&CK 映射,并针对
实时数据进行了测试。
## 目录
- [实验环境](#lab-environment)
- [攻击场景](#attack-scenario)
- [实施过程](#implementation)
- [检测工程](#detection-engineering)
- [结果](#results)
- [后续计划](#whats-next)
## 实验环境
与第 1 部分的靶场相同 — 基础设施无变化。
| 主机 | 角色 | IP |
|---|---|---|
| Ubuntu 24.04 | 网络传感器 (Zeek) | `192.168.125.134` |
| Parrot OS | 攻击者 | `192.168.125.135` |
| Windows 11 | 目标 / Web 服务器 | `192.168.125.136` |

## 攻击场景
针对我拥有的目标进行的一系列简单、可控的 Web 侦察链,并通过我构建的传感器栈进行观察。这里的目的不是模拟复杂的攻击 — 而是在转向更嘈杂、更复杂的场景之前,根据已知的良好数据构建和验证检测逻辑。
**攻击链:**
1. Windows 目标在端口 8000 上托管了一个 Python HTTP 服务器
2. Parrot OS 浏览该服务器以确认可达性
3. Parrot OS 对目标运行 Nmap 服务检测、Nikto Web 扫描和 OWASP ZAP 自动
扫描
4. 所有流量都经过 Ubuntu 上的 Zeek,记录为 `zeek.http`
5. 使用 Elastic Security 分析日志并构建检测规则
**为什么使用 Python HTTP 服务器:** 没有身份验证,没有速率限制,默认暴露目录
列表 — 一个故意设计得脆弱的目标,它能为链中的每个工具生成干净、
可归因的日志数据。
## 实施过程
### 步骤 1 — 确认 Zeek 正在运行
在任何操作接触网络之前,确认 Zeek 实例处于活动状态并
正在记录。如果传感器没有在监视,就没有值得生成的流量。

*在任何扫描活动之前确认 Zeek 正在运行。*
### 步骤 2 — 启动目标 Web 服务器
在 Windows VM 上,打开 PowerShell 并启动了一个 Python HTTP 服务器:
```
python -m http.server
```
服务器绑定到端口 8000,提供当前目录的访问。

*Python HTTP 服务器在端口 8000 上处于活动状态。*
### 步骤 3 — 确认从 Parrot OS 的可达性
从 Parrot OS 浏览器中,确认目标可以通过
`http://192.168.125.136:8000` 访问 — 目录列表可见,包括一个 `Documents`
文件夹。在运行任何工具之前,确认了基本连通性。

*可从 Parrot OS 访问的目录列表 — 确认目标可达。*
### 步骤 4 — Nmap 服务扫描
```
sudo nmap -sV -p 8000 192.168.125.136
```

Nmap 识别出端口 8000 处于打开状态,并将服务指纹识别为
`SimpleHTTPServer` — 这是 Python 2.x 模块名,较新版本仍会在
服务器 banner 中暴露它。这种 banner 泄露正是攻击者在进一步探测之前
用来剖析目标的被动发现类型。
### 步骤 5 — Nikto Web 扫描
```
sudo nikto -h 192.168.125.136:8000
```

Nikto 返回了多项发现:
- 确认了 Nmap 识别出的 `SimpleHTTPServer` banner 泄露
- 识别出 `Downloads` 文件夹是可浏览的 — 攻击者可以利用此目录
来枚举主机上的文件
- 标记了缺失的安全标头
### 步骤 6 — OWASP ZAP 自动扫描
通过以下方式从 Parrot OS 启动了 OWASP ZAP:
`Applications → Pentesting → Most Used Tools → OWASP ZAP`
针对 `http://192.168.125.136:8000` 运行了自动扫描。

ZAP 返回了 6 个警报 — 未设置 CSP 标头,缺少反点击劫持标头,
HTTP 响应标头中暴露了服务器版本,以及其他应用层发现。
**关于范围的说明:** ZAP 的发现属于应用层漏洞数据 — 缺失标头,
配置弱点 — 这是与 Nmap 和 Nikto 生成的主动侦察活动不同的信号类别。它们需要具有不同逻辑、严重程度和 MITRE 映射的单独检测
规则。ZAP 检测被设定为后续阶段的独立规则。
## 检测工程
### 在 Elastic Discover 中分析数据
转到 Elastic Security → Discover,通过 `event.dataset : zeek.http` 进行过滤,以隔离
本次会话的 HTTP 流量。

*显示扫描会话中关键字段的排序表格视图。*
打开各个日志条目以识别哪些字段带有调查信号:
| 字段 | 值 |
|---|---|
| `source.ip` | 攻击者 IP (Parrot OS) |
| `destination.ip` | 目标 IP (Windows VM) |
| `event.action` | HTTP 方法 (`GET`) |
| `url.path` | Web 服务器上正在请求的路径 |
| `user_agent.original` | 工具标识 / 浏览器指纹 |
#### 调查 `user_agent.original` 字段分布
在构建任何规则之前,检查了 `user_agent.original` 上的字段统计信息,以
了解扫描流量生成的是什么标识。

**"Other"** 类别占据了 48% 的记录(约 2,400 条) — 在编写将针对此数据集运行的检测逻辑之前,这太大了,不容忽视。将其过滤掉:event.dataset : zeek.http AND user_agent.original: Nmap
#### 在日志中查找 Nikto
与 Nmap 不同,Nikto 将其名称嵌入到它探测的路径中 — 在
`url.path` 和 `url.original` 中都可见,并且也存在于 `user_agent.original` 中。
event.dataset : zeek.http AND (url.path: Nikto OR url.original: Nikto)
交叉检查了这两个查询 — 返回了 60 条,计数匹配,没有遗漏的
记录。
#### 组合优化查询
event.dataset : "zeek.http" AND (url.path: Nikto OR url.original: Nikto OR user_agent.original: Nmap OR user_agent.original: Nikto)

*返回了 68 条 — 已根据已知的扫描活动进行了验证。*
**为什么这样构建:**
- 括号分组强制引擎首先确认 `zeek.http` 成员身份,
然后评估扫描器关键字 — 正确的运算符优先级
- 布尔运算符 (`AND`, `OR`) 在 Elasticsearch KQL 中必须全部大写
- Nikto 的覆盖范围跨越了 `url.*` 字段和 `user_agent.original` — 这两个子句
都需要用来捕获 Nikto 省略了 URL 签名但在用户代理中标识了自己的扫描
### 规则 1 — 自定义查询:Web 扫描器活动
**Security → Rules → Create Rule → Custom Query**
event.dataset : "zeek.http" AND (url.path: Nikto OR url.original: Nikto OR user_agent.original: Nmap OR user_agent.original: Nikto)

*已配置规则名称、描述和严重程度。*
**规则名称:** `Web Scanner Activity - Nmap and Nikto`
**描述:**
检测 Zeek HTTP 日志中匹配已知 Nmap 和 Nikto 扫描器签名的 HTTP
流量。Nmap 通过包含 "Nmap Scripting
Engine" 的 user_agent.original 识别;Nikto 通过其在 url.path、url.original 或
user_agent.original 中的签名识别。
**严重程度:** 低
**MITRE ATT&CK:**

*Discovery (TA0007) → Network Service Discovery (T1046)*
**告警抑制:**

按 `destination.ip` 和时间段进行抑制。如果每次扫描会话有超过 60 条独立的日志记录,不进行抑制将导致每次运行生成 60+ 个独立的告警 —
这会造成告警疲劳,且没有任何额外的信号。按目标 IP 抑制会在每个时间窗口内,将针对同一目标的所有
扫描活动分组为一个单独的告警。如果同一源扫描多个目标,每个目标仍然会生成自己的
告警,从而保持跨目标的检测保真度。
**计划:** 每 5 分钟运行一次
### 规则 2 — 阈值:过量的 Web 流量
作为补充规则,用于检测异常大的 HTTP 请求量 — 用于捕获
未在标头或 URL 中通过已知签名识别自己的扫描工具。
**Security → Rules → Create Rule → Threshold**
event.dataset : "zeek.http"

**分组依据:** `source.ip`, `destination.ip`
**阈值:** 1,000 个请求
**规则名称:** `Excessive Web Traffic`
**描述:**
当在 5 分钟的时间窗口内观察到从单个源 IP 向单个
目标 IP 发出超过 1000 个 HTTP 请求时触发。检测未通过已知扫描器签名识别自己的大容量扫描
或自动化工具。
**严重程度:** 中
**MITRE ATT&CK:** Discovery (TA0007) → Network Service Discovery (T1046)
**计划:**
- 每 5 分钟运行一次
- 额外回溯时间:5 分钟
### 规则测试 — 规则预览
在启用之前,使用 Elastic 的规则预览验证了这两条规则,选择
**Last 4 days** 作为测试窗口。规则预览会针对
历史数据运行检测逻辑,而不会生成实时告警 — 这是规则上线前正确的验证步骤。

*两条规则返回的结果与已知的扫描会话相匹配。*
### 规则已启用

*两条规则均已创建、配置并启用。*
## 结果
### 检测总结
| 规则 | 类型 | 查询 | 触发条件 | MITRE |
|---|---|---|---|---|
| Web Scanner Activity - Nmap and Nikto | 自定义查询 | `zeek.http` 中的扫描器签名 | 任何匹配 | T1046 |
| Excessive Web Traffic | 阈值 | 每对源→目标 5 分钟内 >1,000 个请求 | 数量 | T1046 |
### 捕获的扫描活动
| 工具 | 日志字段 | 标识符 | 条目数 |
|---|---|---|---|
| Nmap | `user_agent.original` | `Nmap Scripting Engine` | 已确认 |
| Nikto | `url.path`, `url.original`, `user_agent.original` | `Nikto` | 60 |
| 组合 | 两者 | 两者 | 68 |
### 扫描目标的发现
| 发现 | 来源 |
|---||
| 端口 8000 开放,`SimpleHTTPServer` banner 泄露 | Nmap + Nikto |
| 可浏览的 `Downloads` 目录 | Nikto |
| 缺失 CSP 标头 | ZAP |
| 缺失反点击劫持标头 | ZAP |
| HTTP 响应标头中暴露的服务器版本 | ZAP |
## 后续计划
- [ ] 构建 ZAP 检测规则 — 应用层发现需要针对
HTTP 响应代码、缺失的标头以及 ZAP 自身的 user agent 签名使用单独的逻辑
- [ ] 将攻击模拟扩展到被动侦察之外 — 经过身份验证的
攻击、文件枚举、反弹 shell 尝试
- [ ] 为第 1 部分中观察到的基于 PowerShell 的技术构建检测规则
(T1059.001)
- [ ] 引入 Atomic Red Team 进行结构化、可重复的对手模拟
- [ ] 将所有经过验证的检测映射到统一的 MITRE ATT&CK 覆盖矩阵中
## 许可证
MIT 许可证 - 详情请参阅 [LICENSE](/License) 文件
## 联系方式
**LinkedIn:** https://www.linkedin.com/in/johnwilliamestacio/
有问题?直接提 issue 或直接联系。
## 致谢
**技术栈鸣谢:**
- [Zeek](https://zeek.org/)
- [Elastic Security](https://www.elastic.co/security)
- [Nmap](https://nmap.org/)
- [Nikto](https://github.com/sullo/nikto)
- [OWASP ZAP](https://www.zaproxy.org/)
- [VMware](https://www.vmware.com/)
*正在进行的检测工程系列的一部分。*
*[← 第 1 部分:靶场搭建](https://github.com/cleversec/detection-engineering-lab-part1)*
标签:Elastic Security, Rootkit, Zeek, 云存储安全, 安全实验, 密码管理, 插件系统, 网络扫描, 网络流量分析, 逆向工具