Skip to content

About

多诱饵紧凑型无状态SSH蜜罐,包含假Claude、Codex、Cursor、云平台与运维凭据,支持任意账户密码、公钥及交互认证,模拟Linux文件系统、网络、防火墙和常用命令,实时记录来源、凭据、命令与行为,并提供Web审计控制台

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

12 Commits

Folders and files

Repository files navigation

image

sshfakekeyhome 一个紧凑的无状态 SSH 蜜罐。它接受任意用户名配合密码、SSH 公钥或 keyboard-interactive 输入,为每个连接创建独立的内存文件系统,并模拟常见 Linux 命令、网络故障、防火墙操作和高价值配置文件。会话断开后,所有虚拟文件变更都会丢弃,只有审计日志和 SSH 主机密钥会持久保存。

程序不会将输入传递给真实 Shell,不会执行宿主机命令,也不会主动连接外部网络。

功能

  • 接受任意用户名及密码、公钥或 keyboard-interactive 认证,支持多个 IP、用户和并发连接
  • 记录来源地址、明文认证输入、SSH 公钥及 SHA256 指纹、工作目录和完整命令历史
  • 提供带登录认证的实时 Web 审计控制台,无需循环刷新整个页面
  • 每个 SSH 会话拥有独立、可修改、断线即销毁的虚拟文件系统
  • 支持命令和路径 Tab 补全、历史记录、命令链、管道及重定向
  • 模拟 nohup、后台 &、jobs、bg、fg、disown、wait 和 kill 作业控制
  • 模拟 cd、ls、cat、grep、sed、find、wc、sort、dpkg、ps、systemctl 等常用命令及其高频参数
  • 支持通过 /bin/ls 等绝对路径执行虚拟命令,并模拟 Bash 的 command、type 等内建命令
  • 使用可配置的 OpenSSH 服务标识和接近 Debian 12 OpenSSH 的握手算法集合
  • 保持 /proc、进程、端口、systemd、Docker Compose、远程 Kubernetes 和业务文件之间的一致性
  • 提供会话内一致的虚拟网卡、地址、路由、邻居表、DNS 和 Wi-Fi 状态
  • 支持 ip、ifconfig、iw、iwconfig、arp、route、nmcli、networkctl、resolvectl、ethtool、rfkill、dig、host、nslookup、traceroute 和 mtr
  • 模拟 stat、file、du、base64、crontab、docker、podman、crictl、kubectl、python、nc、socat 等攻击者常用工具
  • 识别侦察、凭据访问、持久化、提权、规避审计、下载执行、编码执行、网络隧道、云元数据访问、容器枚举和挖矿特征
  • 模拟 apt 和 apt-get 的随机网络波动、镜像超时及代理连接失败
  • 识别环境变量、Git 和 APT 代理配置,并生成结构化代理审计事件
  • 在会话内模拟 ufw、iptables、nft 和 firewall-cmd 状态及规则
  • 提供 AI 工具、云平台、代码托管、容器、数据库和部署配置等诱饵
  • 自动生成并持久保存 Ed25519 SSH 主机密钥

环境要求

  • Linux、Windows 10、Windows Server 2016 或更新版本
  • Python 3.11 或更高版本
  • OpenSSH 客户端,用于连接测试

安装与启动

Linux:

git clone https://github.com/ra1nyxin/sshfakekeyhome.git
cd sshfakekeyhome
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
sudo -E .venv/bin/python honeypot.py

Windows PowerShell:

git clone https://github.com/ra1nyxin/sshfakekeyhome.git
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe honeypot.py

默认监听所有网卡的 TCP 222 端口:

ssh -p 222 username@server-address

Web 审计控制台默认监听所有网卡的 TCP 52000 端口,默认账户和密码均为 admin:

http://server-address:52000

控制台通过 SSE 长连接接收新事件,仅更新相关统计和表格。页面提供安全态势、在线会话、24 小时趋势、攻击波次、来源画像、IOC、主机活动、登录凭据、命令分析、关键行为和运行健康等视图。IP、会话和事件均可设置标签、备注及待分析/已确认状态。IP 与会话可展开完整调查时间线,事件支持按类型、严重等级、来源、用户、会话、时间范围及任意文本组合检索,并可导出 JSONL、CSV 或单会话文本报告。

IOC 由蜜罐在本地从攻击者输入中提取,包括 URL、域名、IP、代理、SSH 公钥、哈希、钱包地址和容器镜像。提取过程不会请求外部威胁情报服务,也不会自动或人工修改宿主机封禁规则。

行为检测结果包含严重等级、规则编号、命中证据以及对应的 MITRE ATT&CK 技术信息。密集侦察使用会话内时间窗口判断,单次普通系统查询不会产生不必要的告警。

