一款中交互多协议蜜罐,静默凝视每一次针对服务器的暴力破解与入侵行为
551
一款 中交互 多协议蜜罐,静默凝视每一次针对服务器的暴力破解与入侵行为。
基于 Apache MINA SSHD 实现 SSH 协议,原生 Socket 实现 Telnet 协议, 内置伪装的 Ubuntu 22.04 虚拟文件系统与伪 Shell, 支持 SSH / Telnet / MySQL / PostgreSQL / Redis 多协议诱捕, 并内置 Web 可视化控制台与攻击归属地分析。
⚠️ 仅用于安全研究与授权环境。蜜罐会吸引真实攻击者,请务必在隔离的 测试/专用机器上运行,不要部署在存有敏感数据的生产服务器上。
https://github.com/AbnerSC/ssh-honeypot-j.git
本项目主要是用于研究学习,欢迎star和fork。
OpenSSH_8.9p1 Ubuntu,任意账号密码均可"登录成功",凭证全部记录login: 流程,含 IAC 终端协商ls cd cat pwd echo whoami id uname ps w df free
ifconfig netstat wget curl touch mkdir rm history su sudo apt 等;、&&、管道(取首命令)、> / >> 重定向(写入虚拟文件系统)/etc/passwd、/etc/shadow、/root/.my.cnf、
/root/.bash_history 等,攻击者的增删改只发生在内存中logs/honeypot.jsonl)与 SQLite(db/database.db)双写,
记录来源 IP、登录凭证、每条命令、恶意下载 URL、会话时长,可直接对接 ELK / jq 分析ssh user@host "cmd" 形式的非交互攻击| 类别 | 技术 | 版本 | 用途 |
|---|---|---|---|
| 语言 / 运行时 | Java | 25 | 开发语言,启用紧凑对象头(JEP 519)等运行时优化 |
| SSH 协议 | Apache MINA SSHD | 2.19.0 | 实现 SSH 服务端与协议交互 |
| Telnet 协议 | 原生 Socket | - | 实现 Telnet 协议与 IAC 终端协商 |
| Web 控制台 | Javalin(Jetty 12) | 7.2.3 | 轻量嵌入式 Web 框架,承载管理 API 与静态前端 |
| 前端图表 | ECharts(WebJar) | 6.1.0 | 攻击统计图表,随 fat-jar 打包离线可用 |
| JSON | Gson | 2.14.0 | 接口 JSON 序列化 / 反序列化 |
| 配置解析 | SnakeYAML | 2.6 | 解析 config.yaml 配置文件 |
| 存储 | SQLite(sqlite-jdbc) | 3.53.2.1 | 攻击事件与系统用户结构化存储(WAL 模式) |
| IP 归属地 | ip2region | 3.3.7 | 离线 xdb 库解析来源 IP 归属地(IPv4 / IPv6 双库) |
| 日志 | SLF4J + JDK14 | 2.0.18 | 运行日志门面与输出 |
| 构建打包 | Maven Shade Plugin | 3.5.3 | 生成含全部依赖的可执行 fat-jar |
| 容器化 | Docker / docker-maven-plugin | 0.49.0 | 基于 eclipse-temurin:25-jdk-noble 构建镜像,mvn deploy 推送 |
| CI/CD | GitHub Actions | - | 多架构镜像自动构建与发布 |
# 需要 JDK 25+
mvn package
# 产物:target/ssh-honeypot-j.jar(含全部依赖的可执行 jar)
java -jar target/ssh-honeypot-j.jar # 使用默认 config.yaml
java -jar target/ssh-honeypot-j.jar -c /etc/honeypot.yaml # 指定配置文件
生产环境建议叠加 JDK 25 运行时优化参数(紧凑对象头,减少海量会话对象内存占用):
java -XX:+UseCompactObjectHeaders -jar target/ssh-honeypot-j.jar
ssh:
enabled: true # 是否启用 SSH 服务
port: 2222 # SSH 监听端口
telnet:
enabled: true # 是否启用 Telnet 服务
port: 2323 # Telnet 监听端口
# 数据库蜜罐:连接时立即返回默认的认证失败信息并断开连接,不做任何协议交互
mysql:
enabled: true # 是否启用 MySQL 蜜罐(模拟 8.4,连接即返回 Access denied 1045/28000)
port: 3306 # MySQL 监听端口
postgresql:
enabled: true # 是否启用 PostgreSQL 蜜罐(模拟 17,连接即返回 FATAL 28P01 认证失败)
port: 5432 # PostgreSQL 监听端口
redis:
enabled: true # 是否启用 Redis 蜜罐(模拟 7,连接即返回 WRONGPASS)
port: 6379 # Redis 监听端口
log:
file: logs/honeypot.jsonl # 攻击日志文件路径
db: db/database.db # SQLite 数据库文件(与 JSONL 双写同一份数据,供 Web 可视化)
ipdb_v4: db/ip2region_v4.xdb # IP 归属地离线库文件(ip2region xdb 格式 ipv4),解析来源 IP 为“国家 省份 城市”;
ipdb_v6: db/ip2region_v6.xdb # IP 归属地离线库文件(ip2region xdb 格式 ipv6),解析来源 IP 为“国家 省份 城市”;
# 可选覆盖项:文件缺失时自动回退使用 jar 内置库(已随包打包),均缺失时归属地留空,不影响其他功能
# 大模型命令仿真(默认关闭):伪 Shell 未覆盖的未知命令交给大模型生成仿真输出,
# 未启用或服务不可用(超时/限流/熔断)时自动降级本地 "-bash: xxx: command not found";
# 支持环境变量覆盖(AI_ENABLED / AI_BASE_URL / AI_API_KEY / AI_MODEL_NAME 等,见 Docker 部署一节)
ai:
enabled: false # 是否启用大模型命令仿真(false 时未知命令完全走本地 command not found)
base_url: "" # 大模型服务地址(OpenAI 兼容接口,自动补全 /v1 后缀)
api_key: "" # 大模型服务 API 密钥(本地无鉴权服务可留空)
model_name: "" # 大模型服务模型名称
timeout_seconds: 20 # 单次请求超时(秒),超时立即降级本地 command not found
max_concurrent: 1 # 全局并发请求上限,超出立即降级不排队
# Web 可视化控制台:攻击日志统计与明细查询、系统用户管理(与蜜罐同进程部署)
# 首次启动自动创建默认管理员 admin/admin123,登录后强制修改密码
web:
enabled: true # 是否启用 Web 控制台
port: 8080 # Web 监听端口
sessionTimeoutMinutes: 30 # 管理端登录会话超时(分钟)
配置文件不存在时使用内置默认值(SSH:2222、Telnet:2323、日志 logs/honeypot.jsonl、Web:8080)。
ai 段支持环境变量覆盖,优先级:环境变量(AI_*)> 配置文件 > 内置默认值,变量清单见 Docker 部署一节。
auth.credentials 支持两种写法,命中其中任意一个密码即视为登录成功:
auth:
maxFailures: 3
windowMinutes: 5
lockMinutes: 30
credentials:
root: ["123456", "toor", "password", "root123"] # 一个账号多个密码
admin: ["admin123", "admin"] # 列表形式多密码
ubuntu: "ubuntu" # 兼容单字符串写法
也支持在配置文件中不写
credentials,此时使用内置默认弱口令本。
注意先把真实 sshd 移到别的端口,避免把自己锁在门外。
与蜜罐同进程部署,前端页面与接口随 fat-jar 一起打包,无需额外服务。启动后访问
http://<主机IP>:8080/ 即可。
功能:
登录与安全:
admin/admin123,登录后强制修改密码admin(全部权限)与 viewer(仅查看日志统计与明细)建议:8080 端口仅对运维网段开放,不要将管理控制台直接暴露到公网。
镜像基于 JDK 25 运行时构建,开箱即用。
创建 docker-compose.yml,将日志目录挂载到宿主机,并映射 SSH(2222) 与 Telnet(2323) 端口:
services:
ssh-honeypot-j:
image: babyfly/ssh-honeypot-j:latest
# 阿里云:crpi-gbejqvtf2wfon7bh.cn-chengdu.personal.cr.aliyuncs.com/scdm/ssh-honeypot-j:latest
container_name: ssh-honeypot-j
restart: unless-stopped
volumes:
- ${PWD}/logs:/app/logs # 挂载宿主机日志目录
- ${PWD}/db:/app/db # 挂载宿主机数据库目录
environment:
- TZ=Asia/Shanghai # 时区,北京时间
# AI 大模型命令仿真(默认关闭;启用需改 AI_ENABLED=true 并补全 BASE_URL/MODEL_NAME,详见下文说明)
- AI_ENABLED=false # 是否启用大模型命令仿真
- AI_BASE_URL= # OpenAI 兼容接口地址,如 http://172.16.10.112:8000/v1
- AI_API_KEY= # API 密钥,本地无鉴权服务(vLLM/Ollama 等)可留空
- AI_MODEL_NAME= # 模型名称,如 qwen3.5-2b
ports:
- 22:2222 # SSH端口
- 23:2323 # Telnet端口
- 3306:3306 # MySQL数据库端口
- 5432:5432 # Postgre数据库端口
- 6379:6379 # Redis数据库端口
- 127.0.0.1:11800:8080 # Web控制台端口,建议使用nginx代理为https
cpus: 0.5 # CPU上限,防止占满宿主机
mem_limit: 300m # 内存限制,被持续攻击大约需要240MB
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8080"]
interval: 10s
timeout: 3s
retries: 3
start_period: 20s
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "10"
security_opt:
- no-new-privileges:true # 阻止容器内提权
启动:
mkdir logs db
docker compose up -d
${PWD}/logs 为宿主机日志目录,攻击日志实时写入 ./logs/honeypot.jsonl
${PWD}/db 持久化 SQLite 数据库(攻击日志与系统用户),重建容器不丢数据。还可以自己更新IP库,文件名:ip2region_v4.xdb、ip2region_v6.xdb,下载地址:https://github.com/lionsoul2014/ip2region
mem_limit: 512m 限制容器内存,避免海量会话拖垮宿主机
蜜罐服务端口(3306/5432/6379)同样在容器内监听,需要诱捕数据库端口时自行追加映射
如需自定义配置,可将 config.yaml 一并挂载,如:${PWD}/config.yaml:/app/config.yaml
volumes:
- ${PWD}/logs:/app/logs
- ${PWD}/db:/app/db
- ${PWD}/config.yaml:/app/config.yaml
默认关闭(ai.enabled=false),未配置大模型服务时开箱即用,未知命令一律返回本地 command not found。
启用后伪 Shell 未覆盖的未知命令(如 ./malware、nmap 等)交给大模型生成仿真终端输出;
服务不可用(超时/限流/熔断)时自动降级本地 command not found,不影响蜜罐其他功能。
无需挂载配置文件,直接在 compose 的 environment 中配置,优先级:环境变量 > 挂载的 config.yaml > 镜像内置配置:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
AI_ENABLED | false | 是否启用大模型命令仿真 |
AI_BASE_URL | 空 | OpenAI 兼容接口地址(自动补全 /v1 后缀),如 http://172.16.10.200:8000/v1 |
AI_API_KEY | 空 | API 密钥;本地无鉴权服务(vLLM/Ollama 等)可留空 |
AI_MODEL_NAME | 空 | 模型名称,如 qwen3.5-2b |
AI_ENABLE_THINKING | false | 思考模式开关(混合推理模型经 chat_template_kwargs 透传),开启后建议调大超时 |
AI_TIMEOUT_SECONDS | 20 | 单次请求超时(秒),超时立即降级本地 command not found |
AI_MAX_OUTPUT_CHARS | 8192 | 单条输出最大字符数,超长截断 |
AI_MAX_CONCURRENT | 1 | 全局并发请求上限,超出立即降级不排队 |
AI_FAILURE_THRESHOLD | 3 | 连续失败达到该次数后触发熔断 |
AI_COOLDOWN_SECONDS | 300 | 熔断时长(秒),期间不再请求大模型 |
启用前提:AI_ENABLED=true 且 AI_BASE_URL、AI_MODEL_NAME 非空,否则自动视为未启用。
命令路由规则(优先级从高到低):
- 本地专门仿真:
ls、cat、systemctl、docker ps、apt、ifconfig等约两百个常见命令走本地硬编码响应,不消耗大模型请求;- 版本查询本地常量:
node -v、git --version、mvn -v、gcc --version、python3 --version等开发工具版本命令返回FakeEnv常量,与大模型提示词同源,交叉验证不穿帮;- AI 仿真 + 空串回退:
docker pull、npm install、make、rsync、sed等已安装但本地无专门仿真的命令,优先交大模型生成真实输出,AI 不可用时回退空串(此类命令成功时多数本就无输出);- AI 仿真 + not found 回退:完全未知的命令(如
./malware、nmap)交大模型仿真,AI 不可用时回退本地command not found。环境人设统一:蜜罐伪装为一台全栈开发者的 Ubuntu 22.04 服务器,开发工具链齐备 (docker/docker-compose/node/npm/go/rust/maven/gradle/php/composer/ruby/python 等); 渗透测试类工具(nmap/hydra/sqlmap/tcpdump 等)未安装,大模型对其如实回
command not found。 所有环境硬事实(硬件/网络/用户/软件版本)集中定义在org.open.scdm.honeypot.env.FakeEnv, 本地命令输出与大模型 systemPrompt 同源引用,攻击者用任意命令交叉验证均口径一致。验证 AI 是否生效可看容器启动日志:环境变量覆盖与「AI 命令仿真已启用」均有输出。
登录:
地址:http://127.0.0.1:8080
账号:admin
密码:admin123
ssh -p 2222 [email protected]
telnet 127.0.0.1 2323
ssh -p 2222 [email protected] "uname -a; cat /etc/passwd"
db/database.db)/home/<user>cd 增加权限校验,越权访问被拒绝docker-maven-plugin,支持 mvn deploy 构建并推送镜像到 Nexuslatest 标签config.yaml 配置文件,可自定义端口、日志路径、账号密码本Content type
Image
Digest
sha256:dd75f1089…
Size
177.1 MB
Last updated
12 days ago
docker pull babyfly/ssh-honeypot-j