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
## 构建状态
[](https://hub.docker.com/r/andreaskasper/http-honeypot)

[](https://github.com/andreaskasper/http-honeypot/issues)
## 支持
[](https://www.patreon.com/AndreasKasper)
[](https://www.paypal.me/AndreasKasper)
[](https://ko-fi.com/andreaskasper)
[](https://github.com/sponsors/andreaskasper)
标签:CISA项目, Docker, Go, Ruby工具, 后端开发, 威胁情报, 安全, 安全防御评估, 开发者工具, 日志审计, 网络攻防, 自定义请求头, 蜜罐, 证书利用, 请求拦截, 超时处理