cr0nica1/p2o-bot-updater
GitHub: cr0nica1/p2o-bot-updater
一个面向 Pwn2Own 赛事的 Discord 机器人和 CLI 工具,用于追踪目标设备的漏洞信息与固件版本,支持从 NVD/ZDI 自动同步数据并定时推送通知。
Stars: 0 | Forks: 0
# Pwn2Own Target Updater
## 描述
Pwn2Own Target Updater 是一个 Discord bot 和 CLI 工具包,用于追踪 Pwn2Own 目标的漏洞和固件信息。
该项目将标准化后的目标数据存储在 MongoDB 中,从公开来源同步漏洞信息,并提供用于目标管理、漏洞查找、计划通知和固件查找的 Discord slash command。它支持目标别名以实现更广泛的 CVE/ZDI 匹配,并支持为那些可以从供应商网页上发现固件的产品配置供应商固件。
主要功能:
- 管理目标、别名、供应商、类别和供应商固件别名。
- 从 CSV 导入目标。
- 从 NIST NVD 和 ZDI 公告页面同步漏洞信息。
- 在 Discord 中搜索并显示已存储的漏洞。
- 安排每日同步和通知任务。
- 配置供应商固件查找 URL 和 regex。
- 从已配置的供应商页面查找固件版本。
- 将存储的漏洞数据导出为 JSON。
## 架构
代码库采用分层架构:
```
src/updater/
├── domain/ # Core models and repository protocols
├── application/ # Use cases and business logic
├── infrastructure/ # MongoDB, browser, CSV, and external source adapters
├── presentation/
│ └── discord_bot/ # Discord bot, slash commands, config, formatting
└── cli/ # CLI entry points for firmware/vendor tools
```
### 领域层
领域层定义了核心数据模型和 repository 接口:
- `Target` — bot 追踪的产品或设备。
- `Vulnerability` — CVE/ZDI 公告数据。
- `TargetVulnerability` — 目标与漏洞之间的关联。
- `VendorConfig` — 供应商的固件查找设置,包括 URL 模板、HTML 元素 ID 和 regex。
### 应用层
应用层包含用例:
- 从已配置的来源同步漏洞。
- 目标 CSV 导入。
- JSON 导出。
- 使用目标供应商元数据和供应商固件配置进行固件查找。
### 基础设施层
基础设施层实现了外部 adapter:
- 用于目标、漏洞、链接、版本和供应商配置的 MongoDB repository。
- NVD 和 ZDI 漏洞来源。
- CSV 目标加载器。
- 使用 Playwright 进行固件页面抓取的浏览器 adapter。
### 表现层
表现层通过 Discord slash command 和 CLI 工具公开功能:
- 用于目标管理、漏洞同步/搜索、调度、供应商固件配置和固件查找的 Discord bot 命令。
- 用于供应商配置管理和固件查找的 CLI 命令。
## 安装说明
### 前置条件
- Python 3.10+
- 在本地或远程运行的 MongoDB
- 可访问互联网以进行漏洞同步和固件查找
- 启用了 **Server Members Intent** 的 Discord bot 应用程序
- 安装了用于固件查找的 Playwright Chromium
### 设置
创建并激活虚拟环境:
```
python -m venv .venv
. .venv/bin/activate
```
从 `requirements.txt` 安装运行时依赖项:
```
pip install -r requirements.txt
```
对于开发,请安装包含开发依赖项的包:
```
pip install -e ".[dev]"
```
安装用于固件查找的 Playwright 浏览器依赖项:
```
playwright install chromium
```
复制示例环境文件并填写您的值:
```
cp .env.example .env
```
所需的环境变量值:
```
DISCORD_TOKEN=...
DISCORD_GUILD_ID=...
DISCORD_CHANNEL_ID=...
DISCORD_ADMIN_ROLE_ID=...
SYNC_TIME=09:00
NOTIFY_TIME=09:15
TIMEZONE=UTC+7
MONGODB_URI=mongodb://localhost:27017
MONGODB_DATABASE=pwn2own_updater
```
运行测试:
```
python -m pytest -q
```
## 使用说明
### 启动 Discord bot
```
updater-bot --env .env
```
bot 在启动时会将 slash command 同步到已配置的 Discord guild 中。
### Discord 命令
目标管理:
```
/list-targets
/show-target target_id:
/add-target name: aliases: vendor: vendor_alias: category:
/remove-target names:
/import-targets file:
/clear-database confirm:DELETE
```
漏洞管理:
```
/add-vuln advisory_id: description: cvss_score: severity: references: target_name:
/sync-cves target:
/search-vulns severity: year: from_date: to_date:
```
调度:
```
/set-schedule sync_time: notify_time:
/show-schedule
```
供应商固件配置和查找:
```
/set-vendor-firmware vendor: url_template: attr_id: regex:
/import-vendor-firmware file:
/set-vendor-alias target_id: vendor_alias:
/lookup-firmware target_id: url_template: attr_id: regex:
```
固件查找使用目标的 `vendor` 来查找已保存的供应商固件配置,并使用目标的 `vendor_alias` 来渲染供应商 URL。如果目标没有供应商、没有供应商别名、没有已保存的供应商配置、URL/regex 不匹配,或者不支持固件查找,bot 将不会返回固件信息。
### 供应商固件 CSV 格式
批量供应商固件导入需要这些列:
```
vendor,url_template,attr_id,regex
Canon,https://example.com/{alias}/firmware,downloads,(v[\d.]+).*(https://[^"']+)
```
规则:
- `url_template` 必须使用 HTTPS。
- `url_template` 必须包含 `{alias}`。
- `attr_id` 是要抓取的 HTML 元素 ID。
- `regex` 必须包含至少两个捕获组:
- group 1:固件版本
- group 2:固件下载 URL
### CLI 工具
管理已保存的供应商固件配置:
```
vendor-config add \
--vendor Canon \
--url-template 'https://example.com/{alias}/firmware' \
--attr-id downloads \
--regex '(v[\d.]+).*(https://[^"'"']+)'
vendor-config list
vendor-config remove --vendor Canon
```
使用已保存的供应商配置查找目标的固件:
```
firmware-lookup --target-id 1
```
使用运行时 URL/regex 输入测试固件查找:
```
firmware-lookup \
--target-id 1 \
--url-template 'https://example.com/{alias}/firmware' \
--attr-id downloads \
--regex '(v[\d.]+).*(https://[^"'"']+)'
```
### 开发
运行完整的测试套件:
```
python -m pytest -q
```
标签:Discord, MongoDB, 固件管理, 机器人, 漏洞追踪, 特征检测, 逆向工具