
推出 honeyprompt,这是一个以LLM优先的欺骗框架,专为/由Web开发者打造。这是 @alectrocute 的个人热爱项目。
支持所有主要的云端和本地LLM提供商。支持SSH、HTTP、TLS、TCP、telnet等。它作为一个小的容器(以及一个单一的静态二进制文件)发布,所有控制旋钮都集中在一个 honeyprompt.yaml 文件中。
无需编译插件,无需运行数据库,易于扩展,可在低端硬件上部署。
演示实例位于 172.233.151.216,未认证的Web面板在这里:http://172.233.151.216:9090。这是一个运行在廉价Linode VPS上的honeyprompt公开实例,使用 openrouter/free 作为唯一的LLM提供商/模型。
为了2026年最简单的设置,我们推荐使用Docker和OpenRouter/openrouter/free 作为LLM提供商。所有主要的云端和本地LLM提供商都受支持。三个文件和一个命令即可完成完整的默认部署:七个由LLM支持的诱饵、持久化事件存储和操作面板。
1. 获取默认配置、compose文件和env模板:
# 如果你没有Docker:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example
(或者克隆仓库并 cd 进去——同样的三个文件。)
2. 填写 .env。 两个必需的值:
OPENROUTER_API_KEY=sk-or-... # 使用带有支出限制的专用密钥
HONEYPROMPT_PANEL_PASSWORD=changeme # 面板的基本认证密码
3. 启动它:
docker compose up -d
4. 戳一下它:
ssh -p 2222 root@localhost # 密码:root — 然后输入任何内容
curl http://localhost:2375/v1.54/containers/json # "暴露的" Docker API
5. 在只读面板上观看它发生,访问 http://127.0.0.1:9090(以 admin 用户和你的面板密码登录)。每个连接、凭据和命令都实时流式传输。如果你部署到远程主机,你需要暴露 :9090 端口在 compose.yaml 中。不建议在生产部署中使用。
对于生产部署,请固定一个带编号的版本而不是
latest——在.env中设置HONEYPROMPT_IMAGE。
你刚刚下载的 honeyprompt.yaml 是一个完整注释的展示。它内置了以下配置文件:
/ 立即提供标准的nginx欢迎页面,更深层次的路径则落入LLM,生成完整的HTML/CSS内网页面、登录表单和管理面板,旨在让攻击者持续点击。[!重要] 即使你使用LLM,也要确定最常用的路径并为它们添加静态规则。这将节省大量LLM代币,并加速对不值得LLM调用的请求的响应。随机示例:
whoami、健康检查、favicon、版本探测等。
这个最小的 honeyprompt.yaml 使用两个静态规则模拟了一个SSH机器,没有LLM:
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # 持久化的攻击者活动
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "Ubuntu 26.04 LTS build runner"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # 哪些密码“有效”
commands:
- regex: "^whoami$"
handler: "root"
- regex: "^(.+)$"
handler: "bash: command not found"
docker run --rm \
-p 2222:2222 -p 8080:8080 \
-v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
-v honeyprompt-data:/data \
alectrocute/honeyprompt:latest
对于持久化部署,请使用附带的 compose.yaml。部署指南 涵盖了Docker Hub发布、所需的GitHub密钥、端口和防火墙设置、通过SSH的面板访问、升级、回滚、事件存储和隔离。
蜜罐只需做好一件事:保持足够说服力,让攻击者持续输入。他们运行的每个命令都是情报——他们使用的工具、重复使用的凭据、他们假设你尚未修补的CVE。静态蜜罐在有人运行作者未预期的命令时就会暴露身份。honeyprompt将这个时刻交给LLM,因此shell会像真实系统一样回答 dmesg | tail 或 cat /etc/shadow,从而让会话继续下去。
请观看Adel Karimi精彩的DEF CON 32演讲,关于Galah(第一个?)LLM蜜罐,它启发了我这个项目:https://www.youtube.com/watch?v=XGsm4Qcc_Ag
这部分值得提前理解,因为两者被故意分开:
你可以分开配置它们:
# 蜜罐:攻击者活动。
events:
buffer: 2000 # 保留在内存中以供面板使用的最近事件
file: /data/events.jsonl # 以JSON Lines格式持久化每个事件
# 运行时的自身诊断。
logging:
level: info # debug | info | warn | error
format: text # 在控制台上的显示方式:text(人类可读)或 json
file: /data/honeyprompt.log # 可选;在磁盘上始终是JSON
events.jsonl 是每行一个自包含的JSON对象——准备好 tail -f、发送到SIEM或使用 jq 重放。上面的Docker命令将命名卷 honeyprompt-data 挂载到 /data,因此事件在容器替换后仍然存在。这两个文件是追加写入的,并在干净关闭时刷新。
format 仅影响操作日志在控制台上的渲染;操作日志文件(如果启用)始终是结构化JSON,以便于解析。

