
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 وعدّل.
توجيه كل حركة المرور الصادرة عبر وكيل يبقي عنوان 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
التوثيق التفاعلي الكامل في /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 في وقت التشغيل"),
],
"exfiltration": [
(r"api\.telegram\.org/bot", "تسريب عبر بوت Telegram"),
(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، رؤوس الاستجابة، الكوكيز، والرابط النهائي. التقنيات المكتشفة تظهر في لوحة التقنيات ويمكن البحث فيها عبر جميع المجموعات.
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/ <collection-id>.png
html/ <collection-id>.html
assets/
<collection-id>/
<sha256-prefix>.js
<sha256-prefix>.css
كل شيء آخر (البصمات، سجلات HTTP، نتائج الزاحف، نتائج الإضافات، الوسوم، الملاحظات) يخزن في PostgreSQL.
phishcollector/
collector/
browser.py # التقاط Playwright، JS الخفي، تدوير وكيل المستخدم
fingerprint.py # جميع فحوصات البصمة + PHISHING_PATTERNS + TECH_SIGNATURES
spider.py # استخراج الروابط، robots.txt، خريطة الموقع، اختبار تخميني بقائمة كلمات
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 # تطبيق SPA بـ Vanilla JS
style.css # واجهة طرفية إلكترونية
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://… | 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 (اتركه فارغًا لتعطيله) |
| الطريقة | المسار | الوصف |
|---|
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، التقنية، الدولة، العنوان |