
PhishCollector एक शोध ढांचा है जो फ़िशिंग साइटों को एकत्र करने, विश्लेषण करने और ट्रैक करने के लिए है।
PhishCollector एक शोध ढांचा है जो फिशिंग साइटों को इकट्ठा करने, विश्लेषण करने और ट्रैक करने के लिए है। इसे जानबूझकर एक शुरुआती बिंदु के रूप में डिज़ाइन किया गया है — डिटेक्शन नियम, टेक्नोलॉजी सिग्नेचर, वर्डलिस्ट और प्लगइन्स सभी सादे डेटा संरचनाएँ हैं जिन्हें शोधकर्ताओं को पढ़ने, विस्तार करने और अपने खतरे के परिदृश्य के अनुकूल बनाने की उम्मीद है।
एक संदिग्ध URL सबमिट करें और PhishCollector निम्नलिखित करेगा:
सभी परिणाम REST API, वेब डैशबोर्ड, और CLI के माध्यम से सुलभ हैं।


cp .env.example .env # configure (see below)
docker compose up --build # starts 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 does not intercept TLS
Burp TLS मैन-इन-द-मिडल के रूप में कार्य करता है और प्रत्येक HTTPS कनेक्शन के लिए अपना CA प्रमाणपत्र प्रस्तुत करता है। SSL सत्यापन को अक्षम किए बिना प्रॉक्सी के माध्यम से प्रत्येक HTTPS अनुरोध विफल हो जाएगा।
PHISH_PROXY_URL=http://127.0.0.1:8080
PHISH_PROXY_SSL_VERIFY=false # required for Burp / intercepting proxies
ध्यान दें:
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}'
# Install (inside container or local venv with requirements.txt)
pip install -e .
# Submit a URL and wait for completion
phishcollector collect https://target.example.com --wait
# With wordlist fuzzing
phishcollector collect https://target.example.com --wordlist --wait
# List recent jobs
phishcollector list
# View full detail
phishcollector detail <job-id>
# Download screenshot
phishcollector screenshot <job-id> -o capture.png
# Search by tech stack / favicon hash / country
phishcollector search --tech WordPress --country RU
phishcollector search --favicon-hash -1234567890
इसके लिए auth.abuse.ch से मुफ्त Auth-Key आवश्यक है।
PHISH_URLHAUS_ENABLED=true
PHISH_URLHAUS_API_KEY=<your-auth-key>
इसके लिए virustotal.com से मुफ्त या भुगतान वाली API key आवश्यक है।
PHISH_VIRUSTOTAL_API_KEY=<your-key>
जब किसी URL का VT द्वारा अभी तक विश्लेषण नहीं किया गया है, तो PhishCollector इसे स्कैनिंग के लिए सबमिट करता है और परिणाम प्राप्त होने तक हर 30 सेकंड में स्वचालित रूप से पुनः प्राप्त करता है।
प्रत्येक प्लगइन phishcollector/plugins/ में एक एकल फ़ाइल है जो एक async फ़ंक्शन प्रदान करता है:
# phishcollector/plugins/myplugin.py
from . import CheckResult
async def check(url: str, proxy_url=None, ssl_verify=True) -> CheckResult:
# query your feed / API here
return CheckResult(
plugin_name="myplugin",
status="malicious", # malicious | suspicious | clean | unknown | error
score=0.95, # 0.0–1.0, or None
result={"raw": ...}, # stored as JSONB, displayed in the 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 के विरुद्ध स्कैन किए गए रेगेक्स नियमप्रत्येक प्रविष्टि एक (regex, human_readable_label) टपल है जो श्रेणियों में समूहित है। किसी भी श्रेणी में मिलान Indicators टैब में दिखाया जाता है और खतरे के स्कोर में गिना जाता है।
PHISHING_PATTERNS: dict[str, list[tuple[str, str]]] = {
"credential_harvest": [
(r"document\.getElementById\(['\"]password['\"]", "JS reads password field by ID"),
(r"btoa\s*\(.*password", "Base64-encoding a password"),
# add your own rules here …
],
"obfuscation": [
(r"\beval\s*\(", "eval() usage"),
(r"atob\s*\(", "Base64 decoding at runtime"),
],
"exfiltration": [
(r"api\.telegram\.org/bot", "Telegram bot exfiltration"),
(r"@(?:gmail|yahoo|hotmail|outlook)\.com", "Freemail address in code"),
],
"antibot": [
(r"navigator\.webdriver", "WebDriver property check"),
(r"ipqualityscore|ipqs\.com", "IPQS anti-bot service"),
],
"kit_indicators": [
(r"office365|microsoft365", "Office 365 phishing theme"),
(r"paypal.*limit|limit.*paypal", "PayPal limitation theme"),
# brand-new kit you spotted? add a rule here:
(r"docusign.*sign|e.?sign.*document", "DocuSign lure"),
(r"(?:dhl|fedex|ups).*track", "Parcel delivery lure"),
],
}
नियम जोड़ने के लिए: प्रासंगिक श्रेणी सूची में एक टपल जोड़ें। श्रेणी जोड़ने के लिए: एक नई कुंजी जोड़ें — श्रेणी का नाम स्वचालित रूप से Indicators टैब में एक अनुभाग शीर्षक के रूप में दिखाई देता है।
# Example: track a newly discovered kit's fingerprint
"my_campaign_2024": [
(r"panel\.php\?cmd=send", "Known C2 panel path"),
(r"X-Mailer:\s*PHPMailer\s*5\.2\.1", "Specific PHPMailer version used by kit"),
],
TECH_SIGNATURES — टेक्नोलॉजी डिटेक्शनसिग्नेचर HTML, प्रतिक्रिया हेडर, कुकीज़ और अंतिम URL के विरुद्ध मिलान किए जाते हैं। पहचानी गई टेक्नोलॉजी Technologies पैनल में दिखाई देती हैं और सभी संग्रहों में खोजी जा सकती हैं।
TECH_SIGNATURES: dict[str, dict] = {
"WordPress": {
"html": [r"wp-content", r"wp-includes"],
"url": [r"/wp-login\.php"],
"cookies": ["wordpress_"],
},
# Add anything you want to track:
"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, एडमिन पैनल, आदि) शामिल हैं। उन किटों के लिए पथ जोड़ें जो आप नियमित रूप से सामना करते हैं:
# Newly observed kit paths
/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/ <collection-id>.png
html/ <collection-id>.html
assets/
<collection-id>/
<sha256-prefix>.js
<sha256-prefix>.css
बाकी सब कुछ (फिंगरप्रिंट, HTTP लॉग, स्पाइडर परिणाम, प्लगइन परिणाम, टैग, नोट्स) PostgreSQL में रहता है।
phishcollector/
collector/
browser.py # Playwright capture, stealth JS, UA rotation
fingerprint.py # All fingerprinting probes + PHISHING_PATTERNS + TECH_SIGNATURES
spider.py # Link extraction, robots.txt, sitemap, wordlist fuzzing
orchestrator.py # Job lifecycle: ties all modules together
plugins/
__init__.py # CheckResult dataclass
urlhaus.py # abuse.ch URLhaus plugin
virustotal.py # VirusTotal v3 plugin
runner.py # Runs enabled plugins concurrently
api/
routes.py # FastAPI endpoints
main.py # App entry point, CORS, auth middleware
models.py # SQLAlchemy ORM models
config.py # Pydantic settings (env vars)
database.py # Engine, session factory, schema migrations
frontend/
app.js # Vanilla JS SPA
style.css # Cyber terminal UI
nginx.conf # Reverse proxy + security headers
wordlists/
phishing_paths.txt # Default spider wordlist
# Start only the database
docker compose up db -d
# Run the API locally
pip install -r requirements.txt
playwright install chromium
uvicorn phishcollector.main:app --reload
# Run tests (if present)
pytest
| चर | डिफ़ॉल्ट | विवरण |
|---|
PHISH_DATABASE_URL | postgres://… | PostgreSQL DSN |
PHISH_API_KEY | (खाली) | यदि सेट किया गया है, तो सभी अनुरोधों के लिए X-API-Key: <value> आवश्यक है |
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, फ़ेविकॉन हैश, टेक्नोलॉजी, देश, शीर्षक द्वारा फिंगरप्रिंट खोजें |