一个可选的只读仪表板,实时流式传输欺骗事件,按协议分类,并一键导出为JSON:
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # 可选的基本认证
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
该仪表板是纯HTML、CSS和JavaScript(src/panel/assets),嵌入到二进制文件中。如果不需要认证,请将 auth 保持未定义。
每个提供商都有自己的模块,具有自己的超时、重试、速率限制和标头。密钥来自环境变量。开箱即用的提供商:
配置提供商,选择一个 pool.strategy(round-robin、weighted、random 或 failover),honeyprompt会在它们之间分配流量。如果选择的提供商超时或返回可重试的错误,honeyprompt会透明地转移到下一个——一个宕机的后端绝不会让蜜罐离线。不可重试的错误(比如错误的API密钥)会停止级联,以便你发现,而不是静默地消耗配额。
服务使用全局池,除非它们指定了自己的提供商子集:
llm:
enabled: true
providers: [local-ollama] # 一个名称:强制此服务使用该提供商
列出多个名称可以保持负载均衡和故障转移,但仅限于该子集内:
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
当多个服务应该共享同一个提供商组——或者子集需要自己的策略而不是全局策略时——定义一个命名池。池具有名称、策略和有序的提供商列表,服务可以在任何需要指定提供商的地方通过名称引用它:
pools:
- name: cheap-first
strategy: failover # 先尝试本地模型,如果失败则回退到付费API
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # 一个池名称,代替提供商
- protocol: http
# ...
llm:
enabled: true
providers: [spread]
池名称必须是 providers 中的唯一条目——不允许将池与单独提供商混合在同一个列表中,因为那会不清楚哪个策略获胜。池名称与提供商名称位于相同的命名空间,且不能与它们冲突。
当“匹配正则表达式”或“询问模型”不足时,钩子允许你将自定义TypeScript插入到请求和响应路径中。钩子可以在请求到达模型之前重写提示,或者在响应到达攻击者之前重写回复。
import { registerHook } from "./src/engine/hooks.ts";
registerHook({
name: "fake-latency-notice",
transformResponse(response, ctx) {
if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
return "rm: cannot remove '/': Operation not permitted\n";
}
return response;
},
});
通过名称从任何服务的 hooks: 列表中引用它。示例配置中内置了一个 redact-secrets 钩子并已启用,这样模型永远不会将真实的凭据泄露出去。
Prometheus指标在面板的 /metrics 路径提供(未经认证,因此抓取工具可以正常工作):
honeyprompt_events_total{protocol="ssh"} 412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"} 118
honeyprompt_auth_attempts_total{protocol="ssh"} 87
honeyprompt_engine_errors_total{protocol="http"} 0
如果你想贡献或需要一个原生二进制文件,你需要 Deno 2.x——这是唯一的依赖。
deno task check # 类型检查
deno task lint
deno task fmt
deno task test # 单元测试 + 集成测试
deno task start -- --config honeyprompt.yaml # 本地运行
deno task dev -- --config honeyprompt.yaml # 使用文件监视运行
deno task compile # -> ./dist/honeyprompt (自包含二进制文件)
deno compile 将运行时、面板资源等全部打包到一个可执行文件中,无需依赖。Linux、macOS和Windows的预构建二进制文件随每个标记的发布一起提供。
CI 在每次推送时运行格式化、lint、类型检查、测试、配置验证、跨平台 compile 和Docker构建。标记 vX.Y.Z 会发布发布二进制文件,并将带有出处和SBOM的多架构镜像发布到 alectrocute/honeyprompt。
honeyprompt run [--config <path>] 启动所有已配置的服务(默认)
honeyprompt validate [--config <path>] 解析并验证配置,然后退出——非常适合CI
honeyprompt version
honeyprompt help
--config 默认为 ./honeyprompt.yaml,如果设置则使用 $HONEYPROMPT_CONFIG(容器中将其设置为 /etc/honeyprompt/honeyprompt.yaml)。
这是一个用于在你拥有或已授权测试的基础设施上引诱和研究攻击者的工具。暴露诱饵服务仍然意味着暴露服务;请在隔离的主机上运行,保持修补,并且不要将其指向任何你无法承受被探测的事物。欺骗不能替代实际保护真实系统。
如果你想为这个项目做出贡献,并使用AI智能体或大量依赖生成式代码,完全没问题——但你将被逐一询问你提供的每一行代码,如果你不能立即展示出无需AI的理解,你的整个贡献将被拒绝并废弃。
| 提供商 | type | 备注 |
|---|
| Ollama | ollama | 本地模型;默认使用 localhost:11434 |
| llama.cpp | llamacpp | 本地 server OpenAI端点 |
| OpenAI | openai | OPENAI_API_KEY |
| Azure OpenAI | azure | 需要 azure.deployment + azure.apiVersion |
| OpenRouter | openrouter | OPENROUTER_API_KEY |
| Anthropic | anthropic | ANTHROPIC_API_KEY |
| Google Gemini | google | GEMINI_API_KEY |
| 任何OpenAI形状的 | openai-compatible | 将 baseUrl 指向你的网关 |