johnwilliamestacio/DetectionEngineering-Attack1

GitHub: johnwilliamestacio/DetectionEngineering-Attack1

该项目记录了在虚拟靶场中模拟 Web 侦察攻击并通过 Zeek 与 Elastic Security 分析日志、构建及验证检测规则的完整实践过程。

Stars: 0 | Forks: 0

# 检测工程:第 2 部分 — 首次攻击模拟与检测规则 ### 实战靶场上的 Web 侦察检测:Nmap · Nikto · OWASP ZAP · Elastic Security ![项目状态](https://img.shields.io/badge/Status-Complete-success) ![Zeek](https://img.shields.io/badge/NSM-Zeek-00ADD8) ![Elastic](https://img.shields.io/badge/SIEM-Elastic%20Security-005571) ![Parrot OS](https://img.shields.io/badge/Attacker-ParrotOS-1DB954) 在以下文章构建的靶场上进行的首次实战攻击模拟: [第 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` | ![架构](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/78f00d8d91214842.png) ## 攻击场景 针对我拥有的目标进行的一系列简单、可控的 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 已启动](https://raw.githubusercontent.com/johnwilliamestacio/DetectionEngineering-Attack1/main/screenshots/ubuntu_zeek%20started.png) *在任何扫描活动之前确认 Zeek 正在运行。* ### 步骤 2 — 启动目标 Web 服务器 在 Windows VM 上,打开 PowerShell 并启动了一个 Python HTTP 服务器: ``` python -m http.server ``` 服务器绑定到端口 8000,提供当前目录的访问。 ![Web 服务器运行中](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a1c4c8cf48214916.png) *Python HTTP 服务器在端口 8000 上处于活动状态。* ### 步骤 3 — 确认从 Parrot OS 的可达性 从 Parrot OS 浏览器中,确认目标可以通过 `http://192.168.125.136:8000` 访问 — 目录列表可见,包括一个 `Documents` 文件夹。在运行任何工具之前,确认了基本连通性。 ![Web 服务器浏览器测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/79c9a84fa3214924.png) *可从 Parrot OS 访问的目录列表 — 确认目标可达。* ### 步骤 4 — Nmap 服务扫描 ``` sudo nmap -sV -p 8000 192.168.125.136 ``` ![Nmap 完成](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1209420f6c214931.png) Nmap 识别出端口 8000 处于打开状态,并将服务指纹识别为 `SimpleHTTPServer` — 这是 Python 2.x 模块名,较新版本仍会在 服务器 banner 中暴露它。这种 banner 泄露正是攻击者在进一步探测之前 用来剖析目标的被动发现类型。 ### 步骤 5 — Nikto Web 扫描 ``` sudo nikto -h 192.168.125.136:8000 ``` ![Nikto 完成](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2adcedf880214938.png) 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 扫描](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/26159feb5a214945.png) ZAP 返回了 6 个警报 — 未设置 CSP 标头,缺少反点击劫持标头, HTTP 响应标头中暴露了服务器版本,以及其他应用层发现。 **关于范围的说明:** ZAP 的发现属于应用层漏洞数据 — 缺失标头, 配置弱点 — 这是与 Nmap 和 Nikto 生成的主动侦察活动不同的信号类别。它们需要具有不同逻辑、严重程度和 MITRE 映射的单独检测 规则。ZAP 检测被设定为后续阶段的独立规则。 ## 检测工程 ### 在 Elastic Discover 中分析数据 转到 Elastic Security → Discover,通过 `event.dataset : zeek.http` 进行过滤,以隔离 本次会话的 HTTP 流量。 ![Elastic 详细结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/68223cec4d214952.png) *显示扫描会话中关键字段的排序表格视图。* 打开各个日志条目以识别哪些字段带有调查信号: | 字段 | 值 | |---|---| | `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` 上的字段统计信息,以 了解扫描流量生成的是什么标识。 ![字段统计](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5cc2433ebf214959.png) **"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) ![组合查询结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/620bdc7b5f215006.png) *返回了 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) ![关于规则](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/781b405150215013.png) *已配置规则名称、描述和严重程度。* **规则名称:** `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:** ![MITRE 映射](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/7c9f96a676215019.png) *Discovery (TA0007) → Network Service Discovery (T1046)* **告警抑制:** ![抑制配置](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9df53b8876215025.png) 按 `destination.ip` 和时间段进行抑制。如果每次扫描会话有超过 60 条独立的日志记录,不进行抑制将导致每次运行生成 60+ 个独立的告警 — 这会造成告警疲劳,且没有任何额外的信号。按目标 IP 抑制会在每个时间窗口内,将针对同一目标的所有 扫描活动分组为一个单独的告警。如果同一源扫描多个目标,每个目标仍然会生成自己的 告警,从而保持跨目标的检测保真度。 **计划:** 每 5 分钟运行一次 ### 规则 2 — 阈值:过量的 Web 流量 作为补充规则,用于检测异常大的 HTTP 请求量 — 用于捕获 未在标头或 URL 中通过已知签名识别自己的扫描工具。 **Security → Rules → Create Rule → Threshold** event.dataset : "zeek.http" ![阈值告警配置](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a28cb9b8c6215051.png) **分组依据:** `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** 作为测试窗口。规则预览会针对 历史数据运行检测逻辑,而不会生成实时告警 — 这是规则上线前正确的验证步骤。 ![规则预览](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/bed2a823de215057.png) *两条规则返回的结果与已知的扫描会话相匹配。* ### 规则已启用 ![规则完成](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/76fbe796e7215103.png) *两条规则均已创建、配置并启用。* ## 结果 ### 检测总结 | 规则 | 类型 | 查询 | 触发条件 | 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, 云存储安全, 安全实验, 密码管理, 插件系统, 网络扫描, 网络流量分析, 逆向工具