From 79051acae8224a46d3858a43d6c1ad2937c0fc0e Mon Sep 17 00:00:00 2001 From: tamakyi Date: Wed, 21 Oct 2026 12:09:28 +0800 Subject: [PATCH] miguan v1 --- .workbuddy/memory/2026-10-21.md | 61 ++++ .workbuddy/memory/MEMORY.md | 223 +++--------- .workbuddy/memory/topics/build.md | 17 + .workbuddy/memory/topics/builder.md | 33 ++ .workbuddy/memory/topics/coop.md | 7 + .workbuddy/memory/topics/embed.md | 15 + .workbuddy/memory/topics/gorm.md | 9 + .workbuddy/memory/topics/misc.md | 33 ++ .workbuddy/memory/topics/review.md | 39 ++ .workbuddy/memory/topics/style.md | 19 + .workbuddy/memory/topics/theme.md | 44 +++ cmd/tamabox.go | 1 + conf/app.sample.ini | 9 + internal/cmd/honeypot.go | 277 ++++++++++++++ internal/conf/static.go | 10 +- internal/db/db.go | 3 + internal/db/honeypot.go | 188 ++++++++++ internal/db/honeypot_test.go | 82 +++++ internal/mail/mail.go | 47 +++ internal/route/autoban.go | 11 +- internal/route/honeypot.go | 261 +++++++++++++ internal/route/honeypot_test.go | 168 +++++++++ internal/route/route.go | 41 ++- internal/security/honeypot/honeypot.go | 383 ++++++++++++++++++++ internal/security/honeypot/honeypot_test.go | 144 ++++++++ internal/security/honeypot/page.go | 110 ++++++ tamabox.go | 1 + templates/mail/honeypot-alert.html | 74 ++++ 28 files changed, 2128 insertions(+), 182 deletions(-) create mode 100644 .workbuddy/memory/2026-10-21.md create mode 100644 .workbuddy/memory/topics/build.md create mode 100644 .workbuddy/memory/topics/builder.md create mode 100644 .workbuddy/memory/topics/coop.md create mode 100644 .workbuddy/memory/topics/embed.md create mode 100644 .workbuddy/memory/topics/gorm.md create mode 100644 .workbuddy/memory/topics/misc.md create mode 100644 .workbuddy/memory/topics/review.md create mode 100644 .workbuddy/memory/topics/style.md create mode 100644 .workbuddy/memory/topics/theme.md create mode 100644 internal/cmd/honeypot.go create mode 100644 internal/db/honeypot.go create mode 100644 internal/db/honeypot_test.go create mode 100644 internal/route/honeypot.go create mode 100644 internal/route/honeypot_test.go create mode 100644 internal/security/honeypot/honeypot.go create mode 100644 internal/security/honeypot/honeypot_test.go create mode 100644 internal/security/honeypot/page.go create mode 100644 templates/mail/honeypot-alert.html diff --git a/.workbuddy/memory/2026-10-21.md b/.workbuddy/memory/2026-10-21.md new file mode 100644 index 0000000..13556a1 --- /dev/null +++ b/.workbuddy/memory/2026-10-21.md @@ -0,0 +1,61 @@ +# 2026-10-21 + +## 扫描者处置方案设计(未实施,仅设计文档) + +- 触发:线上频繁收到「疑似批量扫描已自动封禁」告警,命中路径以 wp 探测 + `/.ssh/**` 为主,来源多 Azure 云 IP 池。 +- **实测纠正一处错误认知**:`internal/route/route.go:432` 的注释称「flamego 的 NotFound 会先写 404 状态再 Redirect」—— + **错的**。flamego v1.9.4 的 `NotFound` 只执行 handler,不写状态码;`ctx.Redirect("/")` 实测输出 **302 → "/"`。 + 最小复现验证:`/wp-admin/includes/...` 与 `/.ssh/id_rsa` 均得 302 + Location:/。 + 后果:扫描器跟随重定向 → 每个探测路径都触发一次首页渲染(1C1G 纯浪费),且被判为「站点有价值」。 + 同时告警邮件文案「产生大量 404」与实际 302 不符。 +- 方案分五层(L0 CDN 路径/UA 规则 → L1 真 404 分流 → L2 蜜罐假文件/假凭据 → L3 tarpit + 递进封禁 → L4 上游 abuse 举报): + - 核心判断:**对云厂商僵尸网络做 IP 封禁无效**,有效的是按**路径**在 CDN 拦 + 蜜罐取证 + 上游举报。 + - 明确排除反向攻击/DoS/回打(法律风险 + Azure 共享出口伤及无辜 + 招致 CDN 封站)。 + - 蜜罐:命中 `/.ssh/id_rsa`、`/.env`、`/wp-login.php` 等诱饵路径 → 短路返回假内容(含 canary 标记)+ 永久封禁 + 留证。 + - 封禁需落库(当前内存 map,重启清零)+ 时长递进 15m→1h→6h→24h→7d→永久 + 多维(IP / IPv6 /64 / UA 家族)。 + - tarpit 必须带全局并发上限 + 单连接超时,否则 1C1G 自身变 DoS 入口。 +- 设计文档:`outputs/scanner-defense-design-2026-10-21.md`(含分级变更清单、文件级改动点、验收指标)。 +- 未动任何生产代码,等用户决定实施范围。 + +## 蜜罐(虚假后台登录界面 + 破解凭据记录)已实施 + +用户明确需求原文:「能不能把这些页面指向一个简单的虚假后台登录界面,然后记录这些破解的用户名密码等信息」。 + +### 落点决策(关键) +- **蜜罐不改写成新中间件,而是改写 `internal/route/route.go` 的 `f.NotFound`**: + - NotFound 只在「路由表完全落空」时触发 → 与 `/login` `/register` `/_/{domain}` `/user/**` `/api/v1/**` 天然零交集; + - 位于全局 `f.Use` 链之后 → `requestBodyLimitMiddleware` 已给 body 加 12 MiB 上限; + - 组级中间件(含 CSRF)只挂具体路由,不作用于 NotFound → POST 表单可安全解析; + - flamego `context.run()` 在 `ResponseWriter().Written()` 为真时 return → 写完响应不调 `ctx.Next()` 即安全短路。 +- **双重计数坑**:autoban 中间件对敏感路径已 `Record` 一次,蜜罐再记一次会让阈值实际减半。 + 解决:`autobanMiddleware(b, hp)` 传入蜜罐匹配器,蜜罐命中的路径由蜜罐自己计数。 + +### 新增文件 +- `internal/security/honeypot/honeypot.go` — 匹配器(段前缀 + 片段子串 + 双重保险 `forbiddenPrefixs` 排除业务路由)、 + 凭据提取(表单 / JSON / BasicAuth / 查询串)、`CanaryToken = "tb-hp-7f3a1c9e"`。 +- `internal/security/honeypot/page.go` — 仿 WordPress 假登录页(经典字段 `log`/`pwd`/`redirect_to`),内联 CSS 不依赖站点静态资源。 +- `internal/db/honeypot.go` — `HoneypotHit`(**不嵌 dbutil.Model**,审计证据只追加)+ `HoneypotStore`。 +- `internal/route/honeypot.go` — 处理器:GET 假登录页 / POST 假失败响应 / 落库 / 复用 autoban 封禁 / 每 IP 告警一次。 +- `internal/cmd/honeypot.go` — `TamaBox honeypot hits|stats|prune`,密码默认脱敏(`--show-password` 显示明文)。 +- `templates/mail/honeypot-alert.html` — 告警邮件模板(`mail/` 已在 embed 清单,无需改 embed.go)。 + +### 改动文件 +- `internal/route/route.go`(CRLF):NotFound 分流 + 蜜罐实例装配 + `hph.sendAlert`。 +- `internal/route/autoban.go`(LF):`autobanMiddleware(b, hp)`,蜜罐路径跳过自身 Record。 +- `internal/db/db.go`(LF):`AllTables` 加 `&HoneypotHit{}`,`Init()` 加 `Honeypots = NewHoneypotStore(db)`。 +- `internal/conf/static.go`(CRLF):`enable_honeypot` / `honeypot_paths` / `honeypot_retain_days`。 +- `conf/app.sample.ini`(CRLF):对应说明段。 +- `internal/mail/mail.go`(LF):`SendHoneypotAlertMail` + `HoneypotAlert`。 +- `cmd/tamabox.go` + 根 `tamabox.go`:注册 `cmd.Honeypot`(两处必须同步)。 + +### 踩坑 +- `normalize()` 里 `for len(p)>1 { TrimSuffix(p,"/") }` **无限循环**(路径不含尾斜杠时字符串不变)→ 改成 `HasSuffix` 判断。 +- `url.ParseQuery` 遇非法百分号编码返回 error 但仍给出部分字段 → 蜜罐要「尽可能多拿凭据」,忽略 error 继续用部分结果。 +- JSON 凭据提取:手写解析器又脏又易错 → 改用 `jsonPairRe` 正则扫描扁平字段。 +- `templates/mail/` 已在 embed 清单内 → 新增邮件模板**不需要**改 `templates/embed.go`(顶层文件才需要)。 + +### 验证 +- `go build ./...` 通过;`go test ./...` 全绿(含 DB 测试,postgres 门控)。 +- 新增测试:`internal/security/honeypot/honeypot_test.go`(匹配/业务路由零交集/编码绕过/凭据提取)、 + `internal/route/honeypot_test.go`(假页含 canary、业务路由不被劫持、关闭时回落 302、POST 返回失败页)、 + `internal/db/honeypot_test.go`(写入/倒序/三张聚合表/保留期清理)。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index f99d5d6..f066759 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -1,194 +1,67 @@ -# TamaBox-v4 长期笔记 +# TamaBox-v4 长期笔记(索引版) + +明细已拆分到 `topics/*.md`(按需 Read 全文): +`coop` 协作 / `build` 构建测试 / `embed` 行尾·模板·embed / `review` 审核处置举报 / +`gorm` GORM / `style` 前端样式 / `theme` 主题 / `builder` 主题生成器 / `misc` 其它约定。 ## 协作 -- 结论分级 P0/P1/P2;给建议前先根因取证 + 实测复现,别只静态推断。 +- 结论分级 P0/P1/P2;先根因取证 + 实测复现,别只静态推断。 - 改代码前先出变更清单;重大问题显式指出。用户常授权自主推进。 - 用户是运营者也是圈内人:处置必须可解释、可留痕、可申诉,不做自动级联封号。 -## 构建与测试 +## 构建与测试(详见 topics/build.md) -- **无 libwebp/GCC**:cgo 的 `internal/storage/s3.go` 挡编译 → overlay 换桩 - `dev/s3stub/s3_stub.go`(`-overlay="C:/Users/Tamakyi Gekka/AppData/Local/Temp/tb-webpcheck/overlay.json"`)。 - 要检查 s3.go 本身得 tar 复制项目 + `go mod edit -replace`(overlay 换不了 GOMODCACHE)。 -- **「编译卡死」= `proxy.golang.org` 不可达**。每条 go 命令前 - `export GOPROXY=https://goproxy.cn,direct GOSUMDB=off GOFLAGS=-mod=mod`(`go env -w` 沙箱失败)。 - 1C1G 是正式生产环境,别用「沙箱慢」解释超时。 -- DB 测试:`DB_TYPE=postgres DB_USER=postgres DB_PASSWORD=15207786347hXPm DB_HOST=127.0.0.1 DB_PORT=5432` - (DSN 不带库名,`NewTestDB` 自建临时库后 DROP)。带 DB 的 `go test ./...` 全绿。 -- store 方法内用 `NewXStore(db.DB)`,别引用包级单例(测试下 nil panic;`FeatureStateOf` 有守卫)。 -- ⚠️ **本沙箱起不了 `TamaBox web`**(session 固定 redis,6379 未开,启动 panic)→ HTTP 端到端只能部署后做。 - 探测端口 200 可能是别的进程,必须看日志确认 `Starting web server` 且无 panic。 -- ⚠️ **本机 python urllib 不稳定**(代理下偶发读超时,curl 正常);python 别用 `/tmp` - (Windows 解析成 `C:\tmp`,与 MSYS 不通)。PIL 在 `~/.workbuddy/binaries/python/envs/default`。 +- 无 libwebp/GCC:`internal/storage/s3.go` 挡编译 → overlay 换桩 `dev/s3stub/s3_stub.go`。 +- 「编译卡死」= `proxy.golang.org` 不可达。每条 go 命令前 + `export GOPROXY=https://goproxy.cn,direct GOSUMDB=off GOFLAGS=-mod=mod`。 +- DB 测试:`DB_TYPE=postgres DB_USER=postgres DB_PASSWORD=15207786347hXPm DB_HOST=127.0.0.1 DB_PORT=5432`(DSN 不带库名)。 +- store 方法内用 `NewXStore(db.DB)`,别引用包级单例。 +- 本沙箱起不了 `TamaBox web`(session 固定 redis,6379 未开)→ HTTP 端到端只能部署后做。 +- python urllib 不稳定(用 curl);python 别用 `/tmp`;PIL 在 `~/.workbuddy/binaries/python/envs/default`。 -## 行尾 / 模板 / embed +## 行尾 / 模板 / embed(topics/embed.md) -- 行尾混合不可推断(`internal/db/*`、`mail.go`、`route/user/profile.go` 是 LF;`internal/route/route.go`、 - `users.go`、`i18n/dict_*.go`、`route/question/*.go`、`base.css`、`dev/theme-builder/*` 是 CRLF)。 - 改前用 Python 数 `b'\r\n'`;`gofmt -l` 会把 CRLF 误报为未格式化 → 走 `dev/gofmt_keep_crlf.py`。 - Edit 工具会保留原文件行尾,可放心用;新增整份文件用 Write 时要自己补 CRLF。 -- 往 gofmt 对齐组中间插键会污染 diff,新键插组末;注释别用 `''`(gofmt 改成 `”`)。 -- ⚠️ **`templates/embed.go` 是显式清单**:新增**顶层**模板必须加进 `//go:embed`,否则运行时 - `html/template: "xxx" is undefined` → 500,编译期无提示。`static/fs.go` 同理。 -- ⚠️ **`//go:embed` 的 `*` 不匹配 `_` / `.` 开头的文件**:`static/css/themes/_scaffold.css` 与 - 临时建的 `_gentest.css` **都不进 embed**,`TestDecoSlotCount` 扫不到它们(表现是"校验了但数字没变")。 - 验证生成的主题 CSS 要临时改成非下划线文件名。 -- `templates/user/moderation-strictness.html` 只用 shell/python 改(Edit/Write 会注入 `data-page-node-id`)。 +- 行尾混合不可推断,改前用 Python 数 `b'\r\n'`;gofmt 走 `dev/gofmt_keep_crlf.py`。 +- `templates/embed.go` 是显式清单:新增**顶层**模板必须加 `//go:embed`。 +- `//go:embed` 的 `*` 不匹配 `_`/`.` 开头文件。 -## 审核 / 处置 / 举报 +## 审核 / 处置 / 举报(topics/review.md) -- 线上通道 = 七牛(`ai.qiniuapi.com/v3/text/censor`,antispam);`[security] text_censor_source = qiniu|aliyun|auto`。 - 七牛只硬拦涉政/暴恐/色情,`review` 放行 → 裁决在 `censor/policy.go` + `moderation.Check`。 -- **新增审核调用点必须走 `moderation.Check`**(直调 `censor.Text` 绕过档位)。不可用时 **fail-closed**。 -- ⚠️ 圈内黑话(代称+群体标签+避雷叙述)通用审核拦不住,别指望词库;靠处置 + 举报 + 人工判断。 -- 严格度 lax/standard/strict 存 `users.moderation_strictness`;**受处置用户强制 strict**: - `moderation.EffectiveStrictness(ctx, userID, raw)`(7 个入口已改)。**查询失败回退用户设置** - (否则 DB 抖动会让全站突然加严)。处置期内拒绝保存 + 设置页 disabled。 -- ⚠️ **同请求渲染只能用 `ctx.SetError` / `SetInternalError`,不能用 `*Flash`**:flash 写 session,下次请求才读 → - 提示静默丢失。`Set*Flash + Redirect` 才是正常模式。扫描法:找 flash 调用 → 向下第一个 `Success(`/`Redirect(`。 -- 处置四级:L1 停止分发/L2 收窄公开(新回答强制私密、禁 set-public)/L3 冻结发布(仍可收信)/ - L4 整页停用(`/restricted`)。到期靠 `expires_at`,**无 cron**;`restrict` 是**替换语义**;比较用 `RestrictionAtLeast`。 -- ⚠️ L2 强制私密必须在**审核通过之后**,且与写回答**同一条 UPDATE**(`AnswerByIDPrivate`): - 拆开会留下「公开+已作答」窗口,第二条失败还会变成「私密+无回答」。 -- ⚠️ **`ListAPI`(`/api/v1/user/{domain}/questions`)不经过 Pager 中间件**,L4 与页面密码必须自己校验。 -- ⚠️ **整箱分享卡 `ShareCard` 与单题分享卡都要拦**,且拦截必须在缓存查询之前(否则 30 分钟内仍给旧图)。 -- 举报 `POST /_/{domain}/{qid}/report`:免登录 + 验证码 + 限流;同 IP 同题唯一索引 → - **幂等且提示与首次一致**(否则成了内容存在性探测器)。箱主只看「被举报 N 次」,**不给 IP**。 -- 闭环:删除/设私密/`hide-public` → `MarkAcceptedByQuestion`;待处理超 30 天视为过期。 - ⚠️ `hide-public` 里必须**先快照目标 ID 再更新**(更新后带 `is_private=false` 的子查询恒为空集)。 -- 告警:24h≥8 或 7d≥20 → 邮件到 `[security] security_alert_email`(24h 冷却);单条恰好 3 人举报 → 提醒箱主。 - ⚠️ 该邮箱为空时静默跳过、无日志;改配置必须重启。 -- `/rules` 是处置依据页(四语言);注册页必须勾 `agree_rules`(服务端同样校验),改 e2e 脚本要同步。 -- `restrict`/`unrestrict` 默认给箱主发通知(按 `users.language`,`mail/restriction-notice.html`), - **只含级别名/到期/规则链接,不含 `--reason`**;`--no-notify` 跳过。`--days > 90` 要 `--force`。 - ⚠️ **到期自动解除不发信**(读表比较时间)。 +- 线上通道 = 七牛;裁决在 `censor/policy.go` + `moderation.Check`,新增调用点必须走 `moderation.Check`,不可用时 fail-closed。 +- 严格度存 `users.moderation_strictness`;受处置用户强制 strict(`moderation.EffectiveStrictness`),查询失败回退用户设置。 +- 同请求渲染只能用 `ctx.SetError`/`SetInternalError`,不能 `*Flash`。 +- 处置四级 L1–L4;到期靠 `expires_at` 无 cron;`restrict` 是替换语义;比较用 `RestrictionAtLeast`。 +- L2 强制私密须在审核通过后、与写回答同一条 UPDATE(`AnswerByIDPrivate`)。 +- `ListAPI` 不经 Pager 中间件,L4 与页面密码须自校验;分享卡拦截须在缓存查询之前。 +- 举报:免登录+验证码+限流;同 IP 同题唯一索引 → 幂等;箱主只看次数不给 IP。 +- 告警 24h≥8 或 7d≥20 → 邮件;`[security] security_alert_email` 为空则静默跳过。 -## GORM +## GORM(topics/gorm.md) -- 默认值必须带引号;`default:` 会把零值替换,空串有语义的字段别加。 -- ⚠️ 事务里复用同一 `tx` 会串条件,每句 `tx.WithContext(ctx).<链式>`。 -- ⚠️ 软删除 + 唯一索引 = 槽位永久占用:停用(可恢复)= 物理删内容 + 软删用户行,注册侧 `Unscoped` 给 - `ErrDeactivatedEmail/Domain`;封禁 = 物理删用户行,邮箱释放。级联删除一律 `Unscoped()`。 -- ⚠️ GORM 链式对象 Count/Find 后带状态,统计/预览/更新必须各自重建 query。 +- 默认值必须带引号;事务里每句 `tx.WithContext(ctx)`;链式对象带状态,统计/更新各自重建 query。 +- 软删除+唯一索引 = 槽位永久占用;级联删除一律 `Unscoped()`。 -## 前端样式 +## 前端样式(topics/style.md) -- `static/css/base.css`(`?v=` 取 `conf.StaticVersion`,**改完必须 +1**)。令牌在 `:root`(亮)+ - `html[data-theme="dark"]`(暗)。新样式一律 `var(--tb-*)`,别写死色值,也别为深色另写分支。 -- 页面级样式内联在各自模板 `` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`
` + "\n") + b.WriteString(`

