liubaicai/sshd-ai-honeypot

GitHub: liubaicai/sshd-ai-honeypot

一个由 AI 驱动的高交互 SSH 蜜罐,能够模拟真实 Linux 环境并智能响应未知命令,用于捕获和分析攻击行为。

Stars: 0 | Forks: 0

# 🍯 SSH AI Honeypot **一个由 AI 驱动的高交互 SSH 蜜罐,用于捕获与分析真实攻击行为** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Node.js](https://img.shields.io/badge/Node.js-≥18-339933?logo=node.js&logoColor=white)](https://nodejs.org/) [![OpenAI Compatible](https://img.shields.io/badge/AI-OpenAI%20Compatible-412991?logo=openai&logoColor=white)](https://platform.openai.com/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED?logo=docker&logoColor=white)](https://www.docker.com/) [![SSH2](https://img.shields.io/badge/SSH-Protocol-4A154B)](https://github.com/mscdex/ssh2) [快速开始](#-快速开始) · [配置说明](#-配置说明) · [Docker 部署](#-docker-部署) · [日志设计](#-日志设计) · [命令模拟](#-命令与文件系统模拟) 中文 | **[English](README_EN.md)**
## ✨ 特性 | 特性 | 说明 | |------|------| | 🤖 **AI 驱动响应** | 接入 OpenAI / 任意兼容接口,对未知命令生成逼真的终端输出 | | 🐚 **真实 SSH 交互** | 基于 `ssh2` 实现完整 SSH 协议,支持 shell / exec / sftp / scp | | 🗂️ **会话隔离文件系统** | 每个 SSH 会话拥有独立虚拟目录树,攻击者之间完全隔离 | | 📋 **结构化日志** | 全量 JSON 事件日志 + 单会话时间线,开箱即用 | | 🔄 **自动降级** | AI 不可用时无缝切换为本地命令模拟,交互不中断 | | ⚡ **响应缓存** | 相同请求命中 LRU 缓存,减少 AI API 调用延迟 | | 🐳 **Docker 一键部署** | 内置 Ollama,本地大模型开箱即用 | ## 📐 架构概览 ``` 攻击者 SSH 客户端 │ ▼ ┌─────────────────────────────────────────────┐ │ SSH Server (server.js) │ │ 认证(全接受) · Shell · Exec · SFTP │ └──────────────┬──────────────────────────────┘ │ ┌───────▼────────┐ │ Command Handler │ ← command-handler.js │ (命令解析路由) │ └───┬──────┬─────┘ │ │ ┌──────▼──┐ ┌▼──────────────┐ │ Builtin │ │ AI Service │ ← ai-service.js │ 本地模拟 │ │ OpenAI SDK │ └──────┬──┘ └──────┬────────┘ │ │ ┌──────▼────────────▼────┐ │ Virtual FileSystem │ ← filesystem.js │ (会话独立目录树) │ └───────────┬────────────┘ │ ┌──────▼──────┐ │ Logger │ ← logger.js │ JSON · 轮转 │ └─────────────┘ ``` ## 🚀 快速开始 ### 前置要求 - Node.js ≥ 18 - pnpm(推荐)或 npm ### 安装 ``` # 克隆仓库 git clone https://github.com/your-username/sshd-ai-honeypot.git cd sshd-ai-honeypot # 安装依赖 pnpm install # 复制配置文件 cp config.example.json config.json ``` ### 配置 API Key 编辑 `config.json`,填入你的 AI 接口信息: ``` { "ai": { "host": "https://api.openai.com/v1", "apiKey": "sk-xxxxxxxx", "model": "gpt-4o-mini" } } ``` ### 启动服务 ``` # 生产模式 pnpm start # 开发模式(热重载) pnpm dev ``` ### 测试连接 ``` ssh test@127.0.0.1 -p 22 # 任意用户名 / 密码均可登录(蜜罐模式) ``` ### 单文件打包部署(可选) 如需将源码与所有依赖打包为单个 JS 文件,方便拷贝到服务器部署: ``` # 构建(输出到 dist/bundle.js,约 1.7MB) pnpm build ``` `config.example.json` 和 `vfs.template.json` 的内容已**内嵌**到 bundle 中作为默认值。 | 部署文件 | 是否必须 | 说明 | |----------|----------|------| | `dist/bundle.js` | ✅ 必须 | 含全部依赖和内嵌默认值 | | `config.json` | 可选 | 存在时覆盖内嵌默认配置 | | `vfs.template.json` | 可选 | 存在时覆盖内嵌默认文件系统模板 | ``` # 在目标服务器上直接运行(无需 node_modules) node bundle.js ``` ## ⚙️ 配置说明 配置文件位于 `config.json`(从 `config.example.json` 复制),各字段说明如下: ``` { "ssh": { "port": 22, // 监听端口 "host": "0.0.0.0" // 监听地址 }, "ai": { "enabled": true, // 是否启用 AI "pureMode": false, // true = 所有命令均走 AI(跳过本地模拟) "host": "https://api.openai.com/v1", // OpenAI 或兼容接口地址 "apiKey": "sk-xxx", // API Key "model": "gpt-4o-mini", // 模型名称 "maxTokens": 300, // 单次最大 token 数 "temperature": 0.3, // 生成温度 "timeoutMs": 30000, // 请求超时(毫秒) "historyTurns": 12, // 携带的上下文轮数 "requestRetries": 2, // 失败重试次数 "retryDelayMs": 1200, // 重试间隔(毫秒) "cacheEnabled": true, // 启用响应缓存 "cacheSize": 100 // 缓存条目上限 }, "logging": { "level": "info", // 日志级别 "directory": "./logs", // 日志目录 "maxFiles": "30d", // 保留天数 "maxSize": "20m", // 单文件大小上限 "maxResponseLength": 2000, // 响应截断长度 "storePasswords": true // 是否记录攻击者密码 }, "vfs": { "templateFile": "./vfs.template.json" // 虚拟文件系统模板 } } ``` ### 环境变量(优先级高于 config.json) | 变量名 | 别名 | 说明 | |--------|------|------| | `HONEYPOT_AI_ENABLED` | `AI_ENABLED` | 是否启用 AI | | `HONEYPOT_AI_PURE_MODE` | `AI_PURE_MODE` | 是否开启纯 AI 模式 | | `HONEYPOT_AI_HOST` | `AI_HOST` | AI 接口地址 | | `HONEYPOT_AI_API_KEY` | `AI_API_KEY` | API Key | | `HONEYPOT_AI_MODEL` | `AI_MODEL` | 模型名称 | ## 🐳 Docker 部署 项目内置 Dockerfile,集成 [Ollama](https://ollama.com/) 本地大模型,**无需外部 API Key** 即可运行。 ``` # 构建镜像(含模型预下载,约需几分钟) docker build -t ssh-honeypot . # 启动容器 docker run -d \ --name ssh-honeypot \ -p 2222:22 \ -v $(pwd)/logs:/app/logs \ ssh-honeypot ``` 镜像默认使用 `Qwen2.5-1.5B` 量化模型,可通过 `OLLAMA_MODEL` 环境变量替换: ``` docker run -d -p 2222:22 \ -e OLLAMA_MODEL=qwen2.5:3b \ ssh-honeypot ``` 健康检查:容器同时检测 Ollama(`:11434`)和 SSH(`:22`)就绪状态。 ## 📊 日志设计 日志目录默认 `./logs`,按天自动轮转: ``` logs/ ├── honeypot-YYYY-MM-DD.log # 全量事件(JSON 格式) ├── connections-YYYY-MM-DD.log # 连接生命周期事件 ├── commands-YYYY-MM-DD.log # 交互事件(输入/命令/输出/AI) └── sessions/ └── session-.json # 单会话完整时间线 ``` ### 事件类型 | 事件 | 说明 | |------|------| | `connection` | 新连接建立,含来源 IP / 端口 | | `authentication` | 登录尝试,含用户名 / 密码(可配置) | | `input` | 攻击者原始键盘输入 | | `command` | 解析后的命令及参数 | | `output` | 命令响应内容 | | `filesystem` | 文件系统操作(读/写/删除) | | `ai` | AI 调用元数据(模型/延迟/token/缓存命中) | | `disconnection` | 断开连接,含会话时长 | ## 🖥️ 命令与文件系统模拟 ### 内置命令
基础工具(点击展开) `whoami` `id` `hostname` `date` `uptime` `uname` `echo` `printf` `history` `env` `groups` `which`
文件系统(点击展开) `pwd` `ls` `ll` `cd` `cat` `touch` `mkdir` `rm` `cp` `mv` `find` `head` `tail` `wc` `grep` `chmod` `chown`
网络 & 系统(点击展开) `ps` `top` `netstat` `ss` `ifconfig` `ip` `route` `ping` `nslookup` `dig` `traceroute` `df` `free` `mount` `dmesg` `iptables` `ufw` `who` `w` `last` `lsb_release` `lsblk` `lscpu` `hostnamectl` `timedatectl`
服务 & 高级工具(点击展开) `crontab` `journalctl` `service` `systemctl` `lsof` `ssh-keygen` `scp` `rsync` `nc` `netcat` `nmap` `nohup` `at` `atq` `useradd` `adduser` `usermod` `chattr` `docker` `docker-compose` `kubectl` `python` `python3` `node` `npm` `git` `sudo` `su` `passwd` `wget` `curl` `ssh` `apt`
未在内置列表中的命令会自动转发至 AI 生成响应。 ### 虚拟文件系统 - 每个 SSH 会话拥有**完全独立**的目录树,攻击者操作互不可见 - 默认模拟标准 Linux 目录结构(`/bin` `/boot` `/dev` `/etc` `/home` `/proc` `/usr` `/var` 等) - 支持 `ls -la` / `mkdir -p` / `rm -rf` / `cp -r` 等常见标志 - 模板文件 `vfs.template.json` 支持占位符:`{{username}}` `{{home}}` `{{hostname}}` ## 🤖 AI 提示词策略 `src/ai-service.js` 内置了终端输出约束提示词,让 AI 以符合蜜罐目的的方式响应: - ✅ 仅返回终端输出,不附加解释或 Markdown - ✅ 保持 Linux 风格错误信息和输出格式 - ✅ 不泄露「蜜罐 / 模拟 / AI」身份 - ✅ 结合当前目录、路径和目录内容上下文生成响应 - ✅ 保留历史对话轮次,维持会话连贯性 如需自定义提示词,修改 `src/ai-service.js` 中的 `buildSystemPrompt()` 方法即可。 ## 📁 项目结构 ``` sshd-ai-honeypot/ ├── src/ │ ├── server.js # SSH 服务器、会话生命周期、channel 处理 │ ├── ai-service.js # OpenAI SDK 集成、提示词工程、响应缓存 │ ├── command-handler.js # 命令解析、内置执行、AI 回退路由 │ ├── filesystem.js # 会话隔离虚拟文件系统 │ └── logger.js # Winston 结构化日志 + 日志轮转 ├── config.example.json # 配置模板 ├── config.json # 运行时配置(已 gitignore) ├── vfs.template.json # 虚拟文件系统初始模板 ├── Dockerfile # 含 Ollama 本地模型的容器镜像 └── docker-entrypoint.sh # 容器启动脚本 ``` ## 🔒 安全建议 - **网络隔离**:在独立 VPS 或容器中运行,不要部署在生产服务器上 - **保护 API Key**:`config.json` 已加入 `.gitignore`,切勿手动提交 - **限制出站**:攻击者可能尝试利用蜜罐发起出站连接,建议设置防火墙出站规则 - **定期分析日志**:`sessions/*.json` 包含完整攻击路径,可提取 IOC - **日志数据处理**:日志中可能包含敏感的攻击者数据,妥善保管 ## 📄 许可证 本项目基于 [MIT License](LICENSE) 开源。
如果这个项目对你有帮助,欢迎 ⭐ Star!
标签:AI风险缓解, AI驱动, Cybersecurity, deception, DLL 劫持, Docker, EDR绕过, GNU通用公共许可证, honeypot, HTTP工具, LLM, LLM评估, MITM代理, Node.js, Ollama, OpenAI, SSH协议, SSH蜜罐, Unmanaged PE, 会话隔离, 内存规避, 大语言模型, 威胁情报, 安全防御评估, 安全防护, 开发者工具, 攻击捕获, 无线安全, 网络信息收集, 网络安全, 网络安全审计, 自定义脚本, 自定义脚本, 虚拟文件系统, 蜜罐, 证书利用, 请求拦截, 进程注入, 隐私保护, 高交互蜜罐