Prometheusbtr/sentinel
GitHub: Prometheusbtr/sentinel
Sentinel 是一款用于监控 WordPress 网站安全的无依赖工具,专注于检测赌场和投注垃圾邮件注入。
Stars: 0 | Forks: 0
# 哨兵
Sentinel 是一个小型、无依赖的看门狗,每天从外部扫描一队 WordPress 网站,并发送一份报告。它被构建来捕捉 2024 年至 2026 年影响 WordPress 网站的赌场和投注垃圾邮件注入,这种垃圾邮件悄无声息地将律师事务所的博客变成在线赌博的门页。
我在手动清理了五十多个受感染的 WordPress 网站之后编写了它。一旦网站被清理干净,真正的问题是保持干净。再感染很常见,没有人每天都会监视每个网站。Sentinel 会。
这个存储库是工具的消毒、公开版本。实际的网站列表和 SMTP 凭据生活在本地文件中,这些文件永远不会被提交(见配置)。
## 为什么单纯的扫描器不够
检查网站的最明显方法是查找主页上的垃圾邮件单词。这几乎错过了所有真正的感染,因为现代 WordPress 垃圾邮件是有意隐藏的:
- **伪装。** 供 Googlebot 服务的页面充满了赌场链接。供普通访客服务的页面看起来很正常。攻击者想要的是 Google 的排名,而不是你的点击,所以他们只向爬虫显示垃圾邮件。
- **从仪表板隐藏。** 注入的帖子不会在 wp-admin 或正常帖子列表中显示。它们被缝合在数据库层下方,或者用 CSS 隐藏。
- **文件投递者。** 单个恶意 PHP 文件在实时中重写页面 HTML,所以垃圾邮件永远不会出现在任何你可以编辑的帖子中。
- **恶意网站地图。** 一个假的网站地图在 `/?feed=xmlsitemap19` 或 `/sitemap19.xml` 处提供数千个垃圾邮件 URL,通常从 `robots.txt` 中引用。
主页上的关键字检查无法捕获这些。Sentinel 会针对每一个具体进行。
## 它实际上做了什么
每次运行,针对每个网站,Sentinel 都会进行少量仅限外部的请求,并运行两次扫描。
**第 1 轮,签名扫描** (`signature_scan.py`)。对经典注入的廉价指纹检查:
| 信号 | 含义 |
| --- | --- |
| `SITEMAP19` | 在 `/?feed=xmlsitemap19` 或 `/sitemap19.xml` 处提供的恶意垃圾邮件网站地图 |
| `ROBOTS` | `robots.txt` 将爬虫指向那个恶意网站地图 |
| `SITEMAP_KW` | 在真实 XML 网站地图中列出的赌场/投注关键字 URL |
| `POST_SPAM` | 一个发布的 REST 帖子,其 slug、标题或正文包含垃圾邮件关键字 |
**第 2 轮,深度检查** (`deep_checks.py`)。捕获上述规避的检查:
| 信号 | 含义 |
| --- | --- |
| `CLOAK` | Googlebot 视图包含垃圾邮件令牌或链接,而访客视图没有 |
| `HIDDEN_LINK` | 使用内联 CSS (`display:none`,屏幕外,零大小) 隐藏的锚点 |
| `BAD_SCRIPT` / `BAD_IFRAME` | 来自不在允许列表上的主机的外部脚本或 iframe |
| `REDIRECT` | 一个指向外部主机的 meta-refresh 或 JS 重定向 |
| `OBF_JS` | 混淆的内联 JavaScript (`eval(atob(...))`,长的 base64 块) |
| `IOC` | 页面中任何位置的已知垃圾邮件或命令和控制域 |
| `SPAM_LINK` | 一个与投注/赌场/恶意软件模式匹配的主机的外出链接 |
| `SUCURI` | Sucuri SiteCheck 报告恶意软件或黑名单命中 |
| `TLS?` | TLS 证书在 14 天内到期(信息性) |
## 我最关心的部分:不要哭狼
每天发送虚假警报的扫描器在一周内就会被忽视。这个项目的最难部分不是检测,而是信任。Sentinel 将真实警报与噪音分开,使每日电子邮件保持有意义。
最明显的例子是单词“赌场”。它在关于 `1031` 交换的合法税收文章中出现,而“老虎机”在合法移民文章中出现。“天真”的扫描会将两者都标记出来。Sentinel 不会。当签名扫描标记 `POST_SPAM` 命中时,协调器会获取该确切帖子并 **验证** 它,然后再发出警报。只有当帖子也显示真实事件签名时,它才会被提升为真实警报:
1. `post_modified` 是 `0000-00-00`(直接写入数据库并绕过正常保存流程的恶意软件),或者
2. 正文中出现已知垃圾邮件域,或者
3. 帖子链接到投注或赌场主机。
否则,它将报告为信息部分的关键字冲突,而不是警报。同样的想法贯穿于深度检查:检测到 Cloudflare 或 reCAPTCHA 机器人墙并将其降级,因为它使爬虫视图不可读,并且它本身不是恶意软件的迹象。来自已知 SaaS 和 CDN 提供商的外部脚本和 iframe 位于允许列表上,因此只有真正的第三方主机才会突出,这正是注入脚本的外观。
每天电子邮件有三个部分:**真实警报**(现在调查)、**信息性**(审查,未确认)和**短暂错误**(网络中断,下次运行重新检查)。
## 值得了解的设计决策
- **仅限外部,扫描不需要凭证。** Sentinel 从不登录网站。它只获取公共 URL。这使其可以安全地指向大量网站,这意味着这个工具的泄露不会泄露有关网站的任何信息。
- **故意低并发。** 它运行三个工作者。托管主机和 Web 应用程序防火墙会对激进的扫描进行速率限制或 IP 禁止,深度扫描每个网站需要几个请求。慢而安静胜过快而禁止。
- **在网站地图探测中阻止重定向。** 清理后的网站通常会 301 `/sitemap19.xml` 到其真实网站地图。如果扫描器遵循该重定向,它将读取一个干净的页面并错误地报告一个活动命中。Sentinel 只计算不是重定向的 `200`。
- **诚实地关于其限制。** 外部扫描无法看到隐藏在所有外部视图中的仅数据库伪装帖子,也无法看到隐藏在服务器端文件后门中的休眠服务器。这些需要经过身份验证的数据库或 SFTP 密码。Sentinel 是外部可以到达的最深处,并且它这样说,而不是假装自己是完整的。
- **无依赖。** Python 3.8+ 标准库。没有要 `pip install` 的东西,没有要修补的东西,很容易在任何盒子上运行。
## 配置
两个本地文件包含所有特定于网站的内容。两个都是 gitignored 并且从未发布。
```
cp .env.example .env # SMTP host, port, user, app password, from, to
cp sites.example.txt sites.txt # one domain per line
```
对于 Gmail 或 Google Workspace,请启用 2FA 并为 `SMTP_PASSWORD` 创建一个应用程序密码。不要使用账户的正常密码。
## 运行它
```
# 扫描整个舰队并发送报告
python3 sentinel.py
# 重新发送最新保存的报告(无需重新扫描,更改 .env 后使用)
python3 sentinel.py --resend
# 针对单个站点和单个引擎进行测试,打印到终端
python3 signature_scan.py example.com
python3 deep_checks.py example.com
```
## 安排它
`deploy/` 文件夹中有一个 systemd 用户定时器,在机器的本地时区每天 09:00 运行扫描。
```
cp deploy/sentinel.service deploy/sentinel.timer ~/.config/systemd/user/
# 在 sentinel.service 中编辑 ExecStart 路径以指向 run.sh
systemctl --user daemon-reload
systemctl --user enable --now sentinel.timer
loginctl enable-linger "$USER" # so the timer runs without an open session
systemctl --user list-timers sentinel.timer
```
`Persistent=true` 表示在机器睡眠时错过的一次运行将在下一次启动时赶上。
## 布局
```
sentinel.py orchestrator: runs both passes, verifies, classifies, emails
signature_scan.py pass 1: signature fingerprints for the classic injection
deep_checks.py pass 2: cloaking, injected links/scripts, IOC, Sucuri, TLS
deploy/ systemd timer, service, and the run wrapper
.env.example SMTP config template (copy to .env)
sites.example.txt fleet list template (copy to sites.txt)
```
## 关于这里威胁情报的说明
`signature_scan.py` 和 `deep_checks.py` 中的垃圾邮件关键字列表和已知入侵指标域来自真实感染。它们是攻击者基础设施和检测模式,共享以便其他人可以重用它们。此存储库中没有客户端数据、真实网站列表和凭证。
## 许可证
MIT。请参阅 [LICENSE](LICENSE).
标签:Clean Code, PB级数据处理, SEO作弊检测, URL收集, WordPress安全, 依赖管理, 垃圾邮件过滤, 安全事件响应, 安全响应, 安全漏洞扫描, 安全运维, 安全防护工具, 安全防护平台, 安全防护手段, 安全防护技术, 安全防护措施, 安全防护方法, 安全防护策略, 安全防护解决方案, 安全防护软件, 恶意软件监控, 操作系统监控, 网站安全扫描, 网络攻击检测, 自动化监控, 逆向工具