
أداة OSINT تساعد في اكتشاف أعضاء شركة لديهم بيانات اعتماد مسربة.
EmploLeaks هي أداة استخبارات مفتوحة المصدر (OSINT) بواجهة سطر أوامر (CLI)، مصممة لاكتشاف وربط معلومات حول موظفي شركة مستهدفة. تسمح بجمع ملفات تعريف LinkedIn، وتوليد رسائل بريد إلكتروني مؤسسية محتملة، والبحث عن بيانات اعتماد مسربة في قواعد بيانات التسريبات (باستخدام ClickHouse داخليًا)، والتحقق من الخروقات المعروفة عبر HaveIBeenPwned، واكتشاف البنية التحتية للشركة، ووضع ملفات تعريف للموظفين على وسائل التواصل الاجتماعي. يتم تخزين جميع المعلومات محليًا في SQLite لتحليلها لاحقًا.
emploleaks/ ├── emploleaks.py # Script principal (CLI interactiva con cmd2) ├── telegram_sync.py # Daemon userbot de Telegram (Telethon, standalone) ├── requirements.txt # Dependencias de Python ├── README.md ├── .gitignore ├── plugins/ │ ├── linkedin.py # Plugin de LinkedIn (scraping de empleados) │ ├── github.py # Plugin de GitHub (repos, stalk, secrets) │ └── hibp.py # Plugin de HaveIBeenPwned (brechas) ├── utils/ │ ├── logging_format.py # Configuración de logging con colores │ ├── ai_classifier.py # Clasificación de roles con IA (OpenAI/Ollama) │ ├── leak_parser.py # Parser de leaks 100% agéntico (loop de IA, sin regex) │ ├── email_lookup.py # Búsqueda de emails en redes sociales (Holehe) │ ├── profile_lookup.py # Búsqueda de usernames en redes sociales (Maigret) │ └── discovery.py # Enumeración de subdominios (assetfinder + SecurityTrails opcional) ├── clickhouse-docker/ # Docker Compose para levantar ClickHouse │ ├── docker-compose.yml │ └── config/ │ └── users.xml ├── leaks_data/ # Carpeta para archivos de leaks a importar (no en git) ├── config/ # Configuración (autogenerado) │ └── tokens.ini # Tokens y credenciales de plugins (no en git) ├── data/ # Base de datos local (autogenerado) │ └── emploleaks.db # SQLite con toda la información recopilada ├── webapp/ # Webapp administrativa │ ├── backend/ # FastAPI (Python) │ └── frontend/ # Next.js (React/TypeScript) └── logs/ # Archivos de log (autogenerado) └── log.txt
## المتطلبات
- Python 3.10+
- pip
- اتصال بالإنترنت
- **اختياري:** Docker و Docker Compose (لتشغيل ClickHouse محليًا)
- **اختياري:** [gitleaks](https://github.com/gitleaks/gitleaks) (لمسح الأسرار في المستودعات)
- **اختياري:** مفتاح API من [HaveIBeenPwned](https://haveibeenpwned.com/API/Key)
- كوكيز جلسة LinkedIn (`JSESSIONID` و `li_at`) لإضافة LinkedIn
## التثبيت
1. استنساخ المستودع:```bash
git clone https://github.com/yourusername/emploleaks.git
cd emploleaks
3. (اختياري) تشغيل ClickHouse باستخدام Docker لقاعدة بيانات التسريبات:```bash
cd clickhouse-docker
docker compose up -d
cd ..
قم بتشغيل الأداة:```bash python emploleaks.py
مع وضع debug:```bash
python emploleaks.py -d
| الأمر | الوصف |
|---|---|
help | يعرض المساعدة العامة |
help <command> | يعرض المساعدة لأمر معين |
quit | الخروج من التطبيق |
| الأمر | الوصف |
|---|---|
add_company --name <name> | إضافة شركة جديدة |
select_company --name <name> | تحديد شركة للعمل عليها |
يتم تكوين الاتصال بـ ClickHouse في config/tokens.ini:```ini
[clickhouse]
host = localhost
port = 9000
user = default
passwd =
dbname = credentials_db
إذا تم تكوين ClickHouse في `tokens.ini`، يتم إنشاء الاتصال تلقائيًا عند بدء التشغيل.
### البحث عن بيانات الاعتماد والانتهاكات
| الأمر | الوصف |
|---------|-------------|
| `find_passwords <modo>` | يبحث عن بيانات الاعتماد في ClickHouse + [ProxyNova COMB](https://www.proxynova.com/tools/comb/) (3.2 مليار بيانات اعتماد). الأوضاع: `find_all`, `only_usernames`, `only_emails` |
| `find_passwords <modo> --no-proxynova` | يبحث فقط في ClickHouse المحلي |
| `find_passwords <modo> --no-clickhouse` | يبحث فقط في ProxyNova COMB (لا يتطلب ClickHouse) |
| `find_passwords <modo> --email <email>` | يبحث عن بيانات اعتماد لبريد إلكتروني معين |
| `find_breaches` | يبحث عن الانتهاكات في HIBP لجميع رسائل البريد الإلكتروني الخاصة بالشركة (يتطلب إضافة `hibp` نشطة) |
**ProxyNova COMB** هي قاعدة بيانات عامة تحتوي على 3.2 مليار بيانات اعتماد مسربة (Combination Of Many Breaches). لا تتطلب مفتاح API ويتم استعلامها تلقائيًا في كل بحث. استخدم `--no-proxynova` لتعطيلها.
### اكتشاف البنية التحتية
| الأمر | الوصف |
|---------|-------------|
| `add_domain <dominio>` | يربط نطاقًا بالشركة المحددة (مثال: `add_domain faradaysec.com`) |
| `discover` | ينفذ تعداد النطاقات الفرعية ضد جميع نطاقات الشركة باستخدام `assetfinder` (+ SecurityTrails اختياري)، مع حل DNS |
| `print --data domains` | يعرض النطاقات المسجلة وعدد النطاقات الفرعية المكتشفة |
| `print --data subdomains` | يعرض جميع النطاقات الفرعية مع عنوان IP والمصدر وتاريخ الاكتشاف |
وحدة الاكتشاف تفوض التعداد السلبي إلى [`assetfinder`](https://github.com/tomnomnom/assetfinder)، الذي يجمع داخليًا نتائج من crt.sh و HackerTarget و BufferOver ومصادر أخرى بدون مفتاح API. يُتوقع وجود الثنائي في `$PATH` (التثبيت: `go install github.com/tomnomnom/assetfinder@latest`).
اختياريًا، إذا قمت بتكوين مفتاح API لـ SecurityTrails، يتم دمج النطاقات الفرعية الخاصة به مع نتائج assetfinder:```ini
[discovery]
# securitytrails_key = your_key_here
Holehe (البحث عن البريد الإلكتروني): يستخدم تقنية "نسيت كلمة المرور" لتحديد ما إذا كان بريد إلكتروني مسجلاً في كل منصة، دون تنبيه المالك. يتم تكوين المنصات في tokens.ini:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret (البحث عن اسم المستخدم):** يبحث عما إذا كان اسم المستخدم موجودًا في أكثر من 500 منصة تواصل اجتماعي. يتم إضافة أسماء المستخدمين يدويًا بواسطة موظف من webapp. يتم تصفية المنصات اختياريًا في `tokens.ini`:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| الأمر | الوصف |
|---|---|
set_ai --endpoint <url> --key <key> --model <modelo> | يعدّل مزود الذكاء الاصطناعي |
classify | يصنف الموظفين إلى أقسام باستخدام الذكاء الاصطناعي (يُحفظ في قاعدة البيانات) |
classify --force | يعيد التصنيف حتى لو كان لديهم قسم معيّن |
يقوم تصنيف الذكاء الاصطناعي بتحليل المسميات/الأدوار الوظيفية للموظفين وتجميعهم حسب القسم (Engineering، Security، Sales، إلخ). يتم حفظ الأقسام في SQLite وتكون مرئية في تقرير HTML وفي تطبيق الويب.
المزودون المدعومون (أي واجهة برمجة تطبيقات متوافقة مع OpenAI):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniدايمون مستقل يستخدم حساب تلغرام شخصي (عبر Telethon) للانضمام إلى القنوات/المجموعات المعتمدة، وتنزيل الملفات .txt/.csv/.dat/.zip/.gz ووضعها في leaks_data/telegram/<chat>/. يقوم import_leaks اللاحق بابتلاعها إلى ClickHouse باستخدام المحلل الموكَّل (agentic parser). مفصول عن واجهة الأوامر — يعمل كعملية منفصلة، بحيث يمكنه البقاء 24/7 دون الحاجة لواجهة الأوامر.
الإعداد الأولي (مرة واحدة):
api_id و api_hash.config/tokens.ini: ```ini
[telegram]
api_id = 12345678
api_hash = abcd1234...
session = config/telegram.session
download_root = leaks_data/telegram
allowed_extensions = txt, csv, dat, zip, gz
default_backfill_limit = 10
الأوامر الفرعية:
جداول جديدة في data/emploleaks.db:
| الجدول | الوصف |
|---|---|
telegram_groups | لقطة من الدردشات (chat_id, title, username, approved, backfill_limit, last_sync_at) |
telegram_files | الملفات التي تم تنزيلها مع إزالة التكرار حسب (chat_id, message_id) وحسب SHA-256 للمحتوى |
خادم خلفي (Daemon):```bash nohup python3.13 telegram_sync.py run --watch >> logs/telegram.log 2>&1 & echo $! > /tmp/telegram_daemon.pid
---
### محلل التسريبات 100% وكيل ذكي
الوحدة `utils/leak_parser.py` تستخدم **عامل ذكاء اصطناعي فقط** لتحليل كل ملف. لا توجد تعبيرات منتظمة مكتوبة بشكل ثابت (تم إزالتها لأن كل تنسيق جديد كان يُدخل أخطاء دقيقة في الاستخراج).
**سير عمل العامل:**```
1. Auto-detectar encoding (BOM sniffing): utf-8 / utf-8-sig / utf-16 / utf-32.
2. Sampling inteligente: tomar las primeras 80 líneas que parezcan credenciales
(con separadores típicos, alfanumérico >50%) — skipea banners ASCII art.
3. La IA recibe 50 líneas + system prompt con familias comunes de formato y
propone {separator, fields, skip_lines}.
4. Aplicamos el schema a la muestra SIN filtros → list of tuples.
5. Validamos con _is_clean_credential → score = % rows válidas.
6. Si score ≥ 0.8 y ≥ 5 rows → aplicar al archivo completo.
7. Si no → mandar al agente la (source_line ↔ extracción mala) en pares,
más checklist de errores típicos. Goto 3.
8. Hasta 7 iteraciones. Si no converge a 0.8: fallback al mejor schema si
alcanzó ≥ 0.7. Bajo eso → skip con warning (nunca ingerimos basura).
_is_clean_credential — التحقق الشامل:
/ : \ space، لا يبدأ بـ http/android/ftp//./، حد أقصى : واحد، بدون مسافات بيضاء، لا تبدأ ببادئة URL.الحتمية: temperature=0 في جميع الاستدعاءات + تخزين مؤقت في الذاكرة ضمن نفس التشغيل. نفس الملف ينتج نفس المخطط عبر التشغيلات → import_leaks هو عديم الأثر الجانبي.
التكلفة النموذجية: 1-3 استدعاءات API لكل ملف، ~$0.0001-$0.0005 باستخدام gpt-4o-mini. لـ 12 ملفًا: ~$0.005 = نصف سنت.
| الأمر | الوصف |
|---|---|
python emploleaks.py --webapp | يطلق تطبيق الويب (الخلفي على المنفذ :8421، الأمامي على المنفذ :3421) |
يسمح تطبيق الويب بـ:
يسمح بالبحث عن موظفي شركة على LinkedIn باستخدام ملفات تعريف الارتباط لجلسة المتصفح، وإنشاء رسائل بريد إلكتروني مؤسسية محتملة. يلتقط تلقائيًا شعار الشركة.
الخيارات:
| الخيار | الوصف |
|---|---|
JSESSIONID | ملف تعريف ارتباط الجلسة JSESSIONID من LinkedIn |
li-at | ملف تعريف ارتباط الجلسة li_at من LinkedIn |
hide | إخفاء قيمة JSESSIONID عند عرضها (الافتراضي: yes) |
الأوامر المتاحة داخل الإضافة:
| الأمر | الوصف |
|---|---|
run impersonate | المصادقة باستخدام ملفات تعريف الارتباط المكوّنة |
run find <company_linkedin> <dominio_email> [--email-format FORMAT] | البحث عن الموظفين وإنشاء رسائل البريد الإلكتروني |
صيغ البريد الإلكتروني المتاحة:
f_last (مثال: [email protected]) و f.last (مثال: [email protected])--email-format: استخدم العناصر النائبة {n} (الحرف الأول من الاسم)، {s} (اسم العائلة)، {name} (الاسم الكامل)، {l} (الحرف الأول من اسم العائلة)
--email-format {n}.{s} ينتج [email protected]مثال كامل:``` emploleaks> add_company --name miempresa emploleaks> select_company --name miempresa emploleaks(miempresa)> use --plugin linkedin emploleaks(miempresa)(linkedin)> setopt JSESSIONID JSESSIONID: emploleaks(miempresa)(linkedin)> setopt li-at li-at: emploleaks(miempresa)(linkedin)> run impersonate emploleaks(miempresa)(linkedin)> run find miempresa miempresa.com --email-format {n}.{s}
### GitHub
يتيح الحصول على معلومات من ملفات تعريف GitHub، وسرد المستودعات، وفحص الأسرار في المستودعات باستخدام gitleaks.
**الخيارات:**
| الخيار | الوصف |
|--------|-------|
| `token` | رمز الوصول الشخصي لـ GitHub |
| `blur` | إخفاء الرمز عند عرضه |
| `gitleaks_path` | المسار إلى ثنائي gitleaks (الافتراضي: `gitleaks` في PATH) |
| `max_repo_size` | الحجم الأقصى للمستودع المراد تحليله بالميغابايت (الافتراضي: `15`) |
**الأوامر المتاحة داخل الإضافة:**
| الأمر | الوصف |
|-------|-------|
| `run stalk <username>` | الحصول على البريد الإلكتروني لحساب GitHub |
| `run get_repos <username>` | سرد المستودعات العامة لمستخدم |
| `run find_secrets` | فحص الأسرار في مستودعات موظفي الشركة |
| `run find_secrets --download-all` | نفسه ولكن بدون حد للحجم |
**مثال كامل:**```
emploleaks(miempresa)> use --plugin github
emploleaks(miempresa)(github)> setopt token ghp_xxxxxxxxxxxx
emploleaks(miempresa)(github)> run find_secrets
emploleaks(miempresa)(github)> print --data secrets
يتحقق مما إذا كانت رسائل البريد الإلكتروني للشركة تظهر في الثغرات المعروفة باستخدام واجهة برمجة تطبيقات HIBP.
الخيارات:
| الخيار | الوصف |
|---|---|
apikey | مفتاح واجهة برمجة التطبيقات لـ HaveIBeenPwned |
rate_limit | التأخير بين استدعاءات واجهة برمجة التطبيقات بالثواني (الافتراضي: 2.0) |
الأوامر المتاحة داخل الملحق:
| الأمر | الوصف |
|---|---|
run find_breaches | البحث عن الثغرات لجميع رسائل البريد الإلكتروني للشركة |
find_breaches | الأمر المباشر (مكافئ، يتطلب ملحق hibp نشطًا) |
مثال كامل:``` emploleaks(miempresa)> use --plugin hibp emploleaks(miempresa)(hibp)> setopt apikey <tu_api_key> emploleaks(miempresa)(hibp)> find_breaches emploleaks(miempresa)(hibp)> print --data breaches
---
## قاعدة بيانات التسريبات (ClickHouse)
يمكن لـ EmploLeaks الاتصال بقاعدة بيانات ClickHouse خاصة به تحتوي على بيانات اعتماد مسربة للبحث عن كلمات مرور مرتبطة بعناوين البريد الإلكتروني/أسماء المستخدمين للموظفين المكتشفين.
### تشغيل ClickHouse باستخدام Docker```bash
cd clickhouse-docker
docker compose up -d
هذا يعرض ClickHouse على:
9000 (بروتوكول TCP الأصلي)8123 (واجهة HTTP)المجلد leaks_data/ يتم تركيبه كوحدة تخزين للقراءة فقط داخل الحاوية.
.txt, .csv, .dat, .zip, .gz) في المجلد leaks_data/.يقوم المحلل باكتشاف التنسيقات الأكثر شيوعًا تلقائيًا:
- `email:password`
- `email:password:url`
- `email;password`
- `email|password`
- `url,email,password`
للتنسيقات غير المعروفة، يستخدم الذكاء الاصطناعي المُهيأ (OpenAI/Ollama) لتحليل عينة من الملف وتحديد كيفية تحليله. استخدم `--no-ai` لتخطي الكشف باستخدام الذكاء الاصطناعي.
يتم فك ضغط ملفات `.zip` و `.gz` تلقائيًا قبل التحليل.
### البحث عن بيانات الاعتماد```
emploleaks(miempresa)> find_passwords only_emails
emploleaks(miempresa)> find_passwords find_all
emploleaks(miempresa)> print --data passwords
إذا تم تكوين ClickHouse في tokens.ini، فإن الاتصال يكون تلقائيًا عند بدء تشغيل الأداة.
credentials في ClickHouse## إخلاء مسؤولية
هذه الأداة مصممة فقط للأغراض التعليمية، والبحث الأمني، واختبارات الاختراق المصرح بها. استخدام هذه الأداة لأغراض ضارة أو غير مصرح بها ممنوع تمامًا. المستخدمون مسؤولون عن الامتثال لجميع القوانين وشروط خدمة المشروع.
list_companies | عرض جميع الشركات |
delete_company --name <name> | حذف شركة وجميع بياناتها |
| الأمر | الوصف |
|---|
use --plugin <name> | تفعيل إضافة (linkedin, github, hibp) |
deactivate | إلغاء تنشيط الإضافة الحالية |
show options | عرض خيارات الإضافة النشطة |
setopt <option> [value] | تعيين خيار للإضافة (إذا لم يتم تمرير قيمة، يُطلب إدخالها بشكل مخفي) |
autosave --enable / --disable | تفعيل/تعطيل الحفظ التلقائي للإعدادات في config/tokens.ini |
autoload --enable / --disable | تفعيل/تعطيل التحميل التلقائي للإعدادات من config/tokens.ini |
| الأمر | الوصف |
|---|
connect_leaks | الاتصال بـ ClickHouse باستخدام الإعدادات المحفوظة في tokens.ini |
connect_leaks --host <host> --port <port> --save | الاتصال بمعاملات محددة وحفظها للجلسات المستقبلية |
disconnect_leaks | قطع الاتصال بقاعدة بيانات ClickHouse |
import_leaks [directory] | استيراد ملفات بيانات الاعتماد إلى ClickHouse (الافتراضي: leaks_data/) |
import_leaks --no-ai | استيراد الملفات ذات التنسيق المعروف فقط، دون استخدام الذكاء الاصطناعي |
create_db --user <user> --passwd <pass> --dbname <db> [--import-data <dir>] | إنشاء قاعدة بيانات ClickHouse يدويًا (قديم) |
| الأمر | الوصف |
|---|
lookup_emails | يبحث عن رسائل البريد الإلكتروني المؤكدة في حوالي 120 منصة باستخدام Holehe |
lookup_emails --include-potential | يتضمن أيضًا رسائل البريد الإلكتروني المُنشأة |
lookup_emails --email [email protected] | يبحث عن بريد إلكتروني محدد |
lookup_emails --all | يبحث في أكثر من 120 منصة (وليس فقط المنصات المُهيأة) |
lookup_emails --list-platforms | يعرض قائمة بجميع المنصات المتاحة |
lookup_profiles | يبحث عن ملفات شخصية حسب اسم المستخدم باستخدام Maigret (يتطلب تحميل أسماء المستخدمين) |
lookup_profiles --employee "Juan" | يبحث فقط عن موظف معين |
| الأمر | الوصف |
|---|
print --data emails | يعرض رسائل البريد الإلكتروني المؤكدة والمحتملة |
print --data passwords | يعرض بيانات الاعتماد التي تم العثور عليها |
print --data breaches | يعرض خروقات HIBP |
print --data gits | يعرض حسابات GitHub |
print --data twitters | يعرض حسابات Twitter/X |
print --data phones | يعرض أرقام الهواتف |
print --data websites | يعرض مواقع الويب |
print --data secrets | يعرض الأسرار التي تم العثور عليها في المستودعات |
print --data domains | يعرض النطاقات المسجلة |
print --data subdomains | يعرض النطاقات الفرعية المكتشفة |
print --data all | يعرض كل شيء مجمعًا حسب الموظف |
print --data all --html | يُنشئ تقرير HTML تفاعلي مع الصور |
print --data all --html --ai | يُنشئ تقرير HTML يجمع الموظفين حسب القسم باستخدام الذكاء الاصطناعي |
print --data <tipo> --export | يصدر البيانات إلى ملف CSV مع طابع زمني |
| الأمر | الوصف |
|---|
login | المصادقة الأولية. الحفاظ على الجلسة في config/telegram.session |
list_groups | يسرد جميع الدردشات/القنوات التي يتواجد فيها حسابك، ويأخذ لقطة منها في SQLite |
approve <chat_id> [--limit N] | يحدد دردشة كموافق عليها ويقوم بتعبئة آخر N رسالة |
unapprove <chat_id> | يزيل الموافقة |
list_approved | جدول الدردشات الموافق عليها مع عدد الملفات التي تم تنزيلها |
backfill <chat_id> [--limit N] | يعيد تنزيل آخر N رسالة من دردشة موافق عليها |
run [--watch] | تعبئة جميع الدردشات الموافق عليها؛ مع --watch يظل يستمع لأحداث NewMessage |
status | ملخص: الموافق عليها / الملفات التي تم تنزيلها / مساحة القرص المستخدمة |
| الحقل | النوع | الوصف |
|---|
mail_username | String | جزء من اسم المستخدم للبريد الإلكتروني |
mail_domain | String | نطاق البريد الإلكتروني (بدون TLD) |
mail_tld | String | نطاق المستوى الأعلى للبريد الإلكتروني |
password | String | كلمة المرور المسربة |
uri_subdomain | String | النطاق الفرعي للموقع الذي تم تسريبه منه |
uri_domain | String | نطاق الموقع |
uri_tld | String | نطاق المستوى الأعلى للموقع |
| الجدول | الوصف |
|---|
companies | الشركات المسجلة (الاسم، الشعار) |
employees | الموظفون المكتشفون (الاسم، المسمى الوظيفي، الصورة، الشركة، القسم) |
emails | رسائل البريد الإلكتروني المؤكدة (التي تم الحصول عليها من contact_info في LinkedIn) |
potential_emails | رسائل البريد الإلكتروني المحتملة المولدة حسب التنسيق |
passwords | كلمات المرور التي تم العثور عليها والمرتبطة بالبريد الإلكتروني |
username_passwords | كلمات المرور التي تم العثور عليها حسب اسم المستخدم |
breaches | خروقات HIBP المرتبطة بالبريد الإلكتروني |
githubs | عناوين URL لملفات تعريف / مستودعات GitHub |
twitters | عناوين URL لملفات تعريف Twitter/X |
phones | أرقام الهواتف |
websites | مواقع الويب الشخصية |
secrets_repos | الأسرار التي تم العثور عليها في المستودعات باستخدام gitleaks |
social_profiles | ملفات تعريف على شبكات التواصل الاجتماعي (Holehe + Maigret) |
domains | نطاقات الشركة للاكتشاف |
subdomains | النطاقات الفرعية المكتشفة (IP، المصدر، التاريخ) |
usernames | أسماء المستخدمين المرتبطة بالموظفين لاستخدام Maigret |