diff --git a/docs/cli.md b/docs/cli.md index 183c332..6bd7c73 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -299,7 +299,7 @@ pg_dump -Fc > before-$(date +%F-%H%M).dump |---|---|---| | `hits` | 列出捕获到的凭据(时间倒序,密码默认脱敏) | 否 | | `stats` | 来源排行(IPv6 按 /64 聚合)+ 路径排行(库)+ 凭据排行(文件) | 否 | -| `paths` | 列出当前生效的诱饵路径 | 否 | +| `paths` | 列出当前生效的诱饵路径(按伪装家族汇总) | 否 | | `size` | 表行数、磁盘占用、凭据文件体积 | 否 | | `prune` | 按保留期清元数据 + 凭据文件 | 是 | | `purge-creds` | 删除旧版遗留的明文凭据列(**不可逆**) | 是 | diff --git a/docs/honeypot.md b/docs/honeypot.md index eb895b2..0f110f7 100644 --- a/docs/honeypot.md +++ b/docs/honeypot.md @@ -1,6 +1,6 @@ # 蜜罐(虚假后台登录页) -给扫描器一个假的 WordPress 登录页:它探后台路径时返回 200 假页面,它提交账号密码时把凭据记下来、并把它临时封掉。 +给扫描器一组假的后台登录页(WordPress / phpMyAdmin / Jenkins / Tomcat / Grafana …):它探后台路径时返回对应产品外观的假页面,它提交账号密码时把凭据记下来、并把它临时封掉。 一句话取舍:**这套功能的价值是「拿到对方正在用的字典」,不是「挡住扫描」。** 挡扫描靠 CDN 和 `autoban`;蜜罐只在「有人真的往假后台里填账号密码」时才有意义。 @@ -25,7 +25,27 @@ 业务路由前缀(`/login`、`/api`、`/static` 等)即使出现在自定义清单里也会被强制剔除,构成第二道保险。 -改完路径后用 `tamabox honeypot paths` 看最终生效的完整清单。 +改完路径后用 `tamabox honeypot paths` 看最终生效的完整清单(会按家族汇总条数)。 + +### 会伪装成哪几类后台 + +| 家族 | 典型路径 | 表单字段 / 响应 | +|---|---|---| +| WordPress | `/wp-login.php`、`/wp-admin`、`/wp-json` | `log` / `pwd`,带 `wordpress_test_cookie` | +| phpMyAdmin | `/phpmyadmin`、`/pma`、`/adminer.php` | `pma_username` / `pma_password` | +| Tomcat | `/manager/html`、`/host-manager` | **401 + `WWW-Authenticate`**(Basic,凭据从 `Authorization` 头取) | +| Jenkins | `/jenkins`、`/jnlpJars` | `j_username` / `j_password`,带 `X-Jenkins` 头 | +| Grafana | `/grafana` | `user` / `password`(深色主题) | +| GitLab | `/users/sign_in` | `user[login]` / `user[password]` | +| LuCI(路由器) | `/cgi-bin/luci`、`/luci` | `luci_username` / `luci_password` | +| Joomla | `/administrator` | `username` / `passwd` | +| 通用后台 | `/admin`、`/console`、`/zabbix`、`/jira` … | `username` / `password` | + +**为什么要分类**:扫描器和爆破脚本都是「先按路径判断这是什么后台,再用它认识的字段名填表」。所有路径都回 WordPress 页面,等于在 `/phpmyadmin/index.php` 上告诉对方「这里不是 PMA」,对方直接换目标 —— 我们既拿不到凭据,也留不下有效取证。 + +**静态资源也一起伪装**:`/wp-admin/css/login.min.css`、`/wp-includes/js/*.js`、`/wp-admin/images/*.png` 这类请求回占位 CSS/JS/真 1×1 PNG。这些请求**不落库、不计数** —— 一次页面加载会打 5–10 个资源,逐个 INSERT 等于帮攻击者把写入放大十倍。插件目录下的 `.php` 则回 404(那是 webshell 探测,回登录页反而不像)。 + +单页渲染约 3.7 µs / 2 次分配、页面 1.5–2.5 KB,资源请求 0 分配(`BenchmarkRenderFamily` / `BenchmarkAssetFor` 守着)。 --- @@ -65,7 +85,8 @@ honeypot_cred_dir = data/honeypot-creds | 行为 | 走哪条通道 | 阈值 | 是否立即封 | |---|---|---|---| | `GET /wp-login.php` 看一眼假页面 | 常规 `autoban.Record` | `ban_threshold_sensitive`(默认 10 次 / 60 秒) | 否 | -| `POST` 带 `log` / `pwd` 提交 | 蜜罐 `autoban.RecordHoneypot` | `honeypot_threshold`(默认 1) | 是,立即封 | +| `GET /wp-admin/css/login.min.css` 等资源 | **不计数、不落库** | — | 否 | +| `POST` 带该家族的凭据字段(`log`/`pwd`、`pma_*`、`j_*`、`user[login]` …) | 蜜罐 `autoban.RecordHoneypot` | `honeypot_threshold`(默认 1) | 是,立即封 | | `POST` 不带任何凭据字段 | 常规通道 | 同上 | 否 | **为什么 GET 不立即封**:爆破脚本的标准流程是「先 GET 探表单 → 再 POST 提交」。如果 GET 就吃 403,假登录页只被看了一次,对方根本没机会填表,凭据永远拿不到 —— 而这个功能的全部价值就在那份凭据上。