nirvana58/phishgaurd

GitHub: nirvana58/phishgaurd

PhishGuard 是一款结合机器学习异常检测与多源实时威胁情报的命令行 URL 威胁扫描器,可对可疑 URL 进行快速研判并输出多格式安全分析报告。

Stars: 0 | Forks: 0

# 🔍 PhishGuard — URL 威胁扫描器 一个基于 CLI 的 URL 威胁检测系统,由机器学习异常检测、实时威胁情报 API、WHOIS 域名情报和多格式报告生成功能驱动 — 所有操作均可通过单一的交互式终端菜单进行控制。 ``` ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄██████████████████████████▄▄ ▄▄██████████████████████████████████▄▄ ▄██████████████ ██████████████▄ ▄████████████ ╔════════════╗ ████████████▄ ██████████ ║ ● ● ● ║ ██████████ █████████ ║ ◉◉◉◉◉ ║ █████████ █████████ ║ ◉ ▓▓▓ ◉ ║ █████████ █████████ ║ ◉◉◉◉◉ ║ █████████ ██████████ ║ ● ● ● ║ ██████████ ▀████████████ ╚════════════╝ ████████████▀ ▀██████████████ ██████████████▀ ▀▀██████████████████████████████████▀▀ ▀▀██████████████████████████▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ [ TARGET : incoming URL ] [ STATUS : SCANNING... ] [ ENGINE : PHISHGUARD ] [ THREAT : ANALYZING… ] ██████╗ ██╗ ██╗██╗███████╗██╗ ██╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ ██████╗ ██╔══██╗██║ ██║██║██╔════╝██║ ██║██╔════╝ ██║ ██║██╔══██╗██╔══██╗██╔══██╗ ██████╔╝███████║██║███████╗███████║██║ ███╗██║ ██║███████║██████╔╝██║ ██║ ██╔═══╝ ██╔══██║██║╚════██║██╔══██║██║ ██║██║ ██║██╔══██║██╔══██╗██║ ██║ ██║ ██║ ██║██║███████║██║ ██║╚██████╔╝╚██████╔╝██║ ██║██║ ██║██████╔╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ``` ## 目录 - [概述](#overview) - [功能](#features) - [架构](#architecture) - [技术栈](#tech-stack) - [项目结构](#project-structure) - [安装说明](#installation) - [快速开始](#quick-start) - [用法](#usage) - [交互式菜单](#interactive-menu) - [直接 CLI 命令](#direct-cli-commands) - [训练模型](#training-the-model) - [管理面板 (Web)](#admin-panel-web) - [机器学习](#machine-learning) - [威胁情报源](#threat-intelligence-sources) - [报告格式](#report-formats) - [配置](#configuration) - [API 参考](#api-reference) ## 概述 PhishGuard 使用多层方法检测恶意 URL: 1. **ML 异常检测** — 基于 URL 结构特征训练的 K-means + 自组织映射 (SOM)。标记与已知正常模式相比在统计上显得异常的 URL。无需标注的数据集。 2. **外部威胁情报** — 并发查询 VirusTotal(70+ 防病毒引擎)、Google Safe Browsing(实时钓鱼/恶意软件)和 URLhaus(活跃的恶意软件分发 URL)。 3. **WHOIS / RDAP** — 域名年龄、注册商、国家、域名服务器、新注册域名检测 — 通过 HTTPS 进行(不依赖 43 端口)。 4. **报告生成** — 完整的扫描报告保存为 Markdown、PDF、DOCX 和 TXT 格式,每个情报源都有专门的部分。可通过本地 Ollama 生成可选的 LLM 叙述。 ## 功能 - **交互式终端菜单** — 方向键导航,无需记忆命令 - **单 URL 扫描** 支持实时轮询和即时结果显示 - **批量扫描** 从 `.txt` 或 `.csv` 文件执行 — 一个批次 ID,一份汇总报告 - **异步扫描流水线** — VT + Safe Browsing + URLhaus + WHOIS 全部并发触发 - **ML 异常评分** — K-means + SOM 独立运行;分歧将作为置信度信号呈现 - **基于 RDAP 的 WHOIS** — 使用 HTTPS(443 端口),无 43 端口防火墙问题 - **URLhaus 集成** — 在防病毒引擎之前捕获活跃的恶意软件分发 URL - **多格式报告** — `.md` `.txt` `.pdf` `.docx` + 丰富的终端输出 - **LLM 报告增强** — 本地 Ollama 生成威胁叙述(可选) - **Web 管理面板** — 仪表板、扫描历史、模型管理器、标签管理器、快速扫描 - **离线模型训练** — 从积累的扫描记录或任何 CSV 数据集中进行训练 - **模型热重载** — 无需重启服务器即可交换 ML 产物 - **任务取消** — 可在运行中途取消单个扫描或整个批次 - **WAL 模式 SQLite** — 支持并发读写;管理面板永远不会阻塞 CLI ## 架构 ``` Interactive Menu (cli/menu.py) │ │ HTTP (sync httpx) ▼ FastAPI Server (server/main.py + api.py) │ │ asyncio.Queue ▼ Scan Worker (server/queue_worker.py) │ │ asyncio.gather ──────────────────────────────────────┐ ▼ │ Feature Extraction ML Scoring External APIs │ (core/features.py) (core/models.py) │ 17 URL features K-means + SOM VirusTotal Safe Browsing │ synchronous synchronous URLhaus WHOIS/RDAP │ └───────────async─────────┘ │ ▼ Verdict Engine (server/scanner.py) Priority: Safe Browsing → URLhaus online → VT ≥3 → ML → WHOIS → SAFE │ ▼ Report Generator (report/generator.py) Terminal │ Markdown │ TXT │ PDF │ DOCX │ ▼ SQLite (WAL mode, QueuePool) scan_jobs │ batch_jobs │ feature_vectors │ feedback ``` ## 技术栈 | 层级 | 技术 | |---|---| | **服务器** | FastAPI, Uvicorn | | **数据库** | 通过 SQLModel 使用 SQLite (WAL 模式, QueuePool) | | **HTTP 客户端** | httpx (扫描器中为异步,CLI 中为同步) | | **ML — 聚类** | scikit-learn (K-means + StandardScaler) | | **ML — 拓扑** | MiniSom (自组织映射) | | **报告** | reportlab (PDF), python-docx (DOCX), rich (终端) | | **LLM** | Ollama (本地,可选) | | **CLI 菜单** | questionary + rich | | **WHOIS** | 基于 HTTPS 的 RDAP (rdap.org, rdap.iana.org, Verisign) | | **环境配置** | python-dotenv | ## 项目结构 ``` phishguard/ ├── server/ │ ├── main.py # App entry point, thread pool, lifespan │ ├── api.py # All API routes │ ├── scanner.py # Scan orchestrator (features → ML → APIs → verdict) │ ├── queue_worker.py # asyncio.Queue worker with cancellation │ ├── db.py # SQLModel schema, WAL mode, CRUD helpers │ ├── migrations.py # Idempotent schema migrations │ └── static/ │ └── admin.html # Web admin panel (single file) │ ├── core/ │ ├── features.py # URL → 17-feature vector (shared) │ ├── models.py # Loads artifacts, K-means + SOM scoring │ ├── whois_lookup.py # RDAP-first WHOIS, in-process cache │ └── urlhaus.py # URLhaus API client (URL + host lookup) │ ├── training/ │ ├── train.py # Offline training: DB / CSV streaming / feature CSV │ └── artifacts/ # scaler_*.pkl kmeans_*.pkl som_*.pkl latest.json │ ├── report/ │ └── generator.py # 5 renderers: terminal, md, txt, pdf, docx │ ├── cli/ │ ├── client.py # Direct CLI: scan, batch, cancel, admin, check-ollama │ └── menu.py # Interactive option-based terminal menu │ ├── reports/ # Generated report files saved here ├── data.db # SQLite database ├── .env # API keys (not committed) ├── .env.example # Key template └── requirements.txt ``` ## 安装说明 **要求:** Python 3.11+ ``` # 克隆仓库 git clone https://github.com/yourusername/phishguard.git cd phishguard # 安装依赖 pip install -r requirements.txt # 复制 env 模板并填入你的 API keys cp .env.example .env ``` **`.env` 文件:** ``` VIRUSTOTAL_API_KEY=your_virustotal_key_here GOOGLE_SAFE_BROWSING_API_KEY=your_google_key_here ``` ## 快速开始 ``` # 终端 1 — 启动服务器 uvicorn server.main:app --port 8000 # 终端 2 — 打开交互式菜单 python -m cli.menu ``` 菜单会自动连接到服务器,并显示实时的服务器状态指示灯。 ## 用法 ### 交互式菜单 ``` python -m cli.menu # 使用自定义服务器 URL python -m cli.menu --server http://192.168.1.100:8000 ``` ``` Main Menu: ❯ 🔍 Scan URL 📋 Check Scan Status ✕ Cancel Scan / Batch 📦 Batch Scan 🕑 Scan History 📄 Generate Report 🧠 Train Model ⚙️ Admin 🔧 Settings ❌ Exit ``` 使用方向键导航,按 Enter 键选择。每个选项仅会提示其所需的信息。 ### 直接 CLI 命令 对于脚本和自动化任务,请直接使用 `cli/client.py`: ``` # 扫描单个 URL python -m cli.client scan https://suspicious-site.tk # 使用 LLM 报告增强进行扫描 python -m cli.client scan https://example.com --llm # 仅扫描并保存特定格式 python -m cli.client scan https://example.com --formats md,pdf # 即发即忘(不等待结果) python -m cli.client scan https://example.com --async # 检查先前扫描的状态 python -m cli.client status # 为任何过往扫描重新生成报告 python -m cli.client report --formats pdf,docx # 取消正在运行的扫描 python -m cli.client cancel ``` **批量扫描:** ``` # 从纯文本文件(每行一个 URL) python -m cli.client batch urls.txt # 从 CSV 文件扫描 python -m cli.client batch urls.csv --column url # 带自定义分隔符的 CSV python -m cli.client batch data.csv --column website --delimiter ";" # 扫描前预览 CSV 列 python -m cli.client batch data.csv --preview # 批量为每个 URL 生成 LLM 摘要 python -m cli.client batch urls.csv --column url --llm # 取消整个批处理 python -m cli.client cancel-batch ``` **管理员命令:** ``` # 服务器统计信息 python -m cli.client admin stats # 重新训练后热重载 ML 模型 python -m cli.client admin reload # 为训练反馈标注扫描结果 python -m cli.client admin label malicious python -m cli.client admin label benign # 诊断 Ollama 连接 python -m cli.client check-ollama python -m cli.client check-ollama --test ``` ### 训练模型 PhishGuard 采用**离线训练** — 服务器仅加载预训练的产物。只要有足够的新数据就可以随时进行训练,然后无需重启即可热重载。 **基于积累的扫描数据进行训练(默认):** ``` python -m training.train ``` **基于 URL 的 CSV 文件进行训练(无需扫描 — 自动提取特征):** ``` # 使用 PhishTank 导出、URLhaus 下载或你自己的数据集 python -m training.train --csv phishtank.csv --url-column url # 同时将提取的特征向量保存到 DB 以便将来重用 python -m training.train --csv phishtank.csv --url-column url --save-to-db ``` **基于预计算的特征列进行训练:** ``` python -m training.train --csv features.csv --all-features python -m training.train --csv data.csv --feature-columns url_length,entropy,digit_ratio ``` **训练后进行热重载(无需重启服务器):** ``` # 通过 CLI python -m cli.client admin reload # 通过管理面板 # 管理 → Model Manager → 重载 Model Artifacts ``` 对于大型数据集,训练过程会显示实时进度条。包含数百万行的文件将通过逐行处理的方式进行,无需将整个文件加载到内存中。 ### 管理面板 (Web) 在服务器运行时打开 [http://localhost:8000/admin](http://localhost:8000/admin)。 | 板块 | 功能说明 | |---|---| | **仪表板** | 判定结果的甜甜圈图、扫描计数、任务状态、最近的扫描 | | **扫描历史** | 可搜索/可过滤的所有扫描表格,可深入查看完整结果 | | **模型管理器** | 活跃模型版本、训练说明、一键热重载 | | **标签管理器** | 将扫描标记为恶意/良性,以构建训练反馈 | | **快速扫描** | 直接从浏览器提交 URL,结果内嵌显示 | ## 机器学习 ### 为什么使用无监督学习? 恶意 URL 是一个不断变化的目标。基于昨天钓鱼域名训练的监督分类器无法捕捉到今天新注册的域名。PhishGuard 采用**异常检测** — 学习正常 URL 的样子并标记偏差 — 这样它就能在不需持续更新标注数据集的情况下捕捉新型威胁。 ### 特征向量(17 个特征) | 特征 | 测量内容 | |---|---| | `url_length` | URL 总字符数 | | `domain_length` | 主机/域名部分的长度 | | `path_length` | URL 路径的长度 | | `query_length` | 查询参数的长度 | | `num_subdomains` | 子域名深度 | | `num_dots` | 点的总数 | | `num_hyphens` | 连字符数量 | | `num_digits` | 数字数量 | | `digit_ratio` | 数字 / 总长度 | | `special_char_ratio` | 非字母数字字符 / 总长度 | | `shannon_entropy` | URL 字符串的随机性 (0–5+) | | `has_at_symbol` | 是否存在 `@` (隐藏真实目的地) | | `has_ip_host` | 使用 IP 地址而不是域名 | | `is_https` | 是否使用 HTTPS | | `suspicious_tld` | TLD 是否在已知不良列表中 (.tk .xyz .gq 等) | | `num_query_params` | `?key=value` 键值对的数量 | | `typosquat_distance` | 与最接近的热门域名的编辑距离 | ### K-means 聚类 根据 URL 的特征向量将其划分为 8 个簇 (K=8)。在扫描时,URL 会被分配到其最近的簇,并测量到该簇中心的距离。距离任何簇中心都很远的 URL 都是异常的。分数 > 1.0 = 明显异常。 ### 自组织映射 (SOM) 一个 10×10 的神经网格,用于学习 URL 特征空间的拓扑结构。相似的 URL 会落在附近的神经元上;不寻常的 URL 会落在稀疏、未填充的区域。**量化误差**(URL 向量到其最佳匹配单元的距离)即为异常信号。它可以捕捉到落在 K-means 簇*之间*、仅靠 K-means 会遗漏的 URL。 ### 综合评分 ``` combined_score = 0.5 × kmeans_score + 0.5 × som_score ``` 当两个模型都独立地将某个 URL 标记为异常时,结果将带有 `models_agree: true` 并且具有更高的置信度。当它们得出不同结论时,报告会明确将其标记为混合信号。 ## 威胁情报源 ### 判定优先级顺序 ``` 1. Google Safe Browsing → MALICIOUS (real-time, high authority) 2. URLhaus actively online → MALICIOUS 3. VirusTotal ≥ 3 engines → MALICIOUS 4. VT 1–2 engines + ML agree → SUSPICIOUS 5. ML combined score alone → SUSPICIOUS 6. WHOIS newly registered domain → SUSPICIOUS 7. No signals → SAFE ``` ### VirusTotal 使用 70 多个防病毒引擎检查 URL。需要免费的 API 密钥。最擅长捕捉具有既定特征码的已知恶意软件。 ### Google Safe Browsing 由 Google 维护的实时钓鱼、恶意软件和不需要的软件检测。需要免费的 API 密钥。 ### URLhaus (abuse.ch) 实时追踪积极分发恶意软件的 URL — 通常在防病毒引擎更新其特征码之前。**免费,无需 API 密钥。** 检查特定的 URL 和主机域名。URLhaus 中的“活跃在线”命中记录会立即触发 MALICIOUS 判定。 ### WHOIS / RDAP 通过基于 HTTPS 的 RDAP 获取域名注册情报(无需 43 端口)。返回域名年龄、注册商、国家、域名服务器数量,并标记新注册的域名(< 30 天) — 这是一个强烈的钓鱼指标。结果按域名缓存 1 小时。 ## 报告格式 每份报告都包含以下独立部分: 1. **概述** — URL、判定结果、置信度、扫描 ID、时间戳 2. **信号摘要** — 以项目符号列表形式列出所有判定原因 3. **ML 异常检测** — K-means 分数/聚类、SOM 分数/BMU、综合评分、一致性标志 4. **外部威胁情报** — VirusTotal 计数、Safe Browsing 威胁类型 5. **URLhaus** — URL 列表状态、威胁类型、恶意软件标签、主机 URL 计数、Spamhaus/SURBL 黑名单状态 6. **WHOIS 域名情报** — 注册商、国家、域名年龄(颜色编码)、到期时间、域名服务器、风险标志 7. **URL 特征分解** — 包含内嵌风险标记的全部 17 个特征 8. **AI 分析** *(可选)* — 通过本地 Ollama 生成的 LLM 威胁叙述 ### 格式选项 | 格式 | 说明 | |---|---| | **终端** | 丰富的色彩编码输出,包含表格、面板和内嵌标志 | | `.md` | 包含表格的完整 Markdown — 可在 GitHub、Obsidian 等平台上渲染 | | `.txt` | 纯文本,60 字符宽 — 随处可读,适合用于日志记录 | | `.pdf` | ReportLab — 专业的布局,带有样式化的表格和彩色判定标题 | | `.docx` | python-docx — 可编辑的 Word 文档,带有表格网格样式 | **批量报告** 会生成一份涵盖批次中所有 URL 的合并文件,包含每个 URL 的摘要表格和单独的详细信息部分。 ## 配置 ### 环境变量 | 变量 | 默认值 | 描述 | |---|---|---| | `VIRUSTOTAL_API_KEY` | — | VirusTotal API 密钥(可选) | | `GOOGLE_SAFE_BROWSING_API_KEY` | — | Google Safe Browsing 密钥(可选) | | `OLLAMA_MODEL` | 自动检测 | 用于 LLM 报告的 Ollama 模型 | | `OLLAMA_HOST` | `http://localhost:11434` | Ollama 服务器 URL | | `BATCH_MAX_URLS` | 无限制 | 每次批量提交的最大 URL 数量 | ### LLM 设置(可选) PhishGuard 可以使用通过 [Ollama](https://ollama.com) 本地运行的 LLM 生成的 AI 威胁叙述来增强报告。 ``` # 安装 Ollama(针对你的平台请参见 ollama.com) # 拉取模型 ollama pull llama3 # 启动 Ollama ollama serve # 诊断连接 python -m cli.client check-ollama --test # 在扫描中使用 LLM python -m cli.client scan https://example.com --llm ``` ### 运行服务器 ``` # 开发环境(代码更改时自动重载) uvicorn server.main:app --port 8000 --reload # 生产环境 uvicorn server.main:app --port 8000 --workers 1 ``` ## API 参考 | 方法 | 路由 | 描述 | |---|---|---| | `POST` | `/scan` | 提交 URL → `scan_id` | | `GET` | `/scan/{id}` | 轮询状态 + 结果 | | `POST` | `/scan/{id}/cancel` | 取消排队中/运行中的扫描 | | `GET` | `/scan/{id}/report?fmt=pdf` | 下载报告文件 | | `POST` | `/batch | 提交 URL 列表 → `batch_id` | | `GET` | `/batch/{id}?page=1&page_size=200` | 轮询批次进度(分页) | | `POST` | `/batch/{id}/cancel` | 取消批次中的所有扫描 | | `GET` | `/batch/{id}/report?fmt=md` | 下载批次报告 | | `POST` | `/admin/reload-model` | 热交换 ML 产物 | | `POST` | `/admin/label/{id}` | 将扫描标记为恶意/良性 | | `GET` | `/admin/stats` | 判定计数 + 模型版本 | | `GET` | `/admin/scans?limit=100` | 扫描历史 | | `GET` | `/admin` | Web 管理面板 | | `GET` | `/health` | 轻量级健康检查 | 在服务器运行时,可在 [http://localhost:8000/docs](http://localhost:8000/docs) 获取交互式 API 文档。 ## 依赖要求 ``` Python >= 3.11 fastapi==0.138.2 uvicorn==0.49.0 sqlmodel==0.0.39 httpx==0.28.1 python-dotenv==1.2.2 scikit-learn==1.8.0 MiniSom==2.3.6 rich==15.0.0 python-docx==1.2.0 reportlab==4.4.10 python-whois==0.9.6 questionary ollama==0.6.2 (optional — only needed for --llm) ``` 安装所有内容: ``` pip install -r requirements.txt ``` 由 Lakshmeesha Suvarna 构建
标签:AI风险缓解, Apex, AV绕过, FastAPI, URL威胁检测, 威胁情报, 开发者工具, 异步任务, 机器学习, 运行时操纵, 逆向工具