PhishCollector 是一个用于收集、分析和跟踪钓鱼网站的研究框架。
PhishCollector 是一个用于收集、分析和追踪钓鱼网站的 研究框架。它有意设计成一个起点——检测规则、技术特征、词表和插件都是纯数据结构,研究人员应当阅读、扩展并根据自身威胁态势进行调整。
提交可疑 URL 后,PhishCollector 将:
所有结果均可通过 REST API、Web 仪表板 和 CLI 访问。


cp .env.example .env # 进行配置(见下文)
docker compose up --build # 启动 db + app + frontend
| 服务 | URL |
|---|---|
| GUI | http://localhost:3000 |
| API 文档 | http://localhost:8000/docs |
| 数据库 | localhost:5432 |
所有设置均为以 PHISH_ 前缀的环境变量。将 .env.example 复制为 .env 并调整。
将所有出站流量路由通过代理,可让分析人员的 IP 对钓鱼服务器保持隐藏。
PHISH_PROXY_URL=socks5://127.0.0.1:9050
PHISH_PROXY_SSL_VERIFY=true # Tor 不会拦截 TLS
Burp 充当 TLS 中间人,并为每个 HTTPS 连接提供其自己的 CA 证书。如果不禁用 SSL 验证,通过代理的每个 HTTPS 请求都将失败。
PHISH_PROXY_URL=http://127.0.0.1:8080
PHISH_PROXY_SSL_VERIFY=false # Burp / 拦截代理必需
注意:
PHISH_PROXY_SSL_VERIFY=false仅影响 Python 后端(插件、指纹识别器、爬虫)发起的出站 HTTPS 连接。Playwright 浏览器无论此设置如何,都已使用ignore_https_errors=true运行。
警告: 切勿在没有配置代理时将
PHISH_PROXY_SSL_VERIFY设置为false——这会使所有外部 API 调用(URLhaus、VirusTotal)的证书验证失效。
基础路径:/api/v1
完整的交互式文档位于 /docs(Swagger UI)。
curl -X POST http://localhost:8000/api/v1/collections \
-H 'Content-Type: application/json' \
-d '{"url": "https://suspicious-site.example.com", "use_wordlist": true}'
# 安装(在容器内或使用 requirements.txt 的本地 venv 中)
pip install -e .
# 提交 URL 并等待完成
phishcollector collect https://target.example.com --wait
# 结合词表模糊测试
phishcollector collect https://target.example.com --wordlist --wait
# 列出最近的任务
phishcollector list
# 查看完整详情
phishcollector detail <job-id>
# 下载截图
phishcollector screenshot <job-id> -o capture.png
# 按技术栈 / favicon 哈希 / 国家搜索
phishcollector search --tech WordPress --country RU
phishcollector search --favicon-hash -1234567890
需要从 auth.abuse.ch 获取免费的 Auth-Key。
PHISH_URLHAUS_ENABLED=true
PHISH_URLHAUS_API_KEY=<您的认证密钥>
需要从 virustotal.com 获取免费或付费的 API 密钥。
PHISH_VIRUSTOTAL_API_KEY=<您的密钥>
当某个 URL 尚未被 VT 分析过时,PhishCollector 会提交其进行扫描,并每 30 秒自动重取结果,直到解析完成。
每个插件是 phishcollector/plugins/ 下的一个单独文件,暴露一个异步函数:
# phishcollector/plugins/myplugin.py
from . import CheckResult
async def check(url: str, proxy_url=None, ssl_verify=True) -> CheckResult:
# 在此查询您的源 / API
return CheckResult(
plugin_name="myplugin",
status="malicious", # malicious | suspicious | clean | unknown | error
score=0.95, # 0.0–1.0,或 None
result={"raw": ...}, # 存储为 JSONB,在 GUI 中显示
)
然后在 phishcollector/plugins/runner.py 中注册:
from .myplugin import check as myplugin_check
tasks.append(myplugin_check(url, proxy_url=settings.proxy_url, ssl_verify=settings.proxy_ssl_verify))
无需其他更改——结果会自动存储、在仪表板中显示,并计入威胁评分。
检测引擎有意保持为 纯、可读的数据,以便研究人员针对其追踪的工具包和攻击活动进行调整。所有内容位于一个文件中:
phishcollector/collector/fingerprint.py
PHISHING_PATTERNS — 针对渲染后的 HTML + JS 扫描的正则规则每个条目是一个 (正则表达式, 可读标签) 元组,按类别分组。任何类别中的匹配都会显示在 指标 标签页,并计入威胁评分。
PHISHING_PATTERNS: dict[str, list[tuple[str, str]]] = {
"credential_harvest": [
(r"document\.getElementById\(['\"]password['\"]", "JS 通过 ID 读取密码字段"),
(r"btoa\s*\(.*password", "对密码进行 Base64 编码"),
# 在此添加您自己的规则……
],
"obfuscation": [
(r"\beval\s*\(", "使用 eval()"),
(r"atob\s*\(", "运行时 Base64 解码"),
],
"exfiltration": [
(r"api\.telegram\.org/bot", "Telegram bot 外泄"),
(r"@(?:gmail|yahoo|hotmail|outlook)\.com", "代码中的免费邮箱地址"),
],
"antibot": [
(r"navigator\.webdriver", "WebDriver 属性检查"),
(r"ipqualityscore|ipqs\.com", "IPQS 反机器人服务"),
],
"kit_indicators": [
(r"office365|microsoft365", "Office 365 钓鱼主题"),
(r"paypal.*limit|limit.*paypal", "PayPal 额度主题"),
# 您发现了新的工具包?在此添加规则:
(r"docusign.*sign|e.?sign.*document", "DocuSign 诱饵"),
(r"(?:dhl|fedex|ups).*track", "包裹快递诱饵"),
],
}
添加规则: 在相应类别列表末尾附加一个元组。 添加类别: 新增一个键——类别名称会自动作为 指标 标签页的章节标题显示。
# 示例:追踪新发现工具包的指纹
"my_campaign_2024": [
(r"panel\.php\?cmd=send", "已知 C2 面板路径"),
(r"X-Mailer:\s*PHPMailer\s*5\.2\.1", "该工具包使用的特定 PHPMailer 版本"),
],
TECH_SIGNATURES — 技术检测签名与 HTML、响应头、Cookie 和最终 URL 进行匹配。检测到的技术会显示在 技术 面板中,并支持跨所有采集搜索。
TECH_SIGNATURES: dict[str, dict] = {
"WordPress": {
"html": [r"wp-content", r"wp-includes"],
"url": [r"/wp-login\.php"],
"cookies": ["wordpress_"],
},
# 添加任何您想追踪的内容:
"GoPhish": {
"html": [r"rid=[a-zA-Z0-9]{20}"],
"url": [r"/track\?rid="],
},
"Evilginx": {
"url": [r"phishlets"],
"html": [r"__utmz.*evilginx"],
},
}
每个签名键(技术名称)都会成为可搜索的字符串,例如通过 GET /search?technology=GoPhish 搜索。
默认爬虫词表位于 wordlists/phishing_paths.txt——每行一个路径,# 为注释。其中包含常见的钓鱼工具包路径(gate.php、send.php、result.php、管理面板等)。为您经常遇到的工具包添加路径:
# 新观测到的工具包路径
/panel/send.php
/b374k.php
/uploads/gate.php
Content-Type: text/plain 和 Content-Disposition: attachment 提供——浏览器将其作为下载文件而非渲染。hmac.compare_digest 以防止时序攻击。X-Frame-Options: DENY 和 Referrer-Policy: no-referrer。产物写入 PHISH_DATA_DIR(默认为 /data,Docker 挂载卷):
/data/
screenshots/ <采集-id>.png
html/ <采集-id>.html
assets/
<采集-id>/
<sha256-前缀>.js
<sha256-前缀>.css
其余所有内容(指纹、HTTP 日志、爬虫结果、插件结果、标签、备注)均存储于 PostgreSQL。
phishcollector/
collector/
browser.py # Playwright 捕获、stealth JS、UA 轮换
fingerprint.py # 所有指纹检测 + PHISHING_PATTERNS + TECH_SIGNATURES
spider.py # 链接提取、robots.txt、sitemap、词表模糊测试
orchestrator.py # 任务生命周期:将所有模块整合
plugins/
__init__.py # CheckResult 数据类
urlhaus.py # abuse.ch URLhaus 插件
virustotal.py # VirusTotal v3 插件
runner.py # 并发运行已启用的插件
api/
routes.py # FastAPI 端点
main.py # 应用入口点、CORS、认证中间件
models.py # SQLAlchemy ORM 模型
config.py # Pydantic 设置(环境变量)
database.py # 引擎、会话工厂、模式迁移
frontend/
app.js # 原生 JS SPA
style.css # 终端风格 UI
nginx.conf # 反向代理 + 安全头
wordlists/
phishing_paths.txt # 默认爬虫词表
# 仅启动数据库
docker compose up db -d
# 本地运行 API
pip install -r requirements.txt
playwright install chromium
uvicorn phishcollector.main:app --reload
# 运行测试(如有)
pytest
| 变量 | 默认值 | 描述 |
|---|
PHISH_DATABASE_URL | postgres://… | PostgreSQL DSN |
PHISH_API_KEY | (空) | 如果设置,所有请求将要求提供 X-API-Key: <值> |
PHISH_DATA_DIR | /data | 截图、HTML、资源的存储根目录 |
PHISH_BROWSER_TIMEOUT | 30000 | 页面加载超时时间(毫秒) |
PHISH_REQUEST_TIMEOUT | 15 | HTTP 子请求超时时间(秒) |
PHISH_MAX_SPIDER_PAGES | 50 | 每次任务爬虫访问的最大 URL 数 |
PHISH_MAX_ASSET_SIZE | 10485760 | 要存储的最大 JS/CSS 文件大小(字节) |
PHISH_PROXY_URL | (空) | 出站代理——见下文 |
PHISH_PROXY_SSL_VERIFY | true | 对于拦截代理请设置为 false——见下文 |
PHISH_URLHAUS_ENABLED | false | 启用 URLhaus 声誉检查 |
PHISH_VIRUSTOTAL_API_KEY | (空) | VirusTotal v3 API 密钥(留空以禁用) |
| 方法 | 路径 | 描述 |
|---|
POST | /collections | 提交 URL 进行采集 |
GET | /collections | 列出所有采集 |
GET | /collections/{id} | 完整详情 + 指纹 |
GET | /collections/{id}/screenshot | 整页 PNG |
GET | /collections/{id}/html | 捕获的 HTML(以纯文本形式下载) |
GET | /collections/{id}/requests | 网络请求日志 |
GET | /collections/{id}/spider | 爬虫结果 |
GET | /collections/{id}/plugins | 威胁情报插件结果 |
POST | /collections/{id}/plugins/refresh | 重新运行插件(例如获取待处理的 VT 结果) |
POST | /collections/{id}/rescan | 重新采集同一 URL(原始内容保留) |
PATCH | /collections/{id} | 更新标签和备注 |
GET | /collections/{id}/export?format=json|csv | 导出采集数据 |
DELETE | /collections/{id} | 删除采集及其所有产物 |
GET | /search | 按 IP、favicon 哈希、技术、国家、标题搜索指纹 |