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, 内容过滤, 安全实验环境, 安全运营中心, 应用安全, 版权保护, 网络映射, 请求拦截, 越狱测试