raghubirrajmahato15/HackDev-PhishGuard

GitHub: raghubirrajmahato15/HackDev-PhishGuard

结合启发式规则、同形异义字仿冒检测、域名年龄查询和可选机器学习的钓鱼URL检测命令行工具。

Stars: 0 | Forks: 0

# HackDev-PhishGuard [![测试](https://static.pigsec.cn/wp-content/uploads/repos/cas/ba/babb5334241d8d8db5d9626d913733c8bb9b24d09b622e29e0cf84b6913fb0be.svg)](https://github.com/raghubirrajmahato15/HackDev-PhishGuard/actions/workflows/test.yml) 启发式 + 仿冒/同形异义字检测 + 域名年龄 + 可选机器学习钓鱼 URL 检测器。 **HackDev** 开源网络安全工具包的一部分。 ## 功能 - **启发式评分引擎**(始终可用,无额外依赖):URL 长度、子域名计数、IP 地址主机、`@` 掩码 技巧、已知 URL 缩短服务、可疑 TLD、可疑关键词、过多的连字符、punycode、数字密集型域名 - **仿冒/同形异义字检测**:基于从零开始的 Levenshtein 编辑距离实现,结合同形异义字规范化(`0`→`o`, `1`→`l`,`rn`→`m`),与精选的约 50 个主要品牌域名列表进行比对——能够标记 `paypa1.com` 或 `g00gle.com` 等近似错误,同时不会标记真实的品牌域名本身 - **域名年龄查询**:通过免费的 RDAP 协议(无需 API key)实现;最近注册的域名(典型的钓鱼信号) 会增加风险评分;对于不提供 RDAP 的注册局或在任何查询失败时,会平稳降级为仅使用启发式检测 - **可选的 ML 层**(`--ml` 标志):在包含留出测试集的 800 个合成数据集上训练 `RandomForestClassifier`, 报告准确率/精确率/召回率和特征重要性;将 ML 概率与启发式评分结合;如果 scikit-learn/joblib 或训练好的模型不可用,则会平稳降级 - **批量扫描**(`--file urls.txt`),并提供判定结果直方图摘要 - **CLI 子命令**:`scan` 和 `train`;支持 JSON 和文本输出;文件输出;详细日志记录 ## 安装 ``` git clone https://github.com/raghubirrajmahato15/HackDev-PhishGuard.git cd HackDev-PhishGuard pip install -r requirements.txt ``` 启发式 + 仿冒评分仅需标准库。域名年龄查询需要 `requests`; `--ml`/`train` 层需要 `scikit-learn`、`joblib` 和 `numpy`(均为可选——在没有它们的情况下 该工具会平稳降级)。 ## 用法 扫描单个 URL: ``` python phishguard.py scan "http://paypa1-secure-login.top/verify/account" ``` 扫描 URL 列表,输出带有判定直方图的 JSON,并写入文件: ``` python phishguard.py scan --file urls.txt --format json -o results.json ``` 训练并使用 ML 层: ``` python phishguard.py train --samples 800 python phishguard.py scan "http://192.168.1.5/secure/signin" --ml ``` 跳过 RDAP 域名年龄查询(速度更快,完全离线): ``` python phishguard.py scan "https://example.com" --no-domain-age ``` 仿冒 + 可疑 TLD URL 的 JSON 输出示例: ``` { "results": [ { "url": "http://paypa1-secure-login.top/verify/account", "score": 44, "verdict": "suspicious", "reasons": [ "Suspicious top-level domain", "Suspicious keyword(s) in host/path: account, login, secure, verify", "Multiple hyphens in domain (2)" ], "ml_score": null, "typosquat_matches": [], "domain_age_days": null } ], "histogram": { "suspicious": 1 } } ``` `train` 输出示例: ``` Trained on 640 samples (160 held out for testing). Accuracy: 0.981 Precision: 0.975 Recall: 0.988 Feature importances: num_suspicious_keywords 0.3226 length 0.2747 ... Model saved to .../phishguard_model.joblib ``` ## CLI 标志参考 | 标志 | 子命令 | 描述 | |---|---|---| | `url`(位置参数) | `scan` | 要扫描的单个 URL(或使用 `--file`) | | `--file FILE` | `scan` | 包含 URL 的文本文件路径,每行一个,用于批量扫描 | | `--ml` | `scan` | 启用 ML 评分层(如果不可用,则回退到仅使用启发式检测) | | `--no-domain-age` | `scan` | 跳过 RDAP 域名年龄查询 | | `-o, --output PATH` | `scan` | 将结果写入文件而不是 stdout | | `--format {text,json}` | `scan` | 输出格式(默认:`text`) | | `--samples N` | `train` | 合成训练样本的数量(默认:`800`) | | `-v, --verbose` | all | 启用详细(DEBUG 级别)日志记录 | | `--version` | — | 显示版本并退出 | ## 项目布局 ``` phishguard.py Thin CLI entrypoint hackdev_phishguard/ features.py URL feature extraction (pure, shared by heuristic + ML) heuristic.py Weighted risk scoring typosquat.py Levenshtein + homoglyph brand-domain comparison domain_age.py RDAP domain-age lookup ml.py Synthetic dataset, RandomForest train/predict cli.py argparse wiring, orchestration, batch histogram tests/ pytest suite ``` ## 测试 ``` pip install -r requirements-dev.txt pytest -q ``` 涵盖特征提取、启发式评分的确定性、针对已知距离的 Levenshtein 实现、同形异义字规范化、 对已知近似错误的仿冒检测(能正确识别且不标记真实的品牌域名)、使用模拟 HTTP 响应的 RDAP 域名年龄查询 (成功、格式错误、HTTP 失败、网络异常),以及 ML 训练/预测往返测试(如果未安装 scikit-learn,则 通过 `pytest.importorskip` 平稳跳过)。 ## 法律声明 PhishGuard 是一种防御性威胁检测辅助工具,旨在为安全分析师和研究人员提供支持。它**不能保证** URL 的安全性或恶意性,且每一层(启发式、仿冒、域名年龄、ML)都可能产生误报和漏报。在采取任何 行动之前,应始终结合人工审查和其他威胁情报来源来印证该工具的发现。
标签:Apex, Python, URL检测, 反网络钓鱼, 安全规则引擎, 无后门, 机器学习, 网络安全, 逆向工具, 隐私保护