
PhishCollector هو إطار بحثي لجمع وتحليل وتتبع مواقع التصيد الاحتيالي.
PhishCollector هو إطار عمل بحثي لجمع وتحليل وتتبع مواقع التصيد. تم تصميمه عمدًا كنقطة بداية — قواعد الكشف، تواقيع التقنيات، قوائم الكلمات، والإضافات كلها هياكل بيانات نصية بسيطة يُتوقع من الباحثين قراءتها وتوسيعها وتكييفها مع بيئة التهديدات الخاصة بهم.
أرسل رابطًا مشبوهًا، وسيقوم PhishCollector بما يلي:
جميع النتائج متاحة عبر واجهة برمجة تطبيقات REST، لوحة تحكم ويب، و واجهة سطر أوامر.


cp .env.example .env # قم بالتكوين (انظر أدناه)
docker compose up --build # يبدأ تشغيل db + app + frontend
| الخدمة | الرابط |
|---|---|
| GUI | http://localhost:3000 |
| API docs | http://localhost:8000/docs |
| DB | localhost:5432 |
جميع الإعدادات هي متغيرات بيئية ببادئة PHISH_. انسخ .env.example إلى .env وعدّل.
| المتغير | الافتراضي | الوصف |
|---|---|---|
PHISH_DATABASE_URL | postgres://… | DSN لقاعدة بيانات PostgreSQL |
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 | (فارغ) | مفتاح API لـ VirusTotal الإصدار 3 (اتركه فارغًا لتعطيله) |
توجيه كل حركة المرور الصادرة عبر وكيل يبقي عنوان IP للمحلل مخفيًا عن خادم التصيد.
PHISH_PROXY_URL=socks5://127.0.0.1:9050
PHISH_PROXY_SSL_VERIFY=true # Tor لا يعترض TLS
يعمل Burp كوسيط TLS ويعرض شهادة CA الخاصة به لكل اتصال HTTPS. بدون تعطيل التحقق من SSL، سيفشل كل طلب HTTPS عبر الوكيل.
PHISH_PROXY_URL=http://127.0.0.1:8080
PHISH_PROXY_SSL_VERIFY=false # مطلوب لـ Burp / الوكلاء المعترضين
ملاحظة:
PHISH_PROXY_SSL_VERIFY=falseتؤثر فقط على اتصالات HTTPS الصادرة التي يقوم بها الخلفية Python (الإضافات، أداة البصمة، الزاحف). متصفح Playwright يعمل بالفعل معignore_https_errors=trueبغض النظر عن هذا الإعداد.
تحذير: لا تقم أبدًا بتعيين
PHISH_PROXY_SSL_VERIFY=falseبدون تكوين وكيل — سيعطل التحقق من الشهادة لجميع استدعاءات API الخارجية (URLhaus, VirusTotal).
المسار الأساسي: /api/v1
| الطريقة | المسار | الوصف |
|---|---|---|
POST | /collections | إرسال رابط للتجميع |
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 | إعادة جمع نفس الرابط (الأصلي محفوظ) |
PATCH | /collections/{id} | تحديث الوسوم والملاحظات |
GET | /collections/{id}/export?format=json|csv | تصدير بيانات المجموعة |
DELETE | /collections/{id} | حذف مجموعة وجميع منتجاتها |
GET | /search | البحث في البصمات حسب IP، تجزئة favicon، التقنية، الدولة، العنوان |
التوثيق التفاعلي الكامل في /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)
pip install -e .
# إرسال رابط والانتظار حتى الانتهاء
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-Key مجاني من auth.abuse.ch.
PHISH_URLHAUS_ENABLED=true
PHISH_URLHAUS_API_KEY=<مفتاح-المصادقة-الخاص-بك>
يتطلب مفتاح API مجاني أو مدفوع من virustotal.com.
PHISH_VIRUSTOTAL_API_KEY=<مفتاحك>
عندما لا يكون الرابط قد تم تحليله بعد بواسطة 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:
# استعلم عن مصدرك / API هنا
return CheckResult(
plugin_name="myplugin",
status="malicious", # malicious | suspicious | clean | unknown | error
score=0.95, # 0.0–1.0، أو None
result={"raw": ...}, # مخزنة بصيغة JSONB، معروضة في الواجهة
)
ثم سجلها في 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 — قواعد regex تُفحص مقابل HTML + JS المعروضينكل إدخال هو مجموعة (regex, label_مقروء_للبشر) مجمعة في فئات. أي تطابق في أي فئة يظهر في علامة التبويب المؤشرات ويساهم في درجة التهديد.
PHISHING_PATTERNS: dict[str, list[tuple[str, str]]] = {
"credential_harvest": [
(r"document\.getElementById\(['\"]password['\"]", "JS يقرأ حقل كلمة المرور بواسطة المعرف"),
(r"btoa\s*\(.*password", "ترميز كلمة المرور بـ Base64"),
# أضف قواعدك الخاصة هنا …
],
"obfuscation": [
(r"\beval\s*\(", "استخدام eval()"),
(r"atob\s*\(", "فك ترميز Base64 في وقت التشغيل"),
],