` + html.EscapeString(heading) + `

` + "\n") + b.WriteString(notice + "\n") + b.WriteString(`
` + "\n") + b.WriteString(`

` + "\n") + b.WriteString(`

` + "\n") + b.WriteString(`

Remember Me

` + "\n") + b.WriteString(`

` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`
` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`
` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`` + "\n") + b.WriteString(`` + "\n") + return []byte(b.String()) +} + +const honeypotCSS = `html{background:#f0f0f1}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;color:#3c434a} +#login{border:1px solid #dcdcde;background:#fff;width:320px;margin:5em auto;padding:26px 24px 46px;box-shadow:0 1px 3px rgba(0,0,0,.04)} +#login h1{text-align:center;margin:0 0 1em;font-size:24px;font-weight:400} +#login h1 a{color:#444;text-decoration:none} +#login form{margin-top:16px} +#login label{display:block;font-size:14px} +#login input[type=text],#login input[type=password]{width:100%;padding:5px 8px;border:1px solid #ddd;border-radius:3px;box-sizing:border-box;margin-top:4px} +#login .button{width:100%;padding:7px 12px;background:#2271b1;border:1px solid #2271b1;border-radius:3px;color:#fff;cursor:pointer;font-size:13px} +#login .submit{margin:16px 0 0} +#login_error{border-left:4px solid #d63638;background:#fcf0f1;padding:10px 12px;margin:12px 0} +#nav,.forgetmenot{font-size:13px;color:#50575e} +#footer{text-align:center;color:#646970;font-size:12px;margin:24px auto;max-width:320px} +` + +// NotFoundFooter 是 404 假页脚,用于给扫描器「后台存在但资源不存在」的错觉。 +const NotFoundFooter = "The requested resource was not found on this server." + +// LoginFailureNotice 是提交凭据后的统一提示(不区分「用户不存在」与「密码错误」, +// 避免因响应差异让爆破脚本调整策略;同时这也是虚假后台「存在」的证据)。 +const LoginFailureNotice = "ERROR: Invalid username or password." + +// WriteLoginPage 将假登录页写入响应。 +func WriteLoginPage(w http.ResponseWriter, vars LoginPageVars) { + body := RenderLoginPage(vars) + h := w.Header() + h.Set("Content-Type", "text/html; charset=utf-8") + h.Set("Cache-Control", "no-store, no-cache, must-revalidate") + // 诱饵页面绝不进入任何共享/边缘缓存,也不被中间层改写。 + h.Set("X-Robots-Tag", "noindex, nofollow") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) +} diff --git a/tamabox.go b/tamabox.go index 6361dd9..97ad9b8 100644 --- a/tamabox.go +++ b/tamabox.go @@ -28,6 +28,7 @@ func main() { cmd.Restrict, cmd.Unrestrict, cmd.HidePublic, + cmd.Honeypot, } if err := app.Run(os.Args); err != nil { logrus.WithError(err).Fatal("Failed to start application") diff --git a/templates/mail/honeypot-alert.html b/templates/mail/honeypot-alert.html new file mode 100644 index 0000000..3cb8f60 --- /dev/null +++ b/templates/mail/honeypot-alert.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+ 蜜罐捕获到破解尝试 +
+
+ {{.time}} +
+
+
+
+
来源 IP:{{.ip}}
+
网络归属:{{.provider}}
+
诱饵路径:{{.path}}
+
处置:{{.disposition}}
+ {{if .proxy_hint}} +
⚠️ 该 IP 属于 CDN / 代理网络,攻击者可随时更换出口 IP。
+ {{end}} +
+
捕获到的破解凭据:
+
+ 用户名:{{.username}}
+ 密码:{{.password}} +
+
+ 攻击者在假登录页上提交了凭据(假页面只返回静态内容,从不校验、也从不返回任何真实信息)。 + 完整记录(含 User-Agent、Referer、原始 body)已入库,可用 + TamaBox honeypot hits 命令查看。 +
+
+
+
+
+
+ 此邮件由系统自动发送,请勿直接回复。
+ {{ .year }} 狼的提问箱 +
+
+
+
+
+ +