alectrocute/honeyprompt

GitHub: alectrocute/honeyprompt

一个基于 LLM 的轻量级蜜罐欺骗框架,通过大模型实时生成逼真交互来延长攻击者停留时间并捕获威胁情报。

Stars: 7 | Forks: 1

# honeyprompt ![横幅](https://static.pigsec.cn/wp-content/uploads/repos/cas/94/94f8cba95b806040c96c9a9661ad176bd065dfd801782a985158c732ba813f8d.png) 介绍 `honeyprompt`,一个由 Web 开发者为 Web 开发者打造的 LLM 优先欺骗框架。这是 [@alectrocute](https://github.com/alectrocute) 的个人热情项目。 支持所有主要的云端和本地 LLM 提供商。支持 SSH、HTTP、TLS、TCP、telnet 等多种协议。它以 小型容器(以及单个静态二进制文件)的形式发布,并将所有配置项集中在 `honeyprompt.yaml` 中。 无需编译插件,无需运行数据库,易于扩展,并且可以部署在低端硬件上。 ## 演示实例 演示实例位于 `172.233.151.216`,其无需身份验证的 Web 面板地址如下: 。这是一个在廉价的 Linode VPS 上运行的 honeyprompt 公开实例, 使用 `openrouter/free` 作为唯一的 LLM 提供商/模型。 ## 快速开始 为了在 2026 年实现最简便的安装,我们推荐使用 Docker 和 OpenRouter/`openrouter/free` 作为 LLM 提供商。 支持所有主要的云端和本地 LLM 提供商。只需三个文件和一条命令,即可启动完整的 默认部署:七个由 LLM 支持的诱饵、持久化事件存储以及操作员面板。 **1. 获取默认配置、compose 文件和环境变量模板:** ``` # 如果你没有 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-... # use a dedicated key with a spend limit HONEYPROMPT_PANEL_PASSWORD=changeme # basic-auth password for the panel ``` **3. 启动它:** ``` docker compose up -d ``` **4. 测试它:** ``` ssh -p 2222 root@localhost # password: root — then type anything curl http://localhost:2375/v1.54/containers/json # "exposed" Docker API ``` **5. 实时观察** 只读面板 (使用 `admin` 和 您的面板密码登录)。每一个连接、凭证和命令都会实时流传进来。如果您部署 在远程主机上,您需要在 [`compose.yaml`](./compose.yaml) 中暴露 `:9090` 端口。对于 生产环境部署,不建议这样做。 您刚刚下载的 [`honeyprompt.yaml`](./honeyprompt.yaml) 是一个带有完整注释的展示文件。它 内置了以下配置文件: - **通用企业 Web 服务器** —— 端口 80,撒下最广的网;`/` 立即提供原生的 nginx 欢迎 页面,更深的路径则交由 LLM 生成完整的 HTML/CSS 内网页面、登录 表单和管理面板,目的是让攻击者不断点击。 - **MCP / agent 网关** —— Streamable HTTP 发现、OAuth 元数据、JSON-RPC 工具调用,以及 诱人的生产工具。 - **Docker Engine API 29.5** —— 真实云端蠕虫使用的未验证端口 2375 攻击面。 - **Kubernetes API v1.36** —— namespace、工作负载、Secret、ConfigMap 和 RBAC 发现。 - **Ubuntu 26.04 AI 构建基础设施** —— SSH、GPU 工作负载、Docker、kubeconfigs、CI 状态,以及 提供商凭证。 - **Redis 8.8** —— 常用于凭证窃取、持久化和横向移动的 RESP 探测。 - **工业边缘 / OT** —— 一个故意显得老旧的 Telnet 管理平面,因为现代防御 仍然必须捕捉针对旧基础设施的攻击。 ### 在没有 LLM 的情况下运行 这个极简的 `honeyprompt.yaml` 使用两条静态规则且无需 LLM,即可伪装成一个 SSH 服务器: ``` panel: enabled: true address: "0.0.0.0:8080" events: buffer: 2000 file: /data/events.jsonl # durable attacker activity services: - protocol: ssh address: "0.0.0.0:2222" description: "Ubuntu 26.04 LTS build runner" serverName: "gpu-runner-07" passwordRegex: "^(root|admin|123456)$" # which passwords "work" 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`](./compose.yaml)。 [部署指南](./DEPLOYMENT.md) 涵盖了 Docker Hub 发布版本、所需的 GitHub 密钥、端口和 防火墙设置、通过 SSH 访问面板、升级、回滚、事件存储以及隔离。 ## 为什么选择 LLM 优先的欺骗,简述 蜜罐只需要做好一件事:保持足够长久的说服力,让攻击者不断 敲击键盘。他们运行的每一个命令都是情报——他们使用的工具、重用的凭证、 他们假定您尚未修补的 CVE。静态蜜罐会在攻击者运行了作者未曾预料到的命令的瞬间 显得不像真实系统。honeyprompt 将这一刻交给了 LLM,因此 shell 回答 `dmesg | tail` 或 `cat /etc/shadow` 的方式就像真实系统一样,会话得以继续。 看看 Adel Karimi 关于 Galah(第一个?)LLM 蜜罐的精彩 DEF CON 32 演讲,正是它 启发了这个项目: ## 记录了什么:两条独立的流 这是值得提前了解的部分,因为这两者是刻意分开的: - 欺骗事件:每一次攻击者交互:连接、身份验证尝试、每一条命令或请求、 honeyprompt 发送回的响应、回答的提供商和模型,以及耗时多长。这是您的 威胁情报。它保存在用于实时面板的有界内存缓冲区中,您可以 将所有这些持久化到磁盘。 - 运行日志:启动、绑定了哪些端口、提供商失败、关闭、内部错误。 这是当 _runtime_ 行为异常时您需要读取的内容。它与攻击者活动毫无关系。 您可以分别配置它们: ``` # honey:攻击者活动。 events: buffer: 2000 # recent events kept in memory for the panel file: /data/events.jsonl # persist every event as JSON Lines # runtime 自身的诊断。 logging: level: info # debug | info | warn | error format: text # how it looks on the console: text (human) or json file: /data/honeyprompt.log # optional; on disk it's always JSON ``` `events.jsonl` 每行包含一个自包含的 JSON 对象——随时可以 `tail -f`、传送到 SIEM,或者 使用 `jq` 重放。上面的 Docker 命令将名为 `honeyprompt-data` 的命名卷挂载到 `/data`,因此 事件在容器替换后依然存在。这两个文件都会被追加写入,并在安全关闭时刷新。 `format` 仅影响运行日志在控制台上的呈现方式;运行日志_文件_( 如果启用)始终是结构化的 JSON,因此易于解析。 ## Web 面板 ![截图](https://raw.githubusercontent.com/alectrocute/honeyprompt/main/src/panel/assets/screenshot.png) 一个可选的只读仪表板会在欺骗事件发生时进行流式传输,按 协议将其细分,并通过一键将所有内容导出为 JSON: ``` panel: enabled: true address: "0.0.0.0:8080" auth: # optional basic auth username: admin password: "${HONEYPROMPT_PANEL_PASSWORD}" ``` 该仪表板是纯 HTML、CSS 和 JavaScript([`src/panel/assets`](./src/panel/assets))并嵌入 到二进制文件中的。保持 `auth` 未定义即可禁用身份验证。 ## 提供商 每个提供商都是自己独立的模块,具有自己的超时、重试、速率限制和标头。密钥 来自环境变量。开箱即用支持: | 提供商 | `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` 指向您的网关 | ### 负载均衡和故障转移 配置提供商,选择一个 `pool.strategy`(`round-robin`、`weighted`、`random` 或 `failover`), honeyprompt 会将流量分散到它们之间。如果所选的提供商超时或返回可 重试的错误,honeyprompt 会透明地故障转移到下一个提供商——死掉的后端永远不会让 蜜罐下线。不可重试的错误(比如错误的 API 密钥)会停止级联,以便您能察觉,而 不是默默地耗尽配额。 除非服务指定了自己的提供商子集,否则服务将使用全局池: ``` llm: enabled: true providers: [local-ollama] # one name: force this service to this provider ``` 列出多个名称以保持负载均衡和故障转移,但仅限 于该子集内: ``` llm: enabled: true providers: [openai-primary, openrouter-backup] ``` ### 命名池 当多个服务应该共享同一个提供商组——或者某个子集需要自己的策略 而不是使用全局策略时——定义一个**命名池**。一个池有一个名称、一个策略和一个有序的 提供商列表,服务在任何本应指定提供商的地方通过名称引用它: ``` pools: - name: cheap-first strategy: failover # try the local model first, fall back to the paid API order: [local-ollama, openrouter] - name: spread strategy: round-robin order: [openrouter, openai] services: - protocol: ssh # ... llm: enabled: true providers: [cheap-first] # a pool name, in place of a provider - protocol: http # ... llm: enabled: true providers: [spread] ``` 池名称必须是 `providers` 中的唯一条目——在一个列表中将池与单个提供商混合使用是 不允许的,因为这样无法确定哪个策略生效。池名称与提供商名称存在于同一个 namespace 中,并且不能与它们发生冲突。 ## 使用 hooks 扩展响应 当“匹配正则表达式”或“询问模型”不够用时,hooks 允许您将自己的 TypeScript 拼接到 请求和响应路径中。hook 可以在 prompt 到达模型之前对其进行重写,或者在回复到达攻击者之前 对其进行重写。 ``` 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` hook 在 示例配置中默认启用,以便模型永远不会将真实的凭证回显出来。 ## 指标 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](https://deno.com) 2.x——唯一的 依赖项。 ``` deno task check # type-check deno task lint deno task fmt deno task test # unit + integration tests deno task start -- --config honeyprompt.yaml # run locally deno task dev -- --config honeyprompt.yaml # run with file watching deno task compile # -> ./dist/honeyprompt (self-contained binary) ``` `deno compile` 将 runtime、面板资产和所有内容打包成一个没有任何依赖项的可执行文件。 Linux、macOS 和 Windows 的预构建二进制文件附在每个带标签的 [发布版本](../../releases)中。 CI 会在每次推送时运行格式化、lint、类型检查、测试、配置验证、跨平台 `compile` 以及 Docker 构建。打上 `vX.Y.Z` 标签将切割出发布二进制文件,并将包含来源和 SBOM 证明的多架构镜像发布到 [`alectrocute/honeyprompt`](https://hub.docker.com/r/alectrocute/honeyprompt)。 ## CLI ``` honeyprompt run [--config ] start every configured service (default) honeyprompt validate [--config ] parse and validate config, then exit — great for CI honeyprompt version honeyprompt help ``` `--config` 默认为 `./honeyprompt.yaml`,或者在设置了 `$HONEYPROMPT_CONFIG` 时使用该变量(容器将其设置为 `/etc/honeyprompt/honeyprompt.yaml`)。 ## 给用户和贡献者的忠告 这是一个用于在**您拥有或授权测试的**基础设施上引诱和研究攻击者的工具。暴露诱饵 服务仍然意味着暴露服务;请在隔离的主机上运行它,保持 修补,并且不要将其指向您无法承受被探测的任何东西。欺骗不能 代替对真实系统的实际保护。 如果您想为这个项目做贡献,并且想使用 AI agent 或严重依赖生成式代码, 那完全没问题——但是您_将_被亲自询问您提供的每一行代码,如果 您没有表现出即刻的、无 AI 的理解,您的_整个_贡献将被 拒绝并废弃。 ## 许可证 [MIT](./LICENSE)。
标签:AI风险缓解, BOF, CISA项目, DLL 劫持, Docker, Petitpotam, PE 加载器, 大语言模型, 安全防御评估, 欺骗防御, 网络安全, 自动化攻击, 自定义请求头, 蜜罐, 证书利用, 请求拦截, 隐私保护