andreaskasper/http-honeypot

GitHub: andreaskasper/http-honeypot

一款基于 Go 的高交互 HTTP 蜜罐,通过模拟大量真实攻击面并嵌入 Honeytoken 来捕获恶意请求、追踪凭证重用并实现自动化威胁告警。

Stars: 1 | Forks: 0

# 🍯 HTTP Honeypot 一个使用 **Go** 编写的高交互式 HTTP honeypot。它模拟了 **40 多个真实攻击面**,通过加密随机延迟来 tarpit 每个请求,在伪造的响应中嵌入 **honeytoken** 以检测凭证重用,并自动将攻击者报告给 **AbuseIPDB**。 📖 **完整文档:** https://andreaskasper.github.io/http-honeypot/ ## 功能 - 🎣 **40+ 攻击陷阱** — Spring Actuator、WordPress、Exchange/OWA、Fortinet、Kubernetes、Docker API、AWS/GCP metadata、Git 泄露、phpMyAdmin、Jenkins、Confluence、web shell 等 - 🍯 **Honeytoken** — 在响应中嵌入针对特定 IP 的伪造 API key (`hp_live_*`);当攻击者重用它们时,会被检测并标记,同时触发 `honeytoken_used` webhook 事件 - 🚀 **动态响应 webhook** — 通过带有缓存功能的 `WEBHOOK_NEW_URL` 为未知 URL 返回自定义内容 - 🚫 **AbuseIPDB 集成** — 自动报告攻击 IP,支持针对单个 IP 的可配置冷却时间 - 🐢 **Tar-pit** — 使用 `crypto/rand` 为每个请求设置延迟;防止时序指纹识别 - 🏷️ **`attack_tag`** — 每个匹配的陷阱都会生成一个机器可读的标签,用于 webhook 路由 - 🔍 **Log4Shell 检测** — 扫描所有请求头和查询字符串中的 `${jndi:` payload - 🔑 **API key 捕获** — 捕获 `X-Api-Key`、`Authorization: Bearer`、`Authorization: Token` - 📋 **结构化 JSON 日志** — 每个请求输出一行 JSON;内置基于大小的日志轮转 - 🔇 **`LOG_DISABLED`** — 禁用所有文件日志记录,同时保持通知活跃 - 🔔 **Pushover** — 基于国家/地区的移动推送;限制为每小时一次 - 🔗 **Webhook** — 每次攻击事件都会向任何 URL 发送 POST JSON,支持针对单个 IP 的速率限制 - 📊 **Prometheus `/metrics`** — 受 HTTP Basic Auth 保护;提供 `METRICS_DISABLED` 选项 - 🐳 **~15 MB Docker 镜像** — 多阶段构建 (Go 1.25 / Alpine 3.21) ## 快速开始 ``` docker run -p 80:80 andreaskasper/http-honeypot ``` 或者使用 docker-compose(推荐): ``` cp .env.example .env # 使用你的值编辑 .env docker-compose up -d ``` ## 环境变量 | 变量 | 默认值 | 描述 | |---|---|---| | `NAME` | _(空)_ | 实例名称 — 包含在所有通知中 | | `HONEYPOT_PORT` | `80` | 主机端口(仅限 docker-compose) | | **Tar-pit** | | | | `TAR_PIT_MAX_SEC` | `20` | 每个请求的最大随机延迟(秒)(0 = 禁用) | | **速率限制** | | | | `RATE_LIMIT_PER_MIN` | `1000` | 每个 IP 每分钟的最大请求数 | | **日志记录** | | | | `LOG_DISABLED` | `false` | 禁用所有文件日志记录(通知仍会触发) | | `LOG_MAX_SIZE_MB` | `100` | 当日志文件大小超过此值(MB)时进行轮转 | | **Pushover** | | | | `PUSHOVER_APP` | _(空)_ | Pushover 应用程序 token | | `PUSHOVER_RECIPIENT` | _(空)_ | Pushover 用户/群组 key | | `PUSHOVER_NOTIFY_COUNTRY` | _(空)_ | 用于移动警报的 ISO 3166-1 alpha-2 国家代码(限流:1次/小时) | | **Webhook (攻击事件)** | | | | `WEBHOOK_URL` | _(空)_ | 用于 JSON 攻击事件的 HTTP POST endpoint | | `WEBHOOK_SECRET` | _(空)_ | 在 `X-Honeypot-Secret` 请求头中发送,用于接收端验证 | | `WEBHOOK_URL_RATE_LIMIT_SEC` | _(空)_ | 可选:针对单个 IP 的速率限制(调用间隔秒数) | | **Webhook (未知 URL)** | | | | `WEBHOOK_NEW_URL` | _(空)_ | 用于未知/新 URL 的 HTTP POST endpoint(同步) | | `WEBHOOK_NEW_URL_SECRET` | _(空)_ | 在 `X-Honeypot-Secret` 请求头中发送,用于接收端验证 | | `WEBHOOK_NEW_URL_CACHE_SEC` | `60` | 缓存相同路径的响应(秒) | | `WEBHOOK_NEW_URL_TIMEOUT_SEC` | `5` | webhook 调用超时时间(秒) | | `DEFAULT_REDIRECT` | `false` | 当 webhook 无响应时重定向到 `/` 而不是返回 404 | | **Prometheus metrics** | | | | `METRICS_USER` | `admin` | `/metrics` Basic Auth 用户名 | | `METRICS_PASSWORD` | `password` | `/metrics` Basic Auth 密码 | | `METRICS_REALM` | `Prometheus Server` | HTTP Basic Auth realm | | `METRICS_DISABLED` | `false` | 完全禁用 `/metrics` endpoint | | **AbuseIPDB** | | | | `ABUSEIPDB_KEY` | _(空)_ | AbuseIPDB API key — 留空则禁用 | | `ABUSEIPDB_SLEEP` | `86400` | 再次报告同一 IP 前的冷却时间(秒)(默认:24 小时) | ## 动态响应 Webhook (WEBHOOK_NEW_URL) Honeypot 可以针对**未知/新 URL**(不匹配任何攻击陷阱的路径)调用 webhook,并提供自定义响应。这使得以下功能成为可能: - 动态实现自定义攻击向量 - 对不同的响应策略进行 A/B 测试 - 创建自适应的 honeypot 行为 - 在硬编码陷阱之前分析新的攻击模式 ### 请求 Payload Webhook 会接收详尽的请求详情: ``` { "server": "my-honeypot", "timestamp": "2026-02-19T10:00:00Z", "ip": "1.2.3.4", "method": "GET", "host": "example.com", "path": "/custom/path", "query_string": "id=123&debug=true", "query_params": {"id": "123", "debug": "true"}, "headers": { "User-Agent": "Mozilla/5.0...", "Accept": "text/html", "X-Forwarded-For": "1.2.3.4" }, "cookies": {"session": "abc123"}, "user_agent": "Mozilla/5.0...", "content_type": "application/json", "remote_addr": "1.2.3.4:54321", "request_uri": "/custom/path?id=123", "proto": "HTTP/1.1", "tls": false, "api_key_used": "", "post_body": "{\"data\":\"test\"}", "content_length": 15, "ipinfo": {"country": "DE", "city": "Berlin", "org": "AS3320"} } ``` ### 响应格式 Webhook 可以通过两种方式返回自定义响应: **1. JSON 响应(结构化):** ``` { "status": 200, "body": "Custom content", "content_type": "text/html; charset=utf-8", "headers": { "X-Custom-Header": "value", "Cache-Control": "no-cache" } } ``` **2. 纯文本/HTML 响应:** 直接返回原始 HTML 或文本(非 JSON)。Content-type 将被自动检测。 ### 特殊功能 **重定向简写:** ``` { "status": 301, "redirect": "/moved-here" } ``` 自动设置 `Location` 请求头。 **响应缓存:** 响应将根据 `METHOD:PATH` 缓存 `WEBHOOK_NEW_URL_CACHE_SEC` 秒(默认:60秒)。这可以防止对相同的 URL 模式重复调用 webhook。 **回退行为:** - 如果 webhook 为空或未返回自定义响应 → 404(如果 `DEFAULT_REDIRECT=true` 则 301 重定向到 `/`) - 如果 webhook 超时或出错 → 404(如果 `DEFAULT_REDIRECT=true` 则 301 重定向到 `/`) ### Prometheus Metrics `/metrics` endpoint 包含: - `webhook_new_url_calls` — 总 webhook 调用数 - `webhook_new_url_timeout_ms` — 累计响应时间 - `webhook_new_url_cache_hits` — 缓存命中数 - `webhook_new_url_cache_misses` — 缓存未命中数 - `webhook_new_url_custom_responses` — 已提供的自定义响应数 ## Honeytoken 每个包含凭证的伪造响应都会嵌入一个**针对特定 IP 的 honeytoken** — 一个带有 `hp_live_` 前缀的伪造 API key,由 `md5(ip + trap_name)` 派生而来。 Token 出现的位置: - `/actuator/env` → `AWS_SECRET_ACCESS_KEY` - `/.env` → `STRIPE_SECRET_KEY` - `/.aws/credentials` → `aws_secret_access_key` - `/api/v*/users/{id}` → `api_key` 字段 如果攻击者将 token 提交回**任何** endpoint(作为请求头、POST body 或查询参数),honeypot 将: 1. 在 `detectHoneytokenInRequest()` 中检测到它 2. 设置 `attack_tag = "honeytoken-used"` 和 `is_honeytoken_use = true` 3. 触发 `honeytoken_used` webhook 事件(独立于普通的 `attack` 事件) 4. 增加 `http_honeytokens_used` Prometheus 计数器 5. 报告给 AbuseIPDB 这意味着,当从你的 honeypot 窃取的凭证被实际使用时,你就会收到警报 —— 即使是从完全不同的 IP 发起,这表明凭证正在被共享或转售。 ## AbuseIPDB 当设置了 `ABUSEIPDB_KEY` 时,每次攻击都会触发向 [AbuseIPDB](https://www.abuseipdb.com/) 的异步报告: - 大多数陷阱使用 **类别 21** (Web App Attack) - 扫描器类陷阱使用 **类别 14 + 21** (Port Scan + Web App Attack) - **冷却时间**:同一个 IP 在 `ABUSEIPDB_SLEEP` 秒内不会被重复报告(默认:24 小时) - 完全异步 —— 绝不会阻塞响应 - 非致命 —— 错误会被记录,但不会影响 honeypot 的运行 报告评论格式: ``` HTTP honeypot [my-honeypot]: spring-actuator-env | GET /actuator/env | UA: python-requests/2.31.0 ``` ## Webhook Payload (攻击事件) ``` { "event": "attack", "server": "my-honeypot", "timestamp": "2025-02-12T14:32:00Z", "ip": "1.2.3.4", "method": "GET", "host": "example.com", "path": "/actuator/env", "user_agent": "python-requests/2.31.0", "is_attack": true, "attack_tag": "spring-actuator-env", "api_key_used": "", "is_honeytoken_use": false, "ipinfo": { "country": "CN", "city": "Beijing", "org": "AS4134" } } ``` 对于 honeytoken 重用事件,`event` 的值为 `"honeytoken_used"`,并且 `is_honeytoken_use` 为 `true`。请在你的 n8n/Slack 流程中以最高优先级路由这些事件。 ## 陷阱覆盖范围 | 类别 | 标签 | |---|---| | Spring Boot Actuator | `spring-actuator-health/env/beans/heapdump/shutdown` | | WordPress | `wp-login`, `wp-admin`, `xmlrpc`, `wordpress-scan` | | Joomla | `joomla-admin` | | phpMyAdmin | `phpmyadmin-index`, `phpmyadmin-setup` | | Apache Tomcat | `tomcat-manager` | | Jenkins | `jenkins-script`, `jenkins-api` | | H2 / JBoss | `h2-console` | | Microsoft Exchange | `owa-login`, `exchange-ews`, `exchange-proxylogon`, `exchange-ecp` | | Fortinet / VPN | `fortinet-fgt`, `sonicwall-vpn`, `pulse-secure`, `cisco-asa-vpn` | | Kubernetes | `k8s-pods`, `k8s-secrets` | | Docker API | `docker-api` | | Grafana | `grafana` | | Confluence | `confluence-rce` | | Liferay | `liferay-rce` | | Cloud Metadata | `aws-metadata`, `gcp-metadata`, `do-metadata` | | REST API IDOR 🍯 | `rest-api-idor-users/accounts/admin/customers/employees` | | 凭证泄露 🍯 | `env-file`, `aws-credentials`, `htpasswd`, `ssh-key` | | Git 泄露 | `git-config`, `git-head` | | 配置泄露 | `spring-config-leak`, `docker-compose-leak` | | 备份文件 | `backup-file` | | Webshell | `webshell` | | 路径遍历 | `path-traversal-passwd` | | Log4Shell | `log4shell` | | CGI 扫描 | `cgi-scan` | | Honeytoken 🍯 | `honeytoken-used` | 🍯 = 在响应中嵌入 honeytoken ## 构建状态 [![Docker Pulls](https://img.shields.io/docker/pulls/andreaskasper/http-honeypot.svg)](https://hub.docker.com/r/andreaskasper/http-honeypot) ![Image Size](https://img.shields.io/docker/image-size/andreaskasper/http-honeypot/latest) [![GitHub Issues](https://img.shields.io/github/issues/andreaskasper/http-honeypot.svg)](https://github.com/andreaskasper/http-honeypot/issues) ## 支持 [![donate via Patreon](https://img.shields.io/badge/Donate-Patreon-green.svg)](https://www.patreon.com/AndreasKasper) [![donate via PayPal](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/AndreasKasper) [![donate via Ko-fi](https://img.shields.io/badge/Donate-Ko--fi-green.svg)](https://ko-fi.com/andreaskasper) [![Sponsors](https://img.shields.io/github/sponsors/andreaskasper)](https://github.com/sponsors/andreaskasper)
标签:CISA项目, Docker, Go, Ruby工具, 后端开发, 威胁情报, 安全, 安全防御评估, 开发者工具, 日志审计, 网络攻防, 自定义请求头, 蜜罐, 证书利用, 请求拦截, 超时处理