Linux 默认只允许 root 绑定 1024 以下端口。使用 sudo 启动时,程序会在绑定端口后立即降权回发起 sudo 的普通用户。将端口改为 2222 等非特权端口后,可直接以普通用户启动:

.venv/bin/python honeypot.py --port 2222

验证配置但不启动服务:

.venv/bin/python honeypot.py --check

Windows 不使用 Linux 的低端口权限和进程降权逻辑,默认的 222 与 52000 端口可以由普通用户进程监听。若云平台安全组已经放行但外部仍无法访问,可在管理员 PowerShell 中添加 Windows 防火墙入站规则:

New-NetFirewallRule -DisplayName "sshfakekeyhome SSH" -Direction Inbound -Protocol TCP -LocalPort 222 -Action Allow
New-NetFirewallRule -DisplayName "sshfakekeyhome Dashboard" -Direction Inbound -Protocol TCP -LocalPort 52000 -Action Allow

仅应向可信管理网络开放 Web 控制台端口,并应在公网部署前修改默认的 admin/admin 凭据。

配置

默认配置文件为 config.toml。也可以通过 --config 指定其他 TOML 文件,通过 --listen、--port、--dashboard-listen 和 --dashboard-port 临时覆盖监听地址和端口。

[server]
listen = "0.0.0.0"
port = 222
host_key = "data/ssh_host_ed25519_key"
server_version = "OpenSSH_9.2p1 Debian-2+deb12u7"
max_sessions = 120
max_sessions_per_ip = 5
idle_timeout_seconds = 900
drop_privileges = true # 仅 POSIX 系统生效

[system]
hostname = "web-prod-02"
distribution = "Debian GNU/Linux 12 (bookworm)"
kernel = "6.1.0-28-amd64"
architecture = "x86_64"

[logging]
path = "logs/sessions.jsonl"
console = true
max_file_bytes = 33554432
max_total_bytes = 268435456

[limits]
max_virtual_file_bytes = 6291456
max_pipeline_capture_bytes = 3145728
max_heredoc_bytes = 2097152
max_heredoc_lines = 4096
max_history_entries = 2500

[dashboard]
enabled = true
listen = "0.0.0.0"
port = 52000
username = "admin"
password = "admin"
session_hours = 12
detail_event_limit = 2000
detail_max_bytes = 16777216
export_max_records = 5000
export_max_bytes = 16777216
max_stream_subscribers = 32
max_unique_values = 50000
max_dimension_bytes = 67108864

[network]
apt_delay_min_seconds = 3.0
apt_delay_max_seconds = 7.0

管理页面账户密码以明文形式保存在配置文件中。使用默认 admin/admin 且监听地址为 0.0.0.0 时,登录后的页面会显示风险提示。该提示可以在当前服务运行期间关闭,服务重启后会再次出现;修改任意一项登录凭据后不再显示。

虚拟环境

虚拟 Shell 支持常见文件操作、环境变量、管道、>/>>、heredoc、命令链、路径通配符和作业控制。nohup、后台 &、jobs、bg、fg、disown、wait 与 kill 使用会话内的虚拟作业表,不会创建宿主进程。文件变化仅在当前会话中有效,不会修改宿主机,也不会影响其他连接。默认限制单个虚拟文件为 6 MiB、单条管道捕获为 3 MiB、heredoc 为 2 MiB/4096 行,并保留每个会话最近 2500 条命令历史;这些值均可在 [limits] 中调整。

APT 会读取会话内的虚拟 /etc/apt/sources.list。攻击者使用 sed、重定向或 heredoc 修改镜像后,后续重试输出会反映新的镜像地址。以下代理形式会被识别和记录:

export http_proxy=http://proxy.example:8080
env https_proxy=http://proxy.example:8080 curl https://example.com
apt -o Acquire::http::Proxy=http://proxy.example:8080 update
git config --global http.proxy http://proxy.example:8080

所有防火墙操作均为会话内模拟,不会修改宿主机防火墙。

网卡上下线、IP 地址、路由、邻居表、Wi-Fi 连接及射频开关等网络操作也仅修改当前会话中的虚拟状态。相关命令不会读取或变更宿主机网络配置,也不会发出真实网络请求。

诱饵

每个用户目录包含随机生成、格式接近真实凭据但不关联任何账户的诱饵配置。核心 AI 工具诱饵保持可发现,其他 AI 和云平台配置按用户分散放置,避免每个账户都出现完全相同的凭据集合。覆盖范围包括:

  • Cursor、Claude Code、Codex、Gemini CLI、Continue、Aider、Windsurf、Copilot、OpenCode、Tabby、LM Studio、Ollama
  • AWS、GCP、Azure、GitHub、GitLab、Docker、Kubernetes、Terraform、Vault、Sentry、Stripe
  • npm、PyPI、rclone、SSH、MySQL、PostgreSQL、Redis、Ansible
  • 部署 .env、Git 元数据、systemd 服务定义和数据库备份

通过 cat、less、head、tail 或 grep 读取诱饵时,会生成 bait_access 审计事件。

审计日志

日志默认写入 logs/sessions.jsonl,每行是一个 JSON 对象。主要事件包括:

事件 内容
auth 来源 IP、端口、用户名、认证方式和结果;按方式记录明文密码、keyboard-interactive 提示与响应,或 SSH 公钥原文、算法和 SHA256 指纹
auth_public_key_offer 客户端提供的 SSH 公钥原文、算法和 SHA256 指纹,包括尚未完成签名验证的公钥尝试
session_start / session_end 会话标识、用户、持续时间和命令数量
session_rejected 触发全局或单 IP 活跃会话上限的连接尝试
command 当前目录和完整命令
completion Tab 补全输入、片段和匹配数量
heredoc_input heredoc 目标路径和输入内容
proxy_config 代理变量、地址和配置方式
firewall_change 防火墙工具、操作、状态和规则
network_change 网络工具、操作、虚拟接口、路由、邻居表和 Wi-Fi 状态
filesystem_change 虚拟文件创建、覆盖、追加、删除、复制、移动及权限或归属变更
session_context 工作目录等会话上下文变更
behavior_detected 行为规则、严重等级、ATT&CK 技术、命中片段和原始命令
persistence_change 计划任务等虚拟持久化状态变更
job_control 虚拟后台作业的启动、查询、前后台切换、信号、等待和脱离操作
bait_access 被读取的诱饵路径和读取方式
resource_limit 虚拟文件、管道、heredoc 或命令输出触发资源边界
forwarding_rejected 被明确拒绝的 TCP、Unix socket 或 TUN/TAP 转发请求
dashboard_login / dashboard_logout 管理页面登录结果及退出操作,不记录管理密码
dashboard_query / dashboard_export 来源或会话调查、组合检索及审计导出操作
dashboard_annotation 分析员对来源 IP、会话或事件设置的标签、备注和待分析/已确认状态

每条新审计记录都包含稳定的 event_id;保留范围内的旧记录会由管理页面按原始 JSON 行生成稳定 ID。管理控制台可对来源 IP、会话和单条事件设置标签、备注以及“待分析/已确认”状态,变更以 dashboard_annotation 事件追加保存,重启后会从审计历史恢复。auth 与 session_start 还会记录 SSH 客户端版本、协商密码算法、MAC、终端类型和终端尺寸等可用指纹字段。

审计日志默认在 32 MiB 时轮转,并对活动文件及编号归档设置 256 MiB 的总保留量;管理页面会读取保留范围内的全部归档。可通过 [logging] 的 max_file_bytes 与 max_total_bytes 调整。调查视图记录数与总字节数、导出记录数与总字节数、SSE 订阅数以及聚合维度的数量与字节预算,分别由 [dashboard] 中的 detail_event_limit、detail_max_bytes、export_max_records、export_max_bytes、max_stream_subscribers、max_unique_values 与 max_dimension_bytes 控制。实时页面会截断超长字段作为预览,原始审计日志不受页面预览限制。SSH TCP、Unix socket 和 TUN/TAP 转发均被显式拒绝。

在 POSIX 系统上,日志目录权限设置为 0700,日志和主机私钥权限设置为 0600。Windows 上应使用 NTFS ACL 限制运行账户以外的用户访问这些文件。日志包含明文凭据和攻击者输入,不应公开提交或共享。仓库的 .gitignore 已排除 logs/ 和 data/。

安全建议

  • 在独立主机、虚拟机或受控网络区域中运行蜜罐
  • 不要在蜜罐主机上保存生产凭据或其他敏感数据
  • 限制蜜罐进程的文件权限和网络权限
  • 修改 Web 控制台默认密码,并优先通过受控网络访问
  • 对外提供控制台时使用 HTTPS 反向代理和额外的网络访问控制
  • 按存储容量和审计保留要求配置日志轮转总量
  • 及时更新 Python、AsyncSSH 和系统安全补丁
  • 在公开部署前确认当地法律、隐私和数据保留要求

本项目不会调用真实 Shell,但 SSH 协议栈和运行环境仍应视为外部攻击面。不要将蜜罐进程作为生产系统的安全边界。

License

MIT

About

多诱饵紧凑型无状态SSH蜜罐,包含假Claude、Codex、Cursor、云平台与运维凭据,支持任意账户密码、公钥及交互认证,模拟Linux文件系统、网络、防火墙和常用命令,实时记录来源、凭据、命令与行为,并提供Web审计控制台

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages