Kousiksamanta1/Honeypot-Sentinel
GitHub: Kousiksamanta1/Honeypot-Sentinel
一个跨平台的轻量级网络蜜罐,模拟多种服务并配备实时可视化仪表盘,用于捕获、分析和画像恶意连接尝试。
Stars: 0 | Forks: 0
# Honeypot Sentinel
[](https://github.com/Kousiksamanta1/Honeypot-Sentinel/actions/workflows/ci.yml)
[](https://www.python.org/)
[](https://flask.palletsprojects.com/)
[](#license)
[](https://kousiksamanta1.github.io/PORTFOLIO/)
Honeypot Sentinel 是一个小巧的跨平台网络蜜罐,配备实时的 Web
仪表盘。它运行诱饵 SSH、HTTP、FTP 和 Telnet 服务,记录
客户端发送的内容,利用位置和信誉数据丰富公共 IP 地址的信息,
并为每个来源构建画像。
本项目适用于安全实验室、学习以及监控您拥有或明确授权的系统。
它不能替代生产环境的 IDS、防火墙或终端安全产品。
## 它能捕获的内容
- 来源 IP 地址、时间戳、服务和目标端口
- 提交给诱饵服务的用户名和密码
- HTTP 方法、路径、标头和 POST 正文
- FTP 命令、Telnet 凭据和原始 SSH 客户端输入
- 国家、地区、城市、时区、坐标、ISP 和组织
- 配置 API 密钥后的 AbuseIPDB 置信度分数
- 每个攻击者的首次出现、最后出现、总尝试次数和目标服务
## 仪表盘
仪表盘包含六个部分:
| 部分 | 显示内容 |
| --- | --- |
| 概览 | 总计、服务分布、每小时活动情况、国家和常见凭据 |
| 实时动态 | 最新捕获的事件,带有威胁等级高亮 |
| 攻击地图 | 在交互式 Leaflet 地图上对公共 IP 地址进行地理定位 |
| 位置 | 国家、地区、时区和城市的详细划分 |
| 攻击者画像 | 最活跃源地址的汇总历史记录 |
| 告警 | 超过尝试阈值或具有高滥用分数的来源 |
主仪表盘每 10 秒刷新一次。地图和位置数据每 30 秒刷新一次。
## 架构
```
Honeypot Sentinel
Network clients
|
+----------+----------+----------+----------+
| | | | |
v v v v |
SSH :2222 HTTP :8080 FTP :2121 Telnet :2323 |
| | | | |
+----------+----------+----------+----------+
|
v
+---------------------+
| Honeypot event logger|
+----------+----------+
|
+----------+-----------+
| |
v v
Rotating text log SQLite events table
|
v
Async enrichment queue
/ \
v v
ip-api.com AbuseIPDB v2
\ /
v v
Profile aggregation
|
v
SQLite attacker_profiles
|
v
Flask JSON API
|
v
Browser dashboard and maps
```
### 主要组件
```
main.py Starts listeners, Flask, and graceful shutdown
config.py Loads ports, bind addresses, paths, and API settings
honeypot/
ssh_listener.py Fake OpenSSH service
http_listener.py Fake Apache administrator login
ftp_listener.py Fake FTP authentication
telnet_listener.py Fake Ubuntu login prompt
logger.py Database writes, log rotation, enrichment queue
database/
models.py SQLite schema, queries, statistics, and profiles
enrichment/
geoip.py Cached and rate-limited ip-api.com lookups
abuseipdb.py Optional cached AbuseIPDB checks
profiler.py Attacker profile and alert-threshold updates
api/
routes.py Dashboard and JSON endpoints
dashboard/
templates/index.html Single-page dashboard
static/ CSS, charts, maps, and browser-side rendering
```
## 事件工作流
1. 客户端连接到四个诱饵端口之一。
2. 监听器发送一个逼真的标头或登录提示。
3. 来自客户端的输入将被捕获,并立即写入 SQLite 和滚动文本日志中。
4. 后台工作者在不阻塞监听器的情况下检查源 IP。
5. 使用 GeoIP 数据丰富公共地址。仅在配置了密钥时才会查询 AbuseIPDB。
6. 创建或更新攻击者画像。
7. 当源的滥用分数高于 50 或其总尝试次数超过配置的阈值时,将其标记。
8. Flask API endpoint 读取存储的数据,浏览器刷新仪表盘。
公共 GeoIP 服务无法对私有和环回地址进行地理定位。本地测试会出现在信息流中,但不会创建地图标记。
## 环境要求
- Python 3.9 或更新版本
- `pip`
- 需要互联网访问以获取 CDN 资产和丰富 IP 信息
- 需要获得在所选机器和网络上运行蜜罐的权限
在继续之前,请下载或克隆代码仓库。以下所有命令均假设终端已在项目根目录(即 `main.py` 和
`requirements.txt` 所在位置)中打开。
检查您的 Python 版本:
```
python3 --version
```
在 Windows 上:
```
py --version
```
## macOS 设置
### 1. 安装 Python
可以从 [python.org](https://www.python.org/downloads/) 安装 Python
或使用 Homebrew:
```
brew install python
```
### 2. 打开项目
```
cd /path/to/Honeypot-Sentinel
```
对于此工作区,路径为:
```
cd /Users/kousiksamanta/Documents/Honey-Sentinel
```
### 3. 创建并激活虚拟环境
```
python3 -m venv .venv
source .venv/bin/activate
```
### 4. 安装依赖项
```
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
```
### 5. 创建本地环境文件
```
cp -n .env.example .env
```
AbuseIPDB 密钥是可选的。仅在您拥有密钥时才编辑 `.env`。
### 6. 启动应用程序
```
python main.py
```
打开:
```
http://127.0.0.1:5000
```
macOS 可能已经将端口 `5000` 用于 AirPlay 接收器。在这种情况下:
```
FLASK_PORT=55000 python main.py
```
然后打开:
```
http://127.0.0.1:55000
```
使用 `Ctrl+C` 停止应用程序。
## Linux 设置
以下命令使用 Ubuntu 或 Debian。在 Fedora、
Arch 或其他发行版上,软件包名称可能有所不同。
### 1. 安装 Python 工具
```
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
```
### 2. 进入项目目录
```
cd /path/to/Honeypot-Sentinel
```
### 3. 创建环境并安装依赖项
```
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
```
### 4. 创建 `.env` 并启动
```
cp -n .env.example .env
python main.py
```
在同一台机器上打开 `http://127.0.0.1:5000`。
如果服务器没有桌面环境,请将仪表盘绑定到 `127.0.0.1` 并使用
SSH 隧道:
```
ssh -N -L 5000:127.0.0.1:5000 user@SERVER_IP
```
在隧道运行期间,在您自己的计算机上打开 `http://127.0.0.1:5000`。
## Windows 设置
从 [python.org](https://www.python.org/downloads/windows/) 安装 Python。
在安装过程中,选择 **Add Python to PATH**。
### PowerShell
```
cd C:\path\to\Honeypot-Sentinel
py -m venv .venv
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Copy-Item .env.example .env
python main.py
```
打开:
```
http://127.0.0.1:5000
```
如果端口 `5000` 被占用:
```
$env:FLASK_PORT = "55000"
python main.py
```
### 命令提示符
```
cd C:\path\to\Honeypot-Sentinel
py -m venv .venv
.venv\Scripts\activate.bat
python -m pip install -r requirements.txt
copy .env.example .env
python main.py
```
Windows Defender 防火墙可能会询问 Python 是否可以接受传入
连接。仅在您有意运行诱饵的网络配置文件上允许它。
## 配置
配置从 `.env` 加载。默认值为:
```
ABUSEIPDB_API_KEY=
HONEYPOT_HOST=0.0.0.0
FLASK_HOST=127.0.0.1
FLASK_PORT=5000
```
可以添加额外的端口变量:
```
SSH_PORT=2222
HTTP_PORT=8080
FTP_PORT=2121
TELNET_PORT=2323
```
| 设置 | 默认值 | 描述 |
| --- | --- | --- |
| `HONEYPOT_HOST` | `0.0.0.0` | 使四个诱饵监听器在网络接口上可用 |
| `FLASK_HOST` | `127.0.0.1` | 保持未经身份验证的仪表盘在本地运行 |
| `FLASK_PORT` | `5000` | 仪表盘端口 |
| `SSH_PORT` | `2222` | SSH 诱饵端口 |
| `HTTP_PORT` | `8080` | HTTP 诱饵端口 |
| `FTP_PORT` | `2121` | FTP 诱饵端口 |
| `TELNET_PORT` | `2323` | Telnet 诱饵端口 |
| `ABUSEIPDB_API_KEY` | 为空 | 启用 AbuseIPDB 信誉查询 |
当不需要信誉检查时,将 `ABUSEIPDB_API_KEY` 留空。切勿
在 `.env.example` 中放入真实密钥;仅将其存储在 `.env` 中,该文件已被
`.gitignore` 排除。
## 局域网访问
仪表盘默认情况下仅在本地运行。要在受信任的私有网络中从
另一台设备临时查看它,请设置:
```
FLASK_HOST=0.0.0.0
FLASK_PORT=55000
```
重启应用程序并找到该计算机的局域网 (LAN) 地址。
macOS:
```
ipconfig getifaddr en0
```
Linux:
```
hostname -I
```
Windows:
```
ipconfig
```
在第二台设备上打开 `http://LAN_IP:55000`。两台设备必须位于
允许设备间通信的网络上。访客、大学、酒店和
工作场所 Wi-Fi 通常会通过客户端隔离来阻止此类流量。
在进行任何公开部署之前,请将 `FLASK_HOST` 恢复为 `127.0.0.1`。
## 公共 VPS 部署
使用专用的 VPS,而不是暴露个人笔记本电脑或家庭网络。
主机不应包含个人数据或生产凭据。
在云防火墙和主机防火墙中允许以下入站 TCP 端口:
```
2222
8080
2121
2323
```
保持 `5000` 和 `55000` 端口不对公众开放。
Ubuntu 防火墙规则示例:
```
sudo ufw allow OpenSSH
sudo ufw allow 2222/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 2121/tcp
sudo ufw allow 2323/tcp
sudo ufw enable
sudo ufw status
```
为仪表盘使用 SSH 隧道:
```
ssh -N -L 5000:127.0.0.1:5000 user@VPS_PUBLIC_IP
```
诱饵端口将对互联网扫描器可见,而仪表盘
仅通过加密隧道保持可用。发现时间和流量
量无法保证。
## 数据和日志
| 路径 | 内容 |
| --- | --- |
| `database/events.db` | 事件和攻击者画像 |
| `honeypot-sentinel.log` | 滚动文本事件日志 |
| `.env` | 本地密钥和 runtime 配置 |
日志文件在达到 10 MB 时滚动并保留五个备份。SQLite 使用 WAL 模式以
支持并发的监听器和仪表盘请求。
要使用全新的数据库启动,请先停止应用程序然后删除:
```
rm -f database/events.db database/events.db-shm database/events.db-wal
```
PowerShell:
```
Remove-Item database\events.db* -ErrorAction SilentlyContinue
```
## 故障排除
### 仪表盘无法打开
- 确认 `main.py` 仍在运行。
- 使用终端中打印的确切地址。
- 如果端口 `5000` 被占用,请设置 `FLASK_PORT=55000`。
- 不要使用 `https://`;开发服务器使用 HTTP。
### 另一台设备无法连接
- 设置 `FLASK_HOST=0.0.0.0` 并重启。
- 确认两台设备都位于同一受信任的网络上。
- 允许 Python 通过操作系统防火墙。
- 暂时禁用 VPN。
- 检查 Wi-Fi 是否使用了访客或客户端隔离。
### 地图为空
- 本地地址(例如 `127.0.0.1`、`10.x.x.x` 和 `192.168.x.x`)没有
公共 GeoIP 结果。
- 等待公共事件后的异步丰富。
- 确认浏览器可以访问 Leaflet 和 CARTO CDN 资源。
### 滥用分数始终为零
- 本项目在不使用 AbuseIPDB 的情况下运行。
- 将有效密钥添加到 `.env`,然后重启。
- 私有 IP 地址通常没有公共 AbuseIPDB 结果。
### 蜜罐端口已被占用
在 `.env` 中更改其端口,例如:
```
HTTP_PORT=18080
```
## 安全说明
- 仪表盘没有身份验证。切勿将其直接暴露给公共
互联网。
- 不要在包含敏感数据的机器上运行此项目。
- 将公共部署置于隔离的 VPS 或网络段中。
- 保持操作系统已修补最新补丁,并限制管理 SSH 访问。
- 将捕获的凭据和源信息视为敏感数据。
- 切勿重复使用捕获的凭据或与攻击者系统进行交互。
## 技术
| 领域 | 技术 |
| --- | --- |
| Runtime | Python |
| 网络服务 | `socket`, `threading` |
| Web API | Flask, Flask-CORS |
| 存储 | SQLite |
| 配置 | python-dotenv |
| 丰富 | requests, ip-api.com, AbuseIPDB |
| 地图 | Leaflet, CARTO, OpenStreetMap fallback |
| 图表 | Chart.js |
| 前端 | HTML, CSS, vanilla JavaScript |
## 贡献
使用合成数据和隔离的实验室环境进行测试和截图。
在提出更改建议之前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 安全
请勿在 issue 中披露捕获的凭据、公共 IP 遥测数据或部署细节。
请遵循 [SECURITY.md](SECURITY.md) 获取私下报告的指南。
## 法律免责声明
仅在您拥有或获得明确监控权限的系统
和网络上运行 Honeypot Sentinel。捕获网络流量、
凭据或源信息可能在您所在的司法管辖区受到法律监管。您需对
访问控制、通知、保留、隐私和所有其他法律义务承担责任。
作者和贡献者对任何误用或损坏不承担任何责任。
## 许可证
MIT。详见 [LICENSE](LICENSE)。
标签:Flask, Python, SQLite, 威胁情报, 开发者工具, 无后门, 网络安全, 蜜罐, 证书利用, 逆向工具, 隐私保护