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安全, 依赖管理, 垃圾邮件过滤, 安全事件响应, 安全响应, 安全漏洞扫描, 安全运维, 安全防护工具, 安全防护平台, 安全防护手段, 安全防护技术, 安全防护措施, 安全防护方法, 安全防护策略, 安全防护解决方案, 安全防护软件, 恶意软件监控, 操作系统监控, 网站安全扫描, 网络攻击检测, 自动化监控, 逆向工具