
PhishCollector est un framework de recherche pour collecter, analyser et suivre les sites de phishing.
PhishCollector est un cadre de recherche pour collecter, analyser et suivre les sites de phishing. Il est intentionnellement conçu comme un point de départ — les règles de détection, les signatures technologiques, les listes de mots et les plugins sont tous des structures de données en clair que les chercheurs sont censés lire, étendre et adapter à leur propre paysage de menaces.
Soumettez une URL suspecte et PhishCollector va :
Tous les résultats sont accessibles via une API REST, un tableau de bord web et une CLI.


cp .env.example .env # configurer (voir ci-dessous)
docker compose up --build # démarre db + app + frontend
| Service | URL |
|---|---|
| GUI | http://localhost:3000 |
| API docs | http://localhost:8000/docs |
| DB | localhost:5432 |
Tous les paramètres sont des variables d'environnement avec le préfixe PHISH_. Copiez .env.example vers .env et ajustez.
| Variable | Défaut | Description |
|---|---|---|
PHISH_DATABASE_URL | postgres://… | DSN PostgreSQL |
PHISH_API_KEY | (vide) | Si défini, toutes les requêtes nécessitent X-API-Key: <valeur> |
PHISH_DATA_DIR | /data | Racine de stockage pour les captures d'écran, HTML, ressources |
PHISH_BROWSER_TIMEOUT | 30000 | Délai d'attente de chargement de page en ms |
PHISH_REQUEST_TIMEOUT | 15 | Délai d'attente des sous-requêtes HTTP en secondes |
PHISH_MAX_SPIDER_PAGES | 50 | Nombre max d'URLs visitées par l'explorateur par tâche |
PHISH_MAX_ASSET_SIZE | 10485760 | Taille max de fichier JS/CSS à stocker (octets) |
PHISH_PROXY_URL | (vide) | Proxy sortant — voir ci-dessous |
PHISH_PROXY_SSL_VERIFY | true | Mettre à false pour les proxys d'interception — voir ci-dessous |
PHISH_URLHAUS_ENABLED | false | Activer la vérification de réputation URLhaus |
PHISH_VIRUSTOTAL_API_KEY | (vide) | Clé API VirusTotal v3 (laisser vide pour désactiver) |
Router tout le trafic sortant via un proxy permet de cacher l'IP de l'analyste au serveur de phishing.
PHISH_PROXY_URL=socks5://127.0.0.1:9050
PHISH_PROXY_SSL_VERIFY=true # Tor n'intercepte pas TLS
Burp agit comme un intermédiaire TLS et présente son propre certificat CA pour chaque connexion HTTPS. Sans désactiver la vérification SSL, chaque requête HTTPS via le proxy échouera.
PHISH_PROXY_URL=http://127.0.0.1:8080
PHISH_PROXY_SSL_VERIFY=false # requis pour Burp / proxys d'interception
Remarque :
PHISH_PROXY_SSL_VERIFY=falsen'affecte que les connexions HTTPS sortantes effectuées par le backend Python (plugins, empreinte numérique, explorateur). Le navigateur Playwright fonctionne déjà avecignore_https_errors=trueindépendamment de ce paramètre.
Avertissement : Ne définissez jamais
PHISH_PROXY_SSL_VERIFY=falsesans proxy configuré — cela désactiverait la validation des certificats pour tous les appels API externes (URLhaus, VirusTotal).
Chemin de base : /api/v1
| Méthode | Chemin | Description |
|---|---|---|
POST | /collections | Soumettre une URL pour collecte |
GET | /collections | Lister toutes les collectes |
GET | /collections/{id} | Détail complet + empreinte numérique |
GET | /collections/{id}/screenshot | PNG pleine page |
GET | /collections/{id}/html | HTML capturé (téléchargé en texte brut) |
GET | /collections/{id}/requests | Journal des requêtes réseau |
GET | /collections/{id}/spider | Résultats de l'explorateur |
GET | /collections/{id}/plugins | Résultats des plugins de renseignement sur les menaces |
POST | /collections/{id}/plugins/refresh | Relancer les plugins (ex. récupérer un résultat VT en attente) |
POST | /collections/{id}/rescan | Re-collecter la même URL (l'original est conservé) |
PATCH | /collections/{id} | Mettre à jour les tags et notes |
GET | /collections/{id}/export?format=json|csv | Exporter les données de la collecte |
DELETE | /collections/{id} | Supprimer une collecte et tous ses artefacts |
GET | /search | Rechercher des empreintes numériques par IP, hash de favicon, technologie, pays, titre |
Documentation interactive complète à /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}'
# Installer (dans le conteneur ou venv local avec requirements.txt)
pip install -e .
# Soumettre une URL et attendre la fin
phishcollector collect https://target.example.com --wait
# Avec fuzzing de liste de mots
phishcollector collect https://target.example.com --wordlist --wait
# Lister les tâches récentes
phishcollector list
# Voir les détails complets
phishcollector detail <job-id>
# Télécharger la capture d'écran
phishcollector screenshot <job-id> -o capture.png
# Rechercher par pile technologique / hash de favicon / pays
phishcollector search --tech WordPress --country RU
phishcollector search --favicon-hash -1234567890
Nécessite une Auth-Key gratuite depuis auth.abuse.ch.
PHISH_URLHAUS_ENABLED=true
PHISH_URLHAUS_API_KEY=<votre-cle-auth>
Nécessite une clé API gratuite ou payante depuis virustotal.com.
PHISH_VIRUSTOTAL_API_KEY=<votre-cle>
Lorsqu'une URL n'a pas encore été analysée par VT, PhishCollector la soumet pour analyse et récupère automatiquement le résultat toutes les 30 secondes jusqu'à résolution.
Chaque plugin est un fichier unique dans phishcollector/plugins/ qui expose une fonction asynchrone :
# phishcollector/plugins/myplugin.py
from . import CheckResult
async def check(url: str, proxy_url=None, ssl_verify=True) -> CheckResult:
# interroger votre flux / API ici
return CheckResult(
plugin_name="myplugin",
status="malicious", # malicious | suspicious | clean | unknown | error
score=0.95, # 0.0–1.0, ou None
result={"raw": ...}, # stocké en JSONB, affiché dans le GUI
)
Ensuite, enregistrez-le dans 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))