Jyot-tipsoc/honeypot-threat-lab
GitHub: Jyot-tipsoc/honeypot-threat-lab
一个生产级医疗物联网蜜罐系统,通过模拟脆弱设备诱捕攻击者,实现威胁情报采集、GeoIP 归属分析及实时攻击可视化。
Stars: 1 | Forks: 1
# 🏥 医疗物联网欺骗蜜罐网络
一个适用于医疗环境的完整、生产级 **物联网蜜罐系统**。模拟脆弱的医疗物联网设备(SSH/Telnet/Web 面板),捕获攻击者行为,通过 GeoIP 数据丰富日志,并在实时威胁情报仪表板上可视化所有信息。
## 📐 架构概述
```
Internet / Test Network
│
▼
┌─────────────────────────────────────────────────────┐
│ HONEYPOT LAYER │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Cowrie │ │ Fake IoT Web Panel │ │
│ │ SSH :2222 │ │ Flask App :8080 │ │
│ │ Telnet :2223 │ │ (unauthenticated admin) │ │
│ └──────┬───────┘ └────────────┬─────────────┘ │
└─────────┼───────────────────────-─┼─────────────────┘
│ JSON logs │ JSON logs
▼ ▼
┌─────────────────────────────────────────────────────┐
│ DATA PIPELINE LAYER │
│ ┌───────────┐ ┌────────────┐ ┌──────────────┐ │
│ │ Filebeat │──▶│Elasticsearch│ │ Log Parser │ │
│ │(log ship) │ │ :9200 │ │ + GeoIP │ │
│ └───────────┘ └────────────┘ │ + IoC extract│ │
│ └──────┬───────┘ │
└──────────────────────────────────────────┼──────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ VISUALIZATION LAYER │
│ ┌──────────────────────────────────────────────┐ │
│ │ Threat Dashboard :5000 (via Nginx :80) │ │
│ │ • Live attack feed • World map │ │
│ │ • Top IPs/creds • Timeline chart │ │
│ │ • Malware hashes • IoC report │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
## 📁 项目结构
```
honeypot-project/
├── docker-compose.yml ← Orchestrates all 7 containers
│
├── cowrie/ ← SSH/Telnet honeypot
│ ├── Dockerfile
│ └── etc/
│ ├── cowrie.cfg ← Device impersonation config
│ └── userdb.txt ← Weak credentials (trap)
│
├── fake_panel/ ← Fake IoT web admin panel
│ ├── Dockerfile
│ └── app.py ← Flask app, logs every click
│
├── filebeat/
│ └── filebeat.yml ← Ships logs to Elasticsearch
│
├── dashboard/ ← Threat intelligence dashboard
│ ├── Dockerfile
│ ├── app.py ← Flask API + template server
│ └── templates/
│ └── dashboard.html ← Full interactive UI
│
├── scripts/
│ ├── Dockerfile ← Log parser container
│ ├── parser.py ← GeoIP enrichment + SQLite indexing
│ └── ioc_extractor.py ← IoC report generator (Week 3)
│
├── nginx/
│ └── nginx.conf ← Reverse proxy config
│
├── tests/
│ └── simulate_attacker.py ← Generates fake traffic for testing
│
├── docs/
│ └── architecture.md ← Detailed architecture notes
│
└── setup.sh ← One-command setup script
```
## 🚀 快速开始(分步指南)
### 前置条件
| 要求 | 版本 | 检查命令 |
|---|---|---|
| Linux(推荐 Ubuntu 22.04) | 任意 | `uname -a` |
| Docker | ≥ 24.0 | `docker --version` |
| Docker Compose | ≥ 2.0 | `docker compose version` |
| RAM | ≥ 4 GB | `free -h` |
| 磁盘 | ≥ 10 GB | `df -h` |
### 步骤 1 — 克隆仓库
```
git clone https://github.com/YOUR_USERNAME/honeypot-project.git
cd honeypot-project
```
### 步骤 2 — 运行设置脚本
```
chmod +x setup.sh
./setup.sh
```
此脚本将执行以下操作:
1. 检查是否已安装 Docker/Compose
2. 为 Elasticsearch 调优 `vm.max_map_count`
3. 创建本地日志目录
4. 构建所有 Docker 镜像
5. 启动全部 7 个容器
6. 等待 Elasticsearch 变为健康状态
### 步骤 3 — 验证所有服务是否正在运行
```
docker compose ps
```
你应该看到所有服务的状态均为 `Up`:
```
NAME STATUS
cowrie_honeypot Up (healthy)
fake_iot_panel Up
filebeat Up
elasticsearch Up (healthy)
threat_dashboard Up
log_parser Up
nginx_proxy Up
```
### 步骤 4 — 访问仪表板
打开浏览器:
```
http://localhost:5000 ← Threat Intelligence Dashboard
http://localhost:8080 ← Fake IoT Admin Panel (honeypot)
http://localhost:9200 ← Elasticsearch raw API
```
### 步骤 5 — 使用模拟流量进行测试(开发环境)
如果你想立即在仪表板中填充数据,而不想等待真实攻击者:
```
# 运行攻击者模拟器(仅针对本地日志文件 — 安全)
python3 tests/simulate_attacker.py \
--log $(docker inspect cowrie_honeypot --format '{{range .Mounts}}{{.Destination}}{{end}}' | grep cowrie)/cowrie.json \
--events 200
```
或者直接写入挂载卷:
```
python3 tests/simulate_attacker.py --log /tmp/cowrie_test.json --events 100
```
刷新仪表板——你将在约 30 秒内看到攻击数据出现。
### 步骤 6 — 手动测试 SSH 蜜罐
```
# 尝试连接到 Cowrie(安全 — 它是一个 honeypot)
ssh root@localhost -p 2222
# 密码: root(或来自弱凭据列表中的任意一个)
# 你将进入一个 fake shell — 输入命令并查看日志
```
```
# 查看实时 Cowrie 日志
docker compose logs -f cowrie
```
### 步骤 7 — 生成 IoC 报告(第 3 周)
```
# 对实时数据库运行 IoC extractor
docker compose exec log_parser python3 /app/ioc_extractor.py \
--db /app/db/honeypot.db \
--out /app/db
# 将报告复制到本地机器
docker cp log_parser:/app/db/ioc_report.txt ./ioc_report.txt
docker cp log_parser:/app/db/ioc_report.json ./ioc_report.json
cat ioc_report.txt
```
## 🗓️ 四周工程路线图
### 第 1 周 — 环境搭建与设备模拟
**目标:** 部署并配置蜜罐,使其能令人信服地模拟医疗物联网设备。
**任务:**
```
# 1. 构建并启动所有容器
./setup.sh
# 2. 验证 Cowrie 正在监听
nmap -p 2222,2223 localhost
# 3. 检查 fake SSH banner(看起来像 Philips 医疗设备)
nc -v localhost 2222
# 4. 验证 fake web panel 正在提供 IoT admin UI
curl -I http://localhost:8080
# 5. 查看容器隔离(确保 honeypot 无法访问真实网络)
docker network inspect honeypot-project_honeypot_net
```
**交付物:** Cowrie 返回 `SSH-2.0-OpenSSH_7.4 (Philips IntelliVue IoT Gateway v3.2.1)` 标语。Web 面板显示逼真的、无需身份验证的管理界面。
### 第 2 周 — 暴露与数据捕获
**目标:** 确认所有攻击者交互都被完整记录。
**任务:**
```
# 1. 模拟 SSH brute-force(从第二个终端)
for pass in root admin password 123456 toor; do
sshpass -p "$pass" ssh -o StrictHostKeyChecking=no root@localhost -p 2222 \
"uname -a; cat /etc/passwd" 2>/dev/null || true
done
# 2. 查看出现在 Cowrie 日志中的事件
docker compose exec cowrie tail -f var/log/cowrie/cowrie.json | python3 -m json.tool
# 3. 检查 web panel 日志(每次点击都被记录)
curl -X POST http://localhost:8080/admin \
-d "username=admin&password=admin123"
docker compose logs fake_panel
# 4. 验证 Elasticsearch 已接收事件
curl http://localhost:9200/honeypot-events/_count
```
**交付物:** 每个连接、登录尝试和命令都能看到对应的 JSON 日志条目。仪表板显示实时数据。
### 第 3 周 — 日志解析与威胁情报提取
**目标:** 从原始日志中提取结构化的 IoC。
**任务:**
```
# 1. 运行 IoC extractor
docker compose exec log_parser python3 /app/ioc_extractor.py
# 2. 直接从数据库查询攻击者 IP
docker compose exec log_parser python3 - <<'EOF'
import sqlite3, json
conn = sqlite3.connect("/app/db/honeypot.db")
rows = conn.execute("""
SELECT src_ip, country, COUNT(*) as hits
FROM events GROUP BY src_ip ORDER BY hits DESC LIMIT 10
""").fetchall()
for r in rows: print(r)
EOF
# 3. 检查捕获的恶意软件
docker compose exec cowrie ls var/lib/cowrie/downloads/ 2>/dev/null || echo "No drops yet"
# 4. 导出 credential spray 列表
docker compose exec log_parser python3 - <<'EOF'
import sqlite3
conn = sqlite3.connect("/app/db/honeypot.db")
rows = conn.execute("""
SELECT username, password, COUNT(*) as n
FROM events WHERE event_type='AUTH_FAIL'
GROUP BY username, password ORDER BY n DESC LIMIT 20
""").fetchall()
print("USERNAME PASSWORD ATTEMPTS")
for r in rows: print(f"{r[0]:<18} {r[1]:<18} {r[2]}")
EOF
```
**交付物:** 包含攻击者 IP、恶意软件哈希、凭据对和可疑命令的 `ioc_report.txt` 和 `ioc_report.json`。
### 第 4 周 — 仪表板与地理位置分析
**目标:** 在世界地图上可视化攻击源,并对漏洞利用技术进行分类。
**任务:**
```
# 1. 打开 dashboard
xdg-open http://localhost:5000 # Linux
# 或在浏览器中打开 http://localhost:5000
# 2. 检查 geolocation 是否正常工作
curl "http://localhost:5000/api/map_data" | python3 -m json.tool | head -40
# 3. 获取国家/地区明细
curl "http://localhost:5000/api/country_stats" | python3 -m json.tool
# 4. 获取 timeline 数据
curl "http://localhost:5000/api/timeline" | python3 -m json.tool
# 5. 截图:map、timeline、top IPs、credential spray、command list
# 这些将放入你的最终报告中
# 6. 为 README 生成最终 IoC 报告
docker compose exec log_parser python3 /app/ioc_extractor.py \
--db /app/db/honeypot.db --out /app/db
docker cp log_parser:/app/db/ioc_report.txt ./docs/final_ioc_report.txt
```
**交付物:** 带有世界地图的正常运行仪表板,所有图表均已填充数据,最终的 IoC 报告已提交至代码库。
## 🔧 常用命令参考
```
# ── 启动 / 停止 ──────────────────────────────────────────────
docker compose up -d # Start all services
docker compose down # Stop all services
docker compose down -v # Stop + delete ALL data (fresh start)
docker compose restart cowrie # Restart just Cowrie
# ── 日志 ─────────────────────────────────────────────────────
docker compose logs -f cowrie # Live Cowrie SSH logs
docker compose logs -f log_parser # GeoIP enrichment progress
docker compose logs -f dashboard # Dashboard API logs
docker compose logs -f fake_panel # Web panel interaction logs
# ── 数据库查询 ──────────────────────────────────────────────────
# 在 parser 容器内打开 SQLite shell
docker compose exec log_parser python3 -c "
import sqlite3; conn = sqlite3.connect('/app/db/honeypot.db')
print(conn.execute('SELECT COUNT(*) FROM events').fetchone())
"
# ── Elasticsearch ─────────────────────────────────────────────
curl http://localhost:9200/_cat/indices?v # List all indices
curl http://localhost:9200/honeypot-events/_count # Event count
curl http://localhost:9200/honeypot-events/_search?size=1 | python3 -m json.tool
# ── Cowrie 管理 ─────────────────────────────────────────────────
# 查看捕获的文件/恶意软件
docker compose exec cowrie ls var/lib/cowrie/downloads/
# ── 网络隔离检查 ───────────────────────────────────────────
docker network ls
docker network inspect honeypot-project_honeypot_net
```
## 🔒 安全说明
| 规则 | 原因 |
|------|--------|
| 在 VM 或隔离的云实例中运行 | 防止攻击者访问你的真实系统 |
| 切勿将端口 9200(Elasticsearch)暴露到互联网 | 无身份验证 = 数据泄露 |
| 保持端口 5000(仪表板)仅限内部访问 | 仅限分析师查看 |
| 仅在外部暴露 2222、2223、8080 端口 | 这些是蜜罐诱捕端口 |
| 使用 `docker compose down -v` 清除捕获的恶意软件 | 分析完成后执行 |
| 本项目仅供**你自己的隔离网络使用** | 切勿针对你不拥有的系统 |
## 📊 仪表板功能
| 面板 | 描述 |
|-------|-------------|
| **统计卡片** | 事件总数、身份验证失败次数、独立 IP 数、国家/地区数、命令数、恶意软件投放数 |
| **世界地图** | Leaflet.js 地图,为每个攻击者 IP 带有圆形标记(大小由事件数量决定) |
| **攻击时间轴** | 48 小时的每小时事件量图表 |
| **实时信息流** | 最后 50 个事件,包含类型徽章、IP、位置、凭据/命令 |
| **热门攻击者 IP** | 按总命中数排名的条形图 |
| **热门凭据** | 尝试次数最多的用户名/密码对 |
| **热门命令** | 在虚假环境中最常执行的 Shell 命令 |
| **恶意软件哈希** | 所有捕获的文件投放的 SHA256 及 VirusTotal 链接 |
| **国家/地区统计** | 按来源国家/地区划分的攻击量 |
仪表板每 **15 秒** 自动刷新一次。
## 📚 技术栈
| 组件 | 技术 | 原因 |
|-----------|-----------|-----|
| SSH/Telnet 蜜罐 | [Cowrie](https://github.com/cowrie/cowrie) | 专为记录暴力破解 + Shell 交互而构建 |
| Web 蜜罐 | Python Flask | 轻量级,易于针对任何设备配置文件进行自定义 |
| 日志传送 | Filebeat | 经过实战考验的日志转发器,原生集成 ES |
| 搜索与存储 | Elasticsearch | 对攻击事件进行全文搜索 + 聚合 |
| GeoIP | ip-api.com | 提供免费的 IP 地理定位及 ISP 信息,无需 API 密钥 |
| 本地数据库 | SQLite | 零配置,适用于仪表板查询的快速响应 |
| 仪表板 | Flask + Chart.js + Leaflet | 纯 Web 实现,无需构建步骤 |
| 反向代理 | Nginx | 分析师工具的统一入口点 |
| 编排 | Docker Compose | 一键部署,强隔离性 |
## 📄 许可证
MIT 许可证 —— 仅限教育和授权的安全研究使用。
## 🤝 贡献 / 扩展
扩展建议:
- 添加 MQTT 蜜罐(端口 1883)以模拟医疗设备消息传递
- 集成 VirusTotal API 以自动查找恶意软件哈希
- 当新攻击者获取 Shell 访问权限时添加 Slack/电子邮件告警
- 与 MISP 集成以进行威胁情报共享
- 添加 DICOM 协议蜜罐(端口 11112)以模拟 PACS 系统
标签:CISA项目, 威胁情报, 安全, 开发者工具, 版权保护, 物联网, 蜜罐, 证书利用, 请求拦截, 超时处理, 逆向工具