dmelendez-sec/wazuh-detection-engineering-
GitHub: dmelendez-sec/wazuh-detection-engineering-
基于 Wazuh 和 Cowrie 蜜罐的检测工程实验室,提供自定义规则、GeoIP 富化、威胁情报管道的完整实现与踩坑文档。
Stars: 0 | Forks: 0
# Wazuh 检测工程实验室
**作者:** Daniel Melendez, CISSP
**环境:** Proxmox homelab — pfSense, Wazuh 4.14, OpenSearch, Cowrie SSH Honeypot
**目的:** 针对生产 Honeypot 的实时攻击流量进行检测工程
## 实验室架构
```
Internet (live attackers)
↓
pfSense (DMZ firewall)
↓
Cowrie SSH Honeypot (10.10.40.10 / webserver01)
Ubuntu 24.04 | Wazuh Agent | Port 22 (honeypot) | Port 2222 (real SSH)
↓
Wazuh Manager (192.168.1.181 / wazuh-server)
Wazuh 4.14 | OpenSearch | Filebeat
↓
Wazuh Dashboard
Custom rules, decoders, geo enrichment, threat intel pipeline
```
## 目录
| 目录 / 文件 | 描述 |
|---|---|
| `decoders/cowrie_decoder.xml` | 用于 Cowrie JSON 日志的自定义 Wazuh decoder |
| `rules/cowrie_rules.xml` | 用于 honeypot 事件的自定义检测规则 |
| `pipelines/wazuh-alerts-pipeline.json` | 用于 GeoIP 富化的 OpenSearch ingest pipeline |
| `pipelines/wazuh-alerts-enriched-mapping.json` | 启用地理信息的 alert 索引映射 |
| `threat-intel/malicious-ioc/` | CDB 列表 — 恶意 IP、域名、哈希 |
| `scripts/update-threatfeed.sh` | AbuseIPDB 自动化威胁源 pipeline |
| `docs/geo-enrichment-fix.md` | 地图可视化的根本原因分析及修复 |
## Cowrie 集成
### 问题
Wazuh agent 正在运行,但仪表板中没有出现 Cowrie 事件。`wazuh-logcollector` 进程打开了日志文件(通过 `/proc//fd` 确认),但未生成告警。
### 根本原因
`wazuh` 用户对 Cowrie 日志目录链缺乏读取权限。路径中任何目录的单一权限拒绝都会阻断整个链。
```
# 验证 issue
sudo -u wazuh ls -la /home/webadmin/cowrie/var/log/cowrie/
# 返回:Permission denied
```
### 应用的修复
```
sudo chmod o+rx /home/webadmin/
sudo chmod o+rx /home/webadmin/cowrie/
sudo chmod o+rx /home/webadmin/cowrie/var/
sudo chmod o+rx /home/webadmin/cowrie/var/log/
sudo chmod o+rx /home/webadmin/cowrie/var/log/cowrie/
sudo chmod o+r /home/webadmin/cowrie/var/log/cowrie/cowrie.json
sudo systemctl restart wazuh-agent
```
### 验证
```
# 确认文件描述符已打开
sudo ls -la /proc/$(pgrep -f wazuh-logcollector)/fd | grep cowrie
# 期望:lr-x------ ... -> /home/webadmin/cowrie/var/log/cowrie/cowrie.json
```
### Agent 配置 (`/var/ossec/etc/ossec.conf`)
```
json
/home/webadmin/cowrie/var/log/cowrie/cowrie.json
```
## 自定义 Decoder
**文件:** `decoders/cowrie_decoder.xml`
```
"eventid":"cowrie.
cowrie
"src_ip":"(\d+\.\d+\.\d+\.\d+)"
srcip
cowrie
"eventid":"(\.+)"
extra_data
```
**使用 wazuh-logtest 测试:**
```
sudo /var/ossec/bin/wazuh-logtest
```
粘贴一个示例 Cowrie JSON 事件,并验证阶段 2 显示提取了 `eventid`,阶段 3 显示触发了规则。
## 自定义检测规则
**文件:** `rules/cowrie_rules.xml`
```
json
cowrie.session.connect
Cowrie Honeypot: New SSH connection from $(data.src_ip)
cowrie,honeypot,connection,
json
cowrie.login.success
Cowrie Honeypot: Successful login from $(data.src_ip) using $(data.username)
cowrie,honeypot,authentication_success,
json
cowrie.command.input
Cowrie Honeypot: Command executed by $(data.src_ip)
cowrie,honeypot,command_execution,
json
cowrie.session.file_download
Cowrie Honeypot: CRITICAL - File download attempt from $(data.src_ip)
cowrie,honeypot,malware,
```
## GeoIP 富化 — 地图可视化修复
### 问题陈述
尽管事件通过了 pipeline,Wazuh 仪表板 GeoData 地图仍然为空。已识别并解决了三个独立的问题。
### 根本原因分析
**问题 1 — 数据隐藏在 Archives 索引中**
大多数 honeypot 事件落入 `wazuh-archives-*` 而非 `wazuh-alerts-*`,因为自动化扫描流量量大但并不总是触发高优先级告警规则。仪表板默认的索引模式仅查询 alerts 索引。
**问题 2 — 字段类型不匹配**
OpenSearch 动态将 `data.src_ip` 映射为 `text`(全文搜索)而非 `keyword`(精确匹配标签)。地图可视化需要 `keyword` 类型才能进行 IP 聚合。动态映射会猜测字段类型,而对于混合了其他数据的 IP,它会猜错。
**问题 3 — 缺少 GeoIP 坐标**
原始 Cowrie JSON 日志包含作为字符串的 `src_ip`,但没有地理坐标。Wazuh decoder 提取 `srcip` 以进行 geo 查询,但内置的 JSON decoder 先拦截了事件,导致 `src_ip` 仍作为数据字段存在,而不是保留的用于触发 Wazuh geo 富化 pipeline 的 `srcip` 字段。
### 通过 OpenSearch Dev Tools Web GUI 的解决方案 — 三步修复
**步骤 1:创建 Ingest Pipeline**
必须首先创建 — reindex 操作通过名称引用此 pipeline。
```
PUT _ingest/pipeline/wazuh-alerts
{
"description": "Add GeoIP info to Wazuh alerts",
"processors": [
{
"geoip": {
"field": "data.src_ip",
"target_field": "GeoLocation",
"properties": ["city_name", "country_name", "region_name", "location"],
"ignore_missing": true
}
},
{
"set": {
"field": "srcip",
"copy_from": "data.src_ip",
"ignore_failure": true
}
}
]
}
```
**步骤 2:创建具有显式映射的索引**
必须第二步创建 — 数据写入后字段类型无法更改。在空索引上定义 schema。
```
PUT wazuh-alerts-enriched
{
"mappings": {
"properties": {
"srcip": { "type": "keyword" },
"data": {
"properties": {
"src_ip": { "type": "keyword" }
}
},
"GeoLocation": {
"properties": {
"location": { "type": "geo_point" }
}
}
}
}
}
```
**步骤 3:重建历史数据索引**
最后运行 — 将存档数据通过 pipeline 拉取到新的富化索引中。
```
POST _reindex?wait_for_completion=false
{
"source": {
"index": "wazuh-archives-*",
"query": {
"query_string": {
"query": "data.src_ip:*"
}
}
},
"dest": {
"index": "wazuh-alerts-enriched",
"pipeline": "wazuh-alerts"
}
}
```
**步骤 4:更新仪表板索引模式**
将 GeoData 地图可视化中的索引模式从 `wazuh-alerts-*` 更改为 `wazuh-alerts*`(带通配符),以包含新的富化索引和实时告警。
### 关键经验
| 经验 | 详情 |
|---|---|
| Pipeline 先于映射先于数据 | 顺序不可协商。在映射之前写入的数据将永久锁定字段类型。 |
| 地图和图表使用 `keyword` | `text` 字段无法聚合。在 SIEM 中,对于 IP、主机名、用户名始终使用 `keyword`。 |
| Archives 包含信号 | 对于 honeypot,大容量的自动化攻击通常落入 archives 而非 alerts。两者都要查询。 |
| 通配符索引模式 | `wazuh-alerts*` 捕获所有变体。`wazuh-alerts-*` 遗漏 `wazuh-alerts-enriched`。 |
| 动态映射很危险 | OpenSearch 会猜测字段类型。对于生产索引,始终定义显式映射。 |
## 自动化威胁情报 Pipeline
**脚本:** `scripts/update-threatfeed.sh`
**计划:** 通过 cron 每天早上 6:00 运行
### 它的功能
1. 从 AbuseIPDB 下载前 10,000 个恶意 IP(置信度 ≥ 90%)
2. 追加来自本地调查列表的已知 honeypot 攻击者
3. 重新生成 Wazuh CDB (Constant Database) 查找文件
4. 重启 wazuh-manager 以重新加载威胁情报列表
### 生成的 CDB 文件
| 文件 | 大小 | 来源 |
|---|---|---|
| `malicious-ip.cdb` | ~375KB | AbuseIPDB + 手动 IOC |
| `malicious-domains.cdb` | ~11KB | 域名黑名单 |
| `malware-hashes.cdb` | ~20KB | 已知恶意软件哈希 |
### Cron 计划
```
0 6 * * * /usr/local/bin/update-threatfeed.sh >> /var/log/threatfeed-update.log 2>&1
```
## 记录的威胁行为者
所有调查并通过 VirusTotal 社区评论记录的威胁行为者均位于 [virustotal.com/gui/user/TechySec](https://www.virustotal.com/gui/user/TechySec)
| IP | ASN | 会话 | TTP | 备注 |
|---|---|---|---|---|
| 159.203.173.197 | DigitalOcean US | 高 | 挖矿程序侦察 | OpenSSH Windows 客户端 |
| 46.101.103.24 | DigitalOcean Frankfurt | 中 | SSH-2.0-Go 扫描器 | HASSH: 2ec37a7cc8daf20b10e1ad6221061ca5 |
| 80.94.92.184 | DMZHOST Netherlands | 高 | 多向量 | Bulletproof hosting,17 个供应商检测 |
| 165.245.135.50 | DigitalOcean US | 373 | 操作系统指纹识别 | uname 枚举活动 |
| 170.64.192.224 | DigitalOcean US | 255 | 协调活动 | 轮换凭证喷洒 |
| 139.59.23.117 | DigitalOcean | 195 次连接,62 次登录 | 硬件指纹识别 | 脚本化侦察:负载下发前进行 CPU/GPU/uptime 分析 |
| 67.162.117.90 | 未知 | 低 | SMS 网关搜寻 | 针对 Telegram 会话文件,GSM 调制解调器设备 |
### 威胁情报样本分析:139.59.23.117
```
139.59.23.117 – Automated SSH login and host fingerprinting via Cowrie honeypot
Observation window: Mar 3, 2026 19:58:51 – Mar 5, 2026 19:58:51 UTC
Activity: 195 SSH connection attempts | 62 successful logins (ssh:ssh123)
Post-authentication recon script collected:
- OS/kernel (uname), uptime (/proc/uptime)
- CPU architecture and model (/proc/cpuinfo, lscpu)
- CPU/core count (nproc)
- GPU presence (lspci grep VGA/nvidia)
- Recent login history (last)
- Shell utility behavior (cat --help, ls --help)
Assessment: Automated scanning infrastructure performing post-authentication
host fingerprinting to inventory system capabilities before payload deployment.
Consistent with cryptomining or botnet recruitment operations.
Tag: ssh-scanner
```
## VirusTotal 集成
Wazuh VirusTotal 集成配置在 `/var/ossec/etc/ossec.conf` 中,范围为 Cowrie 规则 100200-100203。来自 honeypot 事件的文件哈希和 IP 会自动提交以进行信誉查询。
## Canary 凭证
部署在 honeypot 文件系统中的虚假 AWS 凭证。配置了 CloudTrail 监控,并使用 CloudWatch metric filter 和 SNS 告警,监控任何使用 canary 密钥 `AKIAWQ7KMCRTJQWSOAT4` 的 API 调用。
任何此密钥的使用都会立即触发 SNS 电子邮件告警 — 表明攻击者成功窃取了凭证并试图使用它们。
## 参考
- [Cowrie SSH Honeypot](https://github.com/cowrie/cowrie)
- [Wazuh 文档](https://documentation.wazuh.com)
- [AbuseIPDB API](https://docs.abuseipdb.com)
- [OpenSearch Ingest Pipelines](https://opensearch.org/docs/latest/ingest-pipelines/)
- [MITRE ATT&CK T1110 — 暴力破解](https://attack.mitre.org/techniques/T1110/)
- [MITRE ATT&CK T1082 — 系统信息发现](https://attack.mitre.org/techniques/T1082/)
标签:Filebeat, GeoIP, IP 地址批量处理, Logstash, PB级数据处理, PE 加载器, pfSense, Proxmox, SSH蜜罐, Wazuh, 威胁情报, 安全实验室, 安全运维, 应用安全, 底层分析, 开发者工具, 恶意IP检测, 自制规则, 蜜罐, 证书利用, 进程注入