SeanCrimi-007/honeypot-dashboard

GitHub: SeanCrimi-007/honeypot-dashboard

基于 Cowrie 蜜罐的实时 Web 可视化仪表盘,通过 FastAPI 后端与 Chart.js 前端将 SSH 攻击日志转化为地理分布、凭据分析与会话下钻等 SOC 风格的威胁情报视图。

Stars: 0 | Forks: 0

# Cowrie 蜜罐仪表盘 一个实时 Web 仪表盘,用于可视化由 [Cowrie](https://github.com/cowrie/cowrie) 捕获的 SSH 蜜罐攻击数据。该项目作为网络安全作品集构建——部署蜜罐,将其日志导入 SQLite,并以暗色主题的 SOC 风格仪表盘呈现攻击数据。 ## 你将看到的内容 - **攻击地图** —— 根据攻击量调整标记大小,展示源 IP 的世界地图 - **时间轴图表** —— 可选时间窗口(7 天 / 30 天 / 全部时间)内的每日攻击次数 - **Top 源 IP** —— 包含国旗、组织/ASN 以及攻击次数 - **会话下钻** —— 点击任意攻击者 IP 查看其会话,他们尝试的每一个 凭据,以及登录后运行的每一条命令 - **凭据分析** —— 尝试次数最多的用户名、密码以及用户名:密码组合 - **攻击者命令** —— 成功获取 shell 的攻击者输入的 shell 命令 - **统计卡片** —— 总攻击数、独立 IP 数、会话数、主要攻击国家 - **样本数据徽章** —— 当 数据库由演示生成器填充时,标题胶囊会如实显示 *Sample Data*,否则显示 *Live* ## 架构 ``` ┌──────────────────┐ ┌────────────────┐ ┌──────────┐ ┌───────────┐ ┌─────────────────┐ │ Cowrie SSH │────▶│ ingest.py │────▶│ SQLite │────▶│ app.py │────▶│ Dashboard │ │ Honeypot │ │ JSON parser │ │ 4 tables│ │ FastAPI │ │ Chart.js │ │ port 2222 │ │ + ip-api.com │ │ │ │ JSON API │ │ Leaflet │ └──────────────────┘ └────────────────┘ └──────────┘ └───────────┘ └─────────────────┘ cowrie.json geo cache ``` **技术栈:** Python 3 · FastAPI · SQLite · 原生 HTML/CSS/JS · Chart.js · Leaflet 没有构建步骤,没有 Node.js,没有 React。每个文件都具备极高的可读性。 ## 为什么做这个项目 我构建这个项目是为了展示端到端的 SOC 分析师技能: - **威胁情报收集** —— 运营生产级蜜罐并捕获真实攻击数据 - **日志摄取 pipeline** —— 解析结构化日志,使用地理/ASN 数据进行丰富,实现幂等处理 - **数据分析** —— 揭示撞库活动、攻击者工具和地理来源中的规律 - **安全的 Web 应用** —— 参数化 SQL、防 XSS 渲染、仅限 localhost 绑定 它产生的数据集正是分析师在早期分流中会看到的内容:谁在尝试连接、他们在试探什么,以及他们进入后会做什么。 ## 前置条件 - Ubuntu / Debian Linux - Python 3.10+ - `python3-venv`、`libssl-dev`、`libffi-dev`(使用 `sudo apt-get install -y python3-venv libssl-dev libffi-dev` 一次性安装) - Cowrie(参见下方的[部署 Cowrie](#deploy-cowrie))**或者**使用带有合成数据的 `--demo` 模式 ## 快速开始(演示模式) 演示模式会加载合成数据,让你无需部署蜜罐即可立即查看仪表盘。 ``` git clone cd honeypot-dashboard python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ./run.sh --demo # 打开 http://127.0.0.1:8000 ``` ## 部署 Cowrie ``` # 系统 deps sudo apt-get install -y git python3-venv libssl-dev libffi-dev # 克隆并安装 git clone https://github.com/cowrie/cowrie ~/cowrie cd ~/cowrie python3 -m venv cowrie-env source cowrie-env/bin/activate pip install -r requirements.txt pip install -e . # Config(默认监听 2222 端口并写入 JSON 日志) cp src/cowrie/data/etc/cowrie.cfg.dist etc/cowrie.cfg # 启动 cowrie start cowrie status # Log: ~/cowrie/var/log/cowrie/cowrie.json ``` 重定向真实端口 22 的流量(在 VPS 上,而不是你的主力机器上): ``` sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222 ``` ## 运行仪表盘 ``` cd honeypot-dashboard source .venv/bin/activate # One-shot:导入新日志行后退出 python ingest.py # Live mode:跟随 Cowrie 日志 + 提供 dashboard ./run.sh # 自定义日志路径 ./run.sh /path/to/cowrie.json ``` 仪表盘默认绑定到 `127.0.0.1:8000`。在添加身份验证之前,**切勿将其暴露到互联网**——它会显示真实的攻击者 IP 数据。 ## 摄取详情 `ingest.py` 是幂等、可恢复且防崩溃的: - 在数据库中跟踪每个日志文件的字节偏移量——重复运行始终安全 - 检测日志轮转(文件缩小)并从开头重新开始处理 - 格式错误的行和无法处理的事件(例如轮转后 孤立的会话引用)会被计数并跳过——它们绝不会导致 pipeline 崩溃 - 新 IP 会通过 [ip-api.com](https://ip-api.com) 进行地理丰富(免费,无需密钥,限制 45 次请求/分钟)并缓存——每个 IP 仅查询一次,因此仪表盘本身可以完全离线工作 - 将 `ingest.py` 中的 `GEO_LOOKUP` 替换为使用 MaxMind GeoLite2 或其他提供商 ## 项目结构 ``` honeypot-dashboard/ ├── app.py # FastAPI backend (10 JSON endpoints) ├── ingest.py # Log ingestion pipeline ├── schema.sql # SQLite schema (4 data tables + state/meta tables) ├── run.sh # Start ingestion + API together ├── requirements.txt ├── requirements-dev.txt# + pytest, httpx (for the test suite) ├── .gitignore # Excludes honeypot.db and cowrie.json (real attack data) ├── static/ │ └── index.html # Single-page dashboard (Chart.js + Leaflet) ├── sample_data/ │ └── generate.py # Synthetic data generator for demos └── tests/ ├── conftest.py # Seeded temp-DB fixtures (never touches real data or network) ├── test_ingest.py # Parsing robustness, idempotency, rotation, geo cache └── test_api.py # Every API endpoint, exact-count assertions ``` ## 运行测试 ``` source .venv/bin/activate pip install -r requirements-dev.txt pytest ``` 该测试套件(33 个测试)涵盖了日志解析的鲁棒性(格式错误的行、日志轮转后 孤立的事件)、摄取幂等性,以及针对固定合成数据集且带有精确计数断言的每个 API endpoint。测试使用了 临时数据库和存根地理位置查询——它们绝不会触碰真实数据或 网络。 ## 截图 ![仪表盘概览](https://raw.githubusercontent.com/SeanCrimi-007/honeypot-dashboard/main/screenshots/overview.png) ![攻击地图](https://raw.githubusercontent.com/SeanCrimi-007/honeypot-dashboard/main/screenshots/map.png) ![会话下钻](https://raw.githubusercontent.com/SeanCrimi-007/honeypot-dashboard/main/screenshots/drilldown.png) ## 我学到了什么 - **蜜罐数据无比真实。** 在暴露 Cowrie 的几小时内, 撞库机器人就开始疯狂使用 `root`/`123456` 轰炸它,并投放 挖矿程序安装脚本。阅读真实的攻击者命令序列让我对 漏洞利用后的行为有了比任何分析文章都更深刻的了解。 - **将攻击者输入视为具有放射性的危险品,进行端到端处理。** 这个系统中的每一串 数据——用户名、密码、shell 命令——都受攻击者控制。这 影响了具体的决策:到处使用参数化 SQL,在前端使用 `textContent` 而不是 `innerHTML`,并且绝不执行捕获的数据或将其传递给 shell。 - **摄取 pipeline 的失败往往平淡无奇。** 我遇到的 bug 并不罕见: 日志轮转导致字节偏移量失效、孤立的事件引用了被 轮转删除的文件中的会话、格式错误的 JSON 行。让 pipeline 具备幂等性 和防崩溃能力比任何功能都更重要。 - **测试是我能够重构的基础。** 有了针对 固定合成数据集的精确计数断言,我就可以修复 SQL 中的时间窗口 bug,并且 立刻确信没有破坏其他任何东西。 ## 安全提示 - **切勿执行攻击者命令。** `commands` 表包含攻击者输入的字面 shell 内容。其存储目的仅用于分析。 - **XSS 预防。** 所有受攻击者控制的字符串(用户名、密码、命令)都通过 `textContent` 渲染,绝不使用 `innerHTML`。 - **仅使用参数化 SQL。** 任何地方都没有使用字符串拼接的查询。 - **Localhost 绑定。** 仪表盘默认绑定到 `127.0.0.1`。在远程暴露之前,请添加带有身份验证(nginx + 基本身份验证,或 Caddy)的反向代理。 - **Gitignore 的数据。** `honeypot.db` 和 `cowrie.json` 被排除在版本控制之外——它们包含真实的攻击者 IP 和捕获的凭据。 ## 后续工作 - **MITRE ATT&CK 映射** —— 将捕获的命令分类到技术 ID,并显示频率热图 - **AbuseIPDB 丰富** —— 获取攻击者 IP 的信誉评分 - **峰值告警** —— 检测异常攻击量并发出通知 - **PDF/CSV 威胁报告** —— 针对给定时间窗口的可导出摘要 ## 许可证 MIT。本项目仅用于防御性研究和教育目的。
标签:AV绕过, FastAPI, SQLite, 威胁情报, 安全运营, 开发者工具, 扫描框架, 蜜罐技术