vtomasv/osquery-elk-threat-hunting-lab

GitHub: vtomasv/osquery-elk-threat-hunting-lab

基于 Osquery 与 ELK Stack 的全 Docker 化威胁狩猎实验环境,内置 APT 攻击模拟与实时终端监控,专为 SOC 分析师和安全教学而设计。

Stars: 0 | Forks: 0

# Osquery + ELK Threat Hunting 实验环境 ## 实时监控威胁狩猎完整工坊 **大市长大学 — MAR404 — 威胁狩猎** ## 总体描述 本实验环境提供了一个基于 Docker 容器的完整 **Threat Hunting** 环境,模拟了一个包含 5 个 endpoint 的企业网络,并通过 **Osquery** 和 **ELK 栈(Elasticsearch, Logstash, Kibana)** 进行实时监控。该实验环境允许执行真实的 APT 攻击模拟,并在 Kibana 的 dashboard 中观察攻击的每一个阶段,为正在接受培训的 SOC 分析师和 Threat Hunter 提供身临其境的教育体验。 该架构实现了由 MITRE ATT&CK [1] 记录的**基于行为的检测**(Behavior-Based Detection)概念,通过实时关联 endpoint 的遥测事件,来识别与已知的 APT 组织战术、技术和程序(TTPs)相匹配的恶意活动模式。 ## 实验环境架构 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ RED CORPORATIVA SIMULADA │ │ 10.10.10.0/24 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Elasticsearch│ │ Logstash │ │ Kibana │ │ │ │ 10.10.10.10 │ │ 10.10.10.11 │ │ 10.10.10.12 │ │ │ │ :9200 │ │ :5044/:5045 │ │ :5601 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────────┘ │ │ │ │ │ │ └──────────────────┼────────────────────────────────────┐ │ │ │ │ │ │ ┌─────────────────────────┼────────────────────────────────┐ │ │ │ │ ENDPOINTS MONITOREADOS │ │ │ │ │ │ │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │ │ │ │ │ │ ENDPOINT 1 │ │ ENDPOINT 2 │ │ ENDPOINT 3 │ │ │ │ │ │ │WS-FINANZAS │ │ WS-RRHH │ │ SRV-FILESERVER │ │ │ │ │ │ │10.10.10.101│ │10.10.10.102│ │ 10.10.10.103 │ │ │ │ │ │ │noVNC :6901 │ │noVNC :6902 │ │ noVNC :6903 │ │ │ │ │ │ └────────────┘ └────────────┘ └────────────────────┘ │ │ │ │ │ │ │ │ │ │ ┌────────────┐ ┌────────────────────────────────────┐ │ │ │ │ │ │ ENDPOINT 4 │ │ ENDPOINT 5 │ │ │ │ │ │ │WS-DESARROL │ │ DC-CORP-01 │ │ │ │ │ │ │10.10.10.104│ │ 10.10.10.105 │ │ │ │ │ │ │noVNC :6904 │ │ noVNC :6905 │ │ │ │ │ │ └────────────┘ └────────────────────────────────────┘ │ │ │ │ └───────────────────────────────────────────────────────────┘ │ │ │ │ │ │ ┌────────────────┐ ┌──────────────────────────────────────┐ │ │ │ │ ATTACKER │ │ MALICIOUS WEB SERVER │ │ │ │ │ 10.10.10.200 │ │ 10.10.10.66 │ │ │ │ │ noVNC :6900 │ │ (evil-downloads.corp) │ │ │ │ │ C2: :4444 │ │ :8888 │ │ │ │ └────────────────┘ └──────────────────────────────────────┘ │ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ ``` ## 系统组件 | 组件 | IP | 端口 | 功能 | |---|---|---|---| | Elasticsearch | 10.10.10.10 | 9200, 9300 | 日志存储与搜索 | | Logstash | 10.10.10.11 | 5044, 5045 | 事件摄取与处理 | | Kibana | 10.10.10.12 | 5601 | 可视化与 dashboard | | WS-FINANZAS-01 | 10.10.10.101 | 6901 (noVNC) | 攻击的初始 endpoint | | WS-RRHH-01 | 10.10.10.102 | 6902 (noVNC) | 横向移动目标 | | SRV-FILESERVER-01 | 10.10.10.103 | 6903 (noVNC) | 文件服务器(数据外泄) | | WS-DESARROLLO-01 | 10.10.10.104 | 6904 (noVNC) | 开发工作站(凭据) | | DC-CORP-01 | 10.10.10.105 | 6905 (noVNC) | Domain Controller(最终目标) | | ATTACKER | 10.10.10.200 | 6900 (noVNC) | 对手机器 | | Malicious Web | 10.10.10.66 | 8888 | payload 服务器 | ## 前置条件 本实验环境在宿主机上需要以下资源: | 要求 | 最低配置 | 推荐配置 | |---|---|---| | 内存 | 8 GB | 16 GB | | CPU | 4 核 | 8 核 | | 磁盘 | 20 GB 可用空间 | 40 GB 可用空间 | | Docker | 24.0+ | 最新版本 | | Docker Compose | 2.20+ | 最新版本 | | 操作系统 | Linux/macOS/Windows (WSL2) | Ubuntu 22.04+ | ## 安装与部署 ### 步骤 1:克隆仓库 ``` git clone https://github.com/YOUR_USER/osquery-elk-threat-hunting-lab.git cd osquery-elk-threat-hunting-lab ``` ### 步骤 2:配置宿主机系统 在 Linux 系统上,需要为 Elasticsearch 增加虚拟内存限制: ``` # Elasticsearch 必需 sudo sysctl -w vm.max_map_count=262144 # 要使其永久生效: echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf ``` ### 步骤 3:构建并启动实验环境 ``` # 构建所有镜像(首次,约10-15分钟) docker compose build # 启动整个环境 docker compose up -d # 验证所有容器正在运行 docker compose ps ``` ### 步骤 4:配置 Kibana(dashboard 和 index pattern) 等待大约 2 分钟让 Kibana 完全启动,然后执行: ``` # 配置 index patterns 和 templates ./elk/kibana/dashboards/setup_dashboards.sh ``` ### 步骤 5:验证部署 ``` # 验证 Elasticsearch curl http://localhost:9200/_cluster/health?pretty # 验证 Kibana curl http://localhost:5601/api/status # 验证 endpoints(必须响应 ping) docker exec endpoint1-workstation ping -c 1 10.10.10.12 ``` ## 服务访问 ### Kibana(监控面板) 在浏览器中打开:**http://localhost:5601** 从这里可以访问: - **Discover**:实时探索日志 - **Dashboard**:攻击的综合可视化 - **Alerts**:已配置的检测规则 ### noVNC(Endpoint 可视化访问) 每个 endpoint 都有一个可通过浏览器访问的 XFCE4 桌面: | Endpoint | noVNC URL | 密码 | |---|---|---| | ATTACKER | http://localhost:6900 | attack2024 | | WS-FINANZAS-01 | http://localhost:6901 | hunter2024 | | WS-RRHH-01 | http://localhost:6902 | hunter2024 | | SRV-FILESERVER-01 | http://localhost:6903 | hunter2024 | | WS-DESARROLLO-01 | http://localhost:6904 | hunter2024 | | DC-CORP-01 | http://localhost:6905 | hunter2024 | ## 攻击场景:Operation Shadow Finance ### 背景 一个名为 **APT-LABSIM** 的 APT 组织已将 CORP 公司确定为高价值目标。通过 OSINT 侦察,他们确定财务部的 **María González** 为初始访问向量。攻击者发送了一封包含指向托管在被攻破网站上的“未决发票”链接的鱼叉式网络钓鱼电子邮件。当 María 下载并执行该文件时,一场 compromising 整个企业网络的攻击链便开始了。 ### 攻击阶段(与 MITRE ATT&CK 对齐) | 阶段 | MITRE 技术 | 描述 | 受影响 Endpoint | |---|---|---|---| | 1. Initial Access | T1566.002 | 从恶意站点下载 payload | WS-FINANZAS-01 | | 2. Execution | T1059.004 | 执行恶意脚本 | WS-FINANZAS-01 | | 3. Persistence | T1053.003, T1546.004 | Crontab + .bashrc 后门 | WS-FINANZAS-01 | | 4. Discovery | T1046, T1087 | 网络扫描和枚举 | WS-FINANZAS-01 | | 5. Lateral Movement | T1021.004 | 向所有 endpoint 进行 SSH 传播 | 所有 | | 6. Credential Access | T1003.008 | 提取 /etc/shadow 和密钥 | 所有 | | 7. Collection | T1005, T1074 | 敏感数据收集 | 财务、人力资源、文件服务器 | | 8. Exfiltration | T1048.003 | 将数据传输至 C2 | 所有 | | 9. Impact | T1486 | 勒索软件模拟(仅标记) | 所有 | ## 执行攻击 ### 选项 A:全自动攻击(推荐用于演示) 连接到攻击机器并执行完整链路: ``` # 从主机 docker exec -it attacker-machine bash # 在攻击者容器内 /opt/attack-scripts/full_attack_chain.sh ``` 或直接从宿主机执行: ``` docker exec -it attacker-machine /opt/attack-scripts/full_attack_chain.sh ``` 该脚本会执行所有阶段,并在每个阶段之间暂停,以便在 Kibana 中进行观察。预计总时间:**5 分钟**。 ### 选项 B:分阶段执行(推荐用于学习) 单独执行每个阶段以进行详细分析: ``` # 阶段 1:Initial Access docker exec -it attacker-machine /opt/attack-scripts/phase1_initial_access.sh # 阶段 2:Execution + Persistence docker exec -it attacker-machine /opt/attack-scripts/phase2_execution.sh # 阶段 3:Lateral Movement docker exec -it attacker-machine /opt/attack-scripts/phase3_lateral_movement.sh # 阶段 4:Credential Access + Exfiltration docker exec -it attacker-machine /opt/attack-scripts/phase4_exfiltration.sh ``` ### 选项 C:通过 noVNC 手动模拟(最大交互性) 为获得最真实和最具教育意义的体验: 1. 在浏览器中打开 **http://localhost:6901** (WS-FINANZAS-01) 2. 在虚拟桌面中打开 Firefox 3. 访问 **http://10.10.10.66**(恶意网站) 4. 下载文件 `malicious_update.sh` 5. 打开终端并执行下载的文件 6. 在 Kibana 中观察实时记录的事件 ## Kibana 中的监控与 Hunting ### 快速访问 打开 **http://localhost:5601/app/discover** 并选择 index pattern `threat-hunting-*`。 ### 核心 Hunting 查询 **检测整个攻击:** ``` risk_level: "CRITICAL" OR risk_level: "HIGH" ``` **检测横向移动:** ``` event_type: "lateral_movement" ``` **检测 C2 通信:** ``` network.remote_port: 4444 OR threat_type: "possible_c2_communication" ``` **检测数据外泄:** ``` event_type: "exfiltration" OR process.cmdline: *base64* ``` **每个 endpoint 的完整时间线:** ``` endpoint: "WS-FINANZAS-01" AND risk_level: * ``` 有关完整的查询列表,请查阅 `elk/kibana/dashboards/hunting_queries.md` 文件。 ## 交互式 Osquery 查询 连接到任何 endpoint 并实时执行查询: ``` # 连接到 endpoint docker exec -it endpoint1-workstation osqueryi # 在 osqueryi 内: ``` ### 检测查询 ``` -- Procesos sospechosos (ejecutados desde /tmp o con comandos peligrosos) SELECT pid, name, path, cmdline, uid FROM processes WHERE path LIKE '/tmp/%' OR cmdline LIKE '%nc %' OR cmdline LIKE '%base64%' OR cmdline LIKE '%/dev/tcp%'; -- Conexiones de red activas (detectar C2) SELECT p.name, p.cmdline, ps.remote_address, ps.remote_port FROM process_open_sockets ps JOIN processes p ON ps.pid = p.pid WHERE ps.remote_address NOT IN ('127.0.0.1', '::1', '') AND ps.state = 'ESTABLISHED'; -- Archivos recientes en directorios temporales (payloads) SELECT path, size, mtime, uid FROM file WHERE (path LIKE '/tmp/%' OR path LIKE '/dev/shm/%') AND mtime > (strftime('%s','now') - 3600); -- Verificar persistencia en crontab SELECT * FROM crontab; -- Detectar movimiento lateral (sesiones SSH) SELECT * FROM logged_in_users WHERE host != ''; -- Puertos en escucha no autorizados (backdoors) SELECT p.name, p.path, lp.port, lp.protocol FROM listening_ports lp JOIN processes p ON lp.pid = p.pid WHERE lp.port NOT IN (22, 5901, 6901); ``` ## 仓库结构 ``` osquery-elk-threat-hunting-lab/ ├── docker-compose.yml # Orquestación de todos los servicios ├── README.md # Este archivo ├── elk/ │ ├── elasticsearch/ # Configuración de Elasticsearch │ ├── logstash/ │ │ ├── config/logstash.yml # Configuración de Logstash │ │ └── pipeline/logstash.conf # Pipeline de procesamiento │ └── kibana/ │ ├── config/kibana.yml # Configuración de Kibana │ └── dashboards/ │ ├── setup_dashboards.sh # Script de configuración │ └── hunting_queries.md # Queries de hunting ├── endpoints/ │ ├── Dockerfile.base # Dockerfile base (referencia) │ ├── endpoint1/Dockerfile # WS-FINANZAS-01 │ ├── endpoint2/Dockerfile # WS-RRHH-01 │ ├── endpoint3/Dockerfile # SRV-FILESERVER-01 │ ├── endpoint4/Dockerfile # WS-DESARROLLO-01 │ ├── endpoint5/Dockerfile # DC-CORP-01 │ ├── scripts/ │ │ ├── startup.sh # Script de inicio de endpoints │ │ ├── process_monitor.sh # Monitor de procesos -> JSON │ │ ├── network_monitor.sh # Monitor de red -> JSON │ │ └── file_monitor.sh # Monitor de archivos -> JSON │ ├── supervisord.conf # Gestión de servicios │ └── yara/ │ └── malware.yar # Reglas YARA de detección ├── attack-simulation/ │ ├── Dockerfile # Máquina atacante │ ├── nginx.conf # Config del web server malicioso │ ├── attacker_supervisord.conf # Supervisord del atacante │ ├── scripts/ │ │ ├── full_attack_chain.sh # Ataque completo automatizado │ │ ├── phase1_initial_access.sh │ │ ├── phase2_execution.sh │ │ ├── phase3_lateral_movement.sh │ │ ├── phase4_exfiltration.sh │ │ ├── simple_c2_server.py # Servidor C2 simulado │ │ ├── attacker_startup.sh # Inicio del atacante │ │ └── README_ATTACK.md # Guía del ataque │ ├── payloads/ │ │ └── malicious_update.sh # Payload simulado │ └── lateral-movement/ # Scripts de movimiento lateral ├── shared/ │ ├── osquery/ │ │ ├── osquery.conf # Configuración principal Osquery │ │ ├── osquery.flags # Flags de Osquery │ │ └── packs/ │ │ └── threat-hunting.conf # Pack de queries de hunting │ └── filebeat/ │ └── filebeat.yml # Configuración de Filebeat └── docs/ ├── GUIA_COMPLETA.md # Guía paso a paso del taller └── images/ # Capturas y diagramas ``` ## 科学与技术基础 ### 基于行为的检测 本实验环境实现了 Ussath 等人(2016)[2] 研究中描述的 **Behavior-Based Threat Detection** 原则,该检测基于识别动作序列(行为)而非静态特征。每个 endpoint 都会生成连续的遥测数据,Logstash pipeline 对其进行关联,以识别与 MITRE ATT&CK [1] 中记录的 TTPs 相匹配的模式。 ### 作为 Endpoint 传感器的 Osquery Osquery 最初由 Facebook (Meta) 于 2014 年开发 [3],它将操作系统状态公开为一个可通过 SQL 查询的关系型数据库。在本实验环境中,Osquery 充当主要的遥测传感器,每 10-30 秒运行一次计划的查询,以检测进程、网络连接、文件和系统配置的变化。根据 Osquery 官方文档 [4],这种方法提供了对 endpoint 的精细可见性,而没有完整 EDR 代理的开销。 ### 用于事件关联的 ELK 栈 ELK 栈(Elasticsearch、Logstash、Kibana)提供了实时存储、处理和可视化大量安全事件的能力 [5]。Logstash 应用了富集过滤器,可根据风险级别自动对事件进行分类,并将它们映射到 MITRE ATT&CK 技术,使分析师能够通过 Kibana 中的 KQL 查询进行主动 hunting。 ### 横向移动与 Cyber Kill Chain 攻击模拟遵循 Lockheed Martin 的 **Cyber Kill Chain** [6] 模型和 **MITRE ATT&CK** [1] 框架,实现了一条从初始访问(鱼叉式网络钓鱼)到影响(模拟勒索软件)的真实链路,并涵盖了 APT29 [7] 和 APT41 [8] 等真实 APT 活动中记录的所有中间阶段。 ## 故障排除 ### Elasticsearch 未启动 ``` # 验证 logs docker logs elk-elasticsearch # 常见解决方案:增加 vm.max_map_count sudo sysctl -w vm.max_map_count=262144 ``` ### Endpoint 未向 ELK 发送日志 ``` # 从 endpoint 验证连通性 docker exec endpoint1-workstation curl -s http://logstash:5044 # 验证 Filebeat docker exec endpoint1-workstation filebeat test output # 验证 Osquery 正在生成 logs docker exec endpoint1-workstation ls -la /var/log/osquery/ ``` ### noVNC 无法加载 ``` # 验证 VNC 正在运行 docker exec endpoint1-workstation pgrep -a Xvnc # 重启 VNC docker exec endpoint1-workstation vncserver -kill :1 docker exec endpoint1-workstation vncserver :1 -geometry 1280x800 -depth 24 ``` ### 重启整个实验环境 ``` docker compose down -v docker compose up -d --build ``` ## 停止与清理 ``` # 停止所有容器 docker compose down # 停止并删除卷(Elasticsearch 的数据) docker compose down -v # 删除已构建的镜像 docker compose down -v --rmi all ``` ## 参考文献 [1]: MITRE ATT&CK Framework. https://attack.mitre.org/ — "MITRE ATT&CK: Adversarial Tactics, Techniques, and Common Knowledge" [2]: Ussath, M., Jaeger, D., Cheng, F., & Meinel, C. (2016). "Advanced Persistent Threats: Behind the Scenes." Annual Conference on Information Science and Systems (CISS). [3]: Osquery Official Documentation. https://osquery.readthedocs.io/ — "Osquery: SQL powered operating system instrumentation" [4]: Osquery Schema. https://osquery.io/schema/ — "Osquery Table Schema Reference" [5]: Elastic Documentation. https://www.elastic.co/guide/index.html — "Elastic Stack Documentation" [6]: Hutchins, E., Cloppert, M., & Amin, R. (2011). "Intelligence-Driven Computer Network Defense Informed by Analysis of Adversary Campaigns and Intrusion Kill Chains." Lockheed Martin. [7]: MITRE ATT&CK - APT29. https://attack.mitre.org/groups/G0016/ — "APT29 (Cozy Bear) Techniques" [8]: MITRE ATT&CK - APT41. https://attack.mitre.org/groups/G0096/ — "APT41 (Double Dragon) Techniques" ## 许可证 本实验环境仅供教育使用,专为乌尼维希达市长大学(Universidad Mayor)的 **MAR404 - 威胁狩猎** 课程开发。攻击脚本是受控模拟,不包含真实的恶意代码。 **作者**:MAR404 课程 - 高级网络防御 **版本**:1.0.0 **日期**:2025 年 7 月
标签:APT攻击模拟, ELK Stack, Osquery, 内容过滤, 安全实验环境, 安全运营中心, 应用安全, 版权保护, 网络映射, 请求拦截, 越狱测试