jessn-dev/CTI-Lab

GitHub: jessn-dev/CTI-Lab

一个基于 Docker 和 Wazuh SIEM 的自包含网络安全靶场,提供从红队攻击模拟到蓝队实时检测、自动 IP 封禁、恶意软件分析及 AI 事件报告的完整闭环演练。

Stars: 0 | Forks: 0

# 威胁情报实验室与主动防御 SIEM
Wazuh Docker Python MITRE ATT&CK Docs MIT

一个独立的网络安全实验室,部署了一套 **Wazuh SIEM**、一个**像真实 Agent 一样向其报告的 SSH 蜜罐**,以及一个**针对该蜜罐完整演练网络杀伤链的 Python 红队脚本**。真实的攻击流量会产生真实的检测,从而触发两个 Python **SOAR** 自动化操作:主动响应 IP 封禁和 VirusTotal 恶意软件查询。 所有内容均通过 Docker 运行在单台主机上 —— 无需云账户,也无需单独的虚拟机。 📚 **[API 参考与开发者门户 →](https://jessn-dev.github.io/CTI-Lab/)** —— 完整的 Stripe 风格文档站点(包含身份验证、endpoint、cURL/Python/JS 代码片段、错误映射),通过 **GitHub Pages** 从 `/docs` 目录部署。 ## 演示 ``` $ ./attack.sh | PHASE 2: Delivery & Initial Access — T1110 [+] CREDENTIALS CRACKED -> root:toor. Foothold HELD. | PHASE 5: Command & Control — T1105 [+] Payload dropped -> /tmp/eicar.com.txt # Wazuh 自动响应: detection : rule 5763 sshd brute force (level 10) response : BANNED 192.168.65.1 (iptables DROP) malware : VirusTotal MALWARE DETECTED 65/74 ``` ## 目录 0. [演示](#demo) · [API 参考门户 ↗](https://jessn-dev.github.io/CTI-Lab/) 1. [它的作用](#what) 2. [架构](#architecture) 3. [攻击 → 检测 → 响应流程](#flow) 4. [MITRE ATT&CK 覆盖范围](#mitre) 5. [安装与运行](#install) 6. [验证运行效果](#verify) 6b. [AI 威胁分析师 (Phase A)](#analyst) 7. [项目结构](#layout) 8. [范围、诚实度与局限性](#limits) 9. [故障排除](#troubleshooting) ## 1. 它的作用 - **诱饵** —— 一个 Ubuntu 容器运行着真实的 `sshd`,并故意在 `2222` 端口暴露一个弱口令 `root:toor` 登录。 - **监控** —— 蜜罐内置了 **Wazuh agent**。它会在启动时向 Wazuh manager 注册,并发送 `auth.log` 和文件完整性监控 (FIM) 事件。这是让 SIEM 体系变得*真实* 的关键所在:manager 确实能接收到遥测数据。 - **攻击** —— `scripts/simulate_attacks.py` 使用 **paramiko** 执行真实的 SSH 暴力破解,然后打开一个会话并执行后渗透操作(侦察、凭据转储、后门账户、投放 EICAR 恶意软件、擦除日志)。 - **检测** —— Wazuh 的内置规则会标记出暴力破解和被投放的文件。 - **响应 (SOAR)** —— - `scripts/active_defense.py` 作为 **Wazuh 主动响应** 在蜜罐上运行,并使用 `iptables` 封禁攻击者的 IP(超时后自动解封)。 - `scripts/malware_capture.py` 作为 **Wazuh 集成** 在 manager 上运行,它从告警中提取 FIM 的 SHA-256,并查询 **VirusTotal API**。 ## 2. 架构 单个 Docker Compose 技术栈,一个网络。基于官方的 Wazuh 4.8 单节点部署(通过 TLS 保护 indexer/manager/dashboard),外加一个自定义的蜜罐服务。 ``` graph TD subgraph "Adversary (host)" A[simulate_attacks.py
paramiko red-team] end subgraph "Honeypot (Docker)" L["linux-honeypot
Ubuntu + sshd :2222
Wazuh agent + FIM"] AR["active_defense.py
Active Response (iptables)"] end subgraph "Wazuh SIEM (Docker)" M[wazuh.manager] I[wazuh.indexer] D["wazuh.dashboard
https://localhost:8443"] VT["malware_capture.py
VirusTotal integration"] end A -->|T1110 brute force + post-exploit over SSH| L L -.->|auth.log + FIM events| M M --> I --> D M -->|brute-force rule| AR M -->|FIM new-file rule| VT VT -->|hash lookup| EXT[(VirusTotal API)] ``` **钻石模型:** *对手* = paramiko 脚本 · *能力* = SSH 凭据攻击 + EICAR payload · *基础设施* = Docker 网络,端口 2222 · *受害者* = 蜜罐容器。 ## 3. 攻击 → 检测 → 响应流程 | # | 红队动作 (真实) | 蓝队反应 (真实) | |---|------------------------|---------------------------| | 1 | 对 `:2222` 进行端口探测 | — | | 2 | SSH 密码暴力破解 | Wazuh 规则 **5710 / 5712** 触发 → **主动响应封禁源 IP** | | 3 | 通过 SSH 执行 `whoami`、`uname -a`、`cat /etc/passwd`、`cat /etc/shadow` | SIEM 中的命令/身份验证遥测数据 | | 4 | 创建后门用户 `sysadmin_bckp` | `/etc` 上的 FIM 变更,新账户事件 | | 5 | `curl` **EICAR** 测试文件到 `/tmp` | FIM **新文件** 告警 → **VirusTotal 集成** 报告判定结果 | | 6 | 擦除 `/var/log/auth.log` | 无效 —— Wazuh 已经实时转发了这些事件 | ## 4. MITRE ATT&CK 覆盖范围 | 阶段 | 技术 | ID | |-------|-----------|----| | 侦察 | 主动扫描 | T1595 | | 初始访问 | 暴力破解 | T1110 | | 发现 | 系统信息发现 | T1082 | | 凭据访问 | 操作系统凭据转储 (`/etc/shadow`) | T1003 | | 持久化 | 创建账户 | T1136 | | 命令与控制 | 入站工具传输 | T1105 | | 防御规避 | 指示器移除 (擦除日志) | T1070 | | **响应** | 网络流量过滤 (D3FEND) | D3-NTF | ## 5. 安装与运行 ### 前置条件 - **Docker Desktop** 正在运行,并且至少为 Docker 分配了 **~6 GB RAM** (仅 OpenSearch indexer 就会预留约 1 GB 的堆内存)。 - 主机上安装了 **Python 3.9+**(用于红队脚本的 virtualenv)。 ### 快速开始 该流程特意设计为**两个步骤**,这样您就可以观察攻击在 SIEM 中的实时落点,而不是在您甚至还没登录之前它就已经发生完了。 ``` git clone && cd threat-intelligence-lab cp .env.example .env # optional: VirusTotal + Gemini API keys chmod +x *.sh # 1. 启动实验环境 (SIEM + honeypot) 并等待 agent 连接。 ./start_lab.sh # 2. 打开 https://localhost:8443 (admin / SecretPassword),前往 # Threat Hunting → Security Alerts,然后在另一个终端中: ./attack.sh # launch the adversary simulation — watch it appear # 3. (可选)根据检测结果生成 AI MITRE ATT&CK 报告。 ./report.sh ``` `start_lab.sh` 会生成 Wazuh TLS 证书(首次运行时),提升 `vm.max_map_count`,构建蜜罐,启动整个技术栈,准备 Python venv,并**等待蜜罐 agent 连接** —— 然后停止并提示您 打开仪表板并运行 `./attack.sh`。它**不会**自动发起攻击,因此您可以 实时查看杀伤链的展开。 使用 `./stop_lab.sh` 拆除环境(添加 `--wipe` 可同时删除数据卷)。 ### 访问点 | 服务 | URL / 命令 | 端口 | 凭据 | |---------|---------------|------|-------------| | Wazuh 仪表板 | `https://localhost:8443` (接受自签名证书) | 8443 | `admin` / `SecretPassword` | | Wazuh indexer (OpenSearch API) | `curl -k -u admin:SecretPassword https://localhost:9200` | 9200 | `admin` / `SecretPassword` | | Wazuh manager API | `curl -k -u wazuh-wui:'MyS3cr37P450r.*-' https://localhost:55000` | 55000 | `wazuh-wui` / `MyS3cr37P450r.*-` | | SSH 蜜罐 | `ssh root@localhost -p 2222` | 2222 | 密码 `toor` | | API 文档门户 | [jessn-dev.github.io/CTI-Lab](https://jessn-dev.github.io/CTI-Lab/) | — | — | | 威胁报告 (Phase A) | `reports/threat_report_.md` | — | — | **内部端口**(用于 agent 流量,非供人类使用):`1514/tcp` agent→manager, `1515/tcp` agent 注册,`514/udp` syslog。为了方便/调试在主机上暴露;您不需要直接连接这些端口。 ## 6. 验证运行效果 在 Wazuh 仪表板(**Threat Hunting / Security Alerts**)中,模拟结束后,您应该会看到: - **SSH 暴力破解** 告警(规则 ID 5710/5712),带有 `srcip`。 - 一条 **主动响应** 记录(`active-responses.log`),显示封禁操作。 - 一个针对 `/tmp/eicar.com.txt` 的 **文件完整性监控** *添加* 事件,以及 manager 的 `integrations.log` 中的 VirusTotal 结果(使用以下命令打开一个 shell: `docker exec -it wazuh.manager tail /var/ossec/logs/integrations.log`)。 确认蜜罐 agent 已连接: ``` docker exec -it wazuh.manager /var/ossec/bin/agent_control -l ``` ## 6b. AI 威胁分析师 (Phase A) `scripts/threat_report.py` 闭环了整个流程:它读取实验室生成的 Wazuh 检测结果,并要求 LLM 撰写一份 **MITRE ATT&CK 事件报告** —— 包括执行摘要、杀伤链时间线、技术表格、IOC、严重性以及 建议措施。它完全**在离线日志上运行**,绝不进入攻击路径, 因此不会增加延迟,也不存在提示词注入的风险。 ``` cp .env.example .env # add GEMINI_API_KEY (free: https://aistudio.google.com) source venv/bin/activate python3 scripts/threat_report.py # pulls alerts from wazuh.manager # 或分析已保存的文件: python3 scripts/threat_report.py --input path/to/alerts.json ``` 输出结果会保存在 `reports/threat_report_.md` 中。 **防护措施:** - **出口流量 / PII** —— 攻击者 IP、用户名和文件哈希在**离开主机前会被伪化** (`IP_1`、`USER_1`、`HASH_1`);提供商只能 看到 token,而真实值会在本地报告中被替换回去。可通过 `REDACT_PII` 切换(默认为 `true`)。 - **速率限制** —— 一个滑动窗口上限(`GEMINI_MAX_RPM`,默认为 10),在*跨运行期间*强制执行,确保您保持在免费配额以下,此外还有针对 429/5xx 的指数退避重试(`GEMINI_MAX_RETRIES`)。您不会意外超限。 **后端:** 目前仅支持 Gemini(`LLM_PROVIDER=gemini`,模型为 `GEMINI_MODEL`, 默认为 `gemini-2.0-flash`)。本地/Claude 后端被**特意推迟** —— 请参阅 [`docs/ROADMAP.md`](docs/ROADMAP.md)。本地模型 会完全消除第三方出口流量。 ## 7. 项目结构 ``` docker-compose.yml # SIEM (indexer/manager/dashboard) + honeypot generate-certs.yml # one-shot Wazuh TLS cert generator start_lab.sh # bring the lab up, wait for the agent (no auto-attack) attack.sh # run the adversary simulation on demand report.sh # generate the AI threat report stop_lab.sh # tear down (--wipe clears volumes) requirements.txt / .env.example honeypot/ Dockerfile # Ubuntu + sshd + rsyslog + Wazuh agent entrypoint.sh # enroll agent, start rsyslog + sshd agent-fim.conf # realtime FIM on /tmp, /home, /root config/ wazuh_cluster/wazuh_manager.conf # + custom Active Response & VT integration wazuh_indexer/ wazuh_dashboard/ # official single-node config certs.yml # cert generator inventory scripts/ simulate_attacks.py # paramiko red-team (Cyber Kill Chain) active_defense.py # Wazuh Active Response: iptables ban malware_capture.py # Wazuh integration: VirusTotal hash lookup threat_report.py # Phase A: AI analyst -> MITRE ATT&CK report reports/ # generated threat reports (gitignored) docs/ # static portfolio site ``` ## 8. 范围、诚实度与局限性 这是一个**作品集实验室**,旨在真实客观地反映什么是真实的、什么不是: - **真正真实的内容:** SIEM 流水线(agent → manager → indexer → dashboard,TLS 加密),暴力破解和 FIM *检测*, 主动响应 IP 封禁,以及通过哈希进行的 VirusTotal 查询。 - **“攻击者” IP 是 Docker 网关。** 因为红队脚本运行在 同一台主机上,所以 Wazuh 会将容器/主机网关视为 `srcip`。封禁是 真实的,但属于“自残”,因此主动响应使用了 **600s 超时自动解封**, 并且蜜罐保留了其通往 manager 的出站路径。将脚本指向 来自*不同*主机的蜜罐,可以看到“纯净的”外部封禁效果。 - **Windows/RDP 蜜罐已被移除。** 原始的 `dockur/windows` 镜像 需要 KVM,而这在 macOS 上的 Docker Desktop 中不可用。在 Linux/KVM 主机上,您可以将其作为第二个蜜罐服务重新添加,并注册一个 Windows agent。 - **使用的是 EICAR,而非活跃的恶意软件。** 投放的 payload 是无害的 EICAR 测试 字符串 —— 足以演练 FIM + VirusTotal,而无需处理真正的恶意软件。 - **凭据均为实验室默认值**(`admin/SecretPassword`、`root/toor`、 `wazuh-wui/...`)。切勿将此技术栈暴露给不受信任的网络。 ## 9. 故障排除 | 症状 | 解决方法 | |---------|-----| | Indexer 容器退出 / `max virtual memory areas` 错误 | `vm.max_map_count` 太低 —— 重新运行 `start_lab.sh`,或者在 Docker Desktop 的 LinuxKit 虚拟机中提升该值。 | | 仪表板显示 "Indexer not ready" | 首次启动时给它 1-2 分钟;它正在构建安全索引。 | | `agent_control -l` 中没有 agent | 蜜罐尝试注册时 manager 尚未启动;执行 `docker compose restart linux-honeypot`。 | | VirusTotal 提示 "no VT_API_KEY set" | 将您的密钥到 `.env` 并重启 manager(`docker compose up -d wazuh.manager`)。 | | 端口 8443/2222 已被占用 | 另一个服务占用了该端口 —— 修改 `docker-compose.yml` 中的主机侧映射(例如 `9443:5601`)。 | | `platform (linux/amd64) does not match ... arm64` | 在 Apple Silicon 上这是预期的 —— Wazuh 仅发布 amd64 版本。由于固定了 `platform: linux/amd64`,因此它会在模拟下运行。在 Docker Desktop 中启用 Rosetta(Settings → General)并为 Docker 分配 ≥ 8 GB 内存供 indexer 使用。 | | Indexer 容器在 Apple Silicon 上不断重启 | 模拟环境下的 OpenSearch 非常消耗内存 —— 增加 Docker Desktop 的 RAM,并确认已设置 `vm.max_map_count`(`start_lab.sh` 会执行此操作)。 | ### 主动响应 —— 值得注意的陷阱 要让自定义的主动响应实现端到端工作,浮现出了五个不明显的 要求。这些在仓库中都得到了处理;此处为想要扩展它的人进行记录。 | 症状 | 原因与解决方法 | |---------|-------------| | 暴力破解从未被检测到(没有规则 5710/5712/5763) | `sshd -D -e` 会记录到 **stderr 而不是 syslog**,因此 `rsyslog` 从不写入 `/var/log/auth.log`。请运行 `sshd -D`(不带 `-e`)—— 参见 `honeypot/entrypoint.sh`。 | | 修复 sshd 后身份验证事件仍未被摄取 | agent **没有用于身份验证的日志源**,并且 `auth.log` 在启动时不存在(是延迟创建的),因此 logcollector 的打开操作失败且永远不会重新附加。解决方法:为 `/var/log/auth.log` 添加一个 ``(`honeypot/agent-fim.conf`),**并且**在 agent 启动前的 entrypoint 中 `touch` 该文件。 | | 规则触发但 AR 脚本从未运行(execd 日志显示 "Executing command",然后什么也没发生) | `wazuh-execd` 在**最小化的 PATH** 下运行 AR 脚本,因此 `#!/usr/bin/env python3`(需要 PATH 中有 `env`)会失败,直接调用 `iptables` 也会失败。请使用**绝对路径的 shebang**(`#!/usr/bin/python3`)和绝对路径的 `/usr/sbin/iptables` —— 参见 `scripts/active_defense.py`。 | | AR 脚本启动但卡住 / 什么也不做 | `sys.stdin.read()` 阻塞了:execd 发送了**一行 JSON,但保持 stdin 管道打开**,因此 `read()` 会永远等待 EOF。请改用 `sys.stdin.readline()`。(手动进行 `printf … \| script` 测试会通过,因为管道会关闭 —— 掩盖了这个 bug。) | | Manager 根本不派发 AR | 自定义的 `` 必须**同时**在 manager 和 agent 上定义,可执行文件必须**同时**在两者上可解析(`docker-compose.yml` 将其挂载到 manager 中;蜜罐镜像将其内置),并且重新构建蜜罐需要在 `wazuh_manager.conf` 中配置 authd ``,否则 agent 会卡在 `Duplicate agent name` 且从不转发。 | | 主动响应封禁杀死了攻击者的实时会话 | 如果封禁规则插入(`-I`)在 ESTABLISHED 接受规则之上,这是预期的。该实验室在启动时安装的 `ESTABLISHED,RELATED` 接受规则之后**追加**(`-A`)封禁规则,因此实时会话得以保留,仅新连接会被丢弃。 |
标签:ADCS攻击, Docker, SOAR, Wazuh, x64dbg, 威胁情报, 安全实验室, 安全防御评估, 开发者工具, 红队行动, 网络信息收集, 请求拦截, 逆向工具