
PhishCollector ist ein Forschungsframework zum Sammeln, Analysieren und Verfolgen von Phishing-Websites.
PhishCollector ist ein Forschungs-Framework zum Sammeln, Analysieren und Verfolgen von Phishing-Seiten. Es ist bewusst als Ausgangspunkt konzipiert – die Erkennungsregeln, Technologiesignaturen, Wortlisten und Plugins sind alles einfache Datenstrukturen, die Forscher lesen, erweitern und an ihre eigene Bedrohungslandschaft anpassen sollen.
Reichen Sie eine verdächtige URL ein und PhishCollector wird:
Alle Ergebnisse sind über eine REST-API, ein Web-Dashboard und eine CLI zugänglich.


cp .env.example .env # configure (see below)
docker compose up --build # starts db + app + frontend
| Dienst | URL |
|---|---|
| GUI | http://localhost:3000 |
| API-Dok | http://localhost:8000/docs |
| DB | localhost:5432 |
Alle Einstellungen sind Umgebungsvariablen mit dem Präfix PHISH_. Kopieren Sie .env.example in .env und passen Sie sie an.
| Variable | Standard | Beschreibung |
|---|---|---|
PHISH_DATABASE_URL | postgres://… | PostgreSQL-DSN |
PHISH_API_KEY | (leer) | Falls gesetzt, erfordern alle Anfragen X-API-Key: <value> |
PHISH_DATA_DIR | /data | Speicherort für Screenshots, HTML, Assets |
PHISH_BROWSER_TIMEOUT | 30000 | Seitenlade-Timeout in ms |
PHISH_REQUEST_TIMEOUT | 15 | HTTP-Subrequest-Timeout in Sekunden |
PHISH_MAX_SPIDER_PAGES | 50 | Maximale Anzahl von URLs, die der Spider pro Auftrag besucht |
PHISH_MAX_ASSET_SIZE | 10485760 | Maximale JS/CSS-Dateigröße zum Speichern (Bytes) |
PHISH_PROXY_URL | (leer) | Ausgehender Proxy – siehe unten |
PHISH_PROXY_SSL_VERIFY | true | Setzen Sie false für abhörbereite Proxys – siehe unten |
PHISH_URLHAUS_ENABLED | false | Aktiviert die URLhaus-Reputationsprüfung |
PHISH_VIRUSTOTAL_API_KEY | (leer) | VirusTotal v3 API-Key (leer lassen zum Deaktivieren) |
Das Weiterleiten des gesamten ausgehenden Datenverkehrs über einen Proxy hält Ihre Analysten-IP vor dem Phishing-Server verborgen.
PHISH_PROXY_URL=socks5://127.0.0.1:9050
PHISH_PROXY_SSL_VERIFY=true # Tor intercepts TLS nicht
Burp fungiert als TLS-Man-in-the-Middle und präsentiert für jede HTTPS-Verbindung sein eigenes CA-Zertifikat. Ohne Deaktivierung der SSL-Verifikation schlägt jede HTTPS-Anfrage über den Proxy fehl.
PHISH_PROXY_URL=http://127.0.0.1:8080
PHISH_PROXY_SSL_VERIFY=false # erforderlich für Burp / abhörbereite Proxys
Hinweis:
PHISH_PROXY_SSL_VERIFY=falsebetrifft nur ausgehende HTTPS-Verbindungen des Python-Backends (Plugins, Fingerprinter, Spider). Der Playwright-Browser arbeitet ohnehin mitignore_https_errors=trueunabhängig von dieser Einstellung.
Warnung: Setzen Sie
PHISH_PROXY_SSL_VERIFY=falseniemals ohne einen konfigurierten Proxy – dies würde die Zertifikatsprüfung für alle externen API-Aufrufe (URLhaus, VirusTotal) deaktivieren.
Basis-Pfad: /api/v1
| Methode | Pfad | Beschreibung |
|---|---|---|
POST | /collections | Eine URL zur Sammlung einreichen |
GET | /collections | Alle Sammlungen auflisten |
GET | /collections/{id} | Vollständige Details + Fingerabdruck |
GET | /collections/{id}/screenshot | Ganzseitiges PNG |
GET | /collections/{id}/html | Erfasstes HTML (als Klartext heruntergeladen) |
GET | /collections/{id}/requests | Netzwerkanfragen-Protokoll |
GET | /collections/{id}/spider | Spider-Ergebnisse |
GET | /collections/{id}/plugins | Ergebnisse der Bedrohungsanalyse-Plugins |
POST | /collections/{id}/plugins/refresh | Plugins erneut ausführen (z. B. ausstehendes VT-Ergebnis abrufen) |
POST | /collections/{id}/rescan | Dieselbe URL erneut sammeln (Original bleibt erhalten) |
PATCH | /collections/{id} | Tags und Notizen aktualisieren |
GET | /collections/{id}/export?format=json|csv | Sammlungsdaten exportieren |
DELETE | /collections/{id} | Eine Sammlung und alle ihre Artefakte löschen |
GET | /search | Fingerabdrücke nach IP, Favicon-Hash, Technologie, Land, Titel durchsuchen |
Vollständige interaktive Dokumentation unter /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}'
# Installieren (im Container oder lokalem venv mit requirements.txt)
pip install -e .
# Eine URL übermitteln und auf Abschluss warten
phishcollector collect https://target.example.com --wait
# Mit Wortlisten-Fuzzing
phishcollector collect https://target.example.com --wordlist --wait
# Letzte Aufträge auflisten
phishcollector list
# Vollständige Details anzeigen
phishcollector detail <job-id>
# Screenshot herunterladen
phishcollector screenshot <job-id> -o capture.png
# Suche nach Technologie-Stack / Favicon-Hash / Land
phishcollector search --tech WordPress --country RU
phishcollector search --favicon-hash -1234567890
Erfordert einen kostenlosen Auth-Key von auth.abuse.ch.
PHISH_URLHAUS_ENABLED=true
PHISH_URLHAUS_API_KEY=<ihr-auth-key>
Erfordert einen kostenlosen oder kostenpflichtigen API-Key von virustotal.com.
PHISH_VIRUSTOTAL_API_KEY=<ihr-key>
Wenn eine URL noch nicht von VT analysiert wurde, übermittelt PhishCollector sie zum Scannen und ruft das Ergebnis automatisch alle 30 Sekunden erneut ab, bis es aufgelöst ist.
Jedes Plugin ist eine einzelne Datei in phishcollector/plugins/, die eine asynchrone Funktion bereitstellt:
# phishcollector/plugins/myplugin.py
from . import CheckResult
async def check(url: str, proxy_url=None, ssl_verify=True) -> CheckResult:
# Ihre Feed-/API-Abfrage hier
return CheckResult(
plugin_name="myplugin",
status="malicious", # malicious | suspicious | clean | unknown | error
score=0.95, # 0.0–1.0, oder None
result={"raw": ...}, # wird als JSONB gespeichert, im GUI angezeigt
)
Dann registrieren Sie es in 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))
Es sind keine weiteren Änderungen erforderlich – das Ergebnis wird automatisch gespeichert, im Dashboard angezeigt und in den Bedrohungswert einbezogen.