
Ein OSINT-Tool, das dabei hilft, Mitglieder eines Unternehmens mit durchgesickerten Zugangsdaten zu erkennen.
EmploLeaks ist ein OSINT-Tool (Open Source Intelligence) mit einer CLI-Oberfläche, das entwickelt wurde, um Informationen über Mitarbeiter eines Zielunternehmens zu ermitteln und zu korrelieren. Es ermöglicht, LinkedIn-Profile zu sammeln, potenzielle Unternehmens-E-Mails zu generieren, durchgesickerte Anmeldedaten in Leak-Datenbanken (intern ClickHouse) zu suchen, bekannte Sicherheitsverletzungen über HaveIBeenPwned zu überprüfen, die Infrastruktur des Unternehmens zu entdecken und Mitarbeiter in sozialen Netzwerken zu profilieren. Alle Informationen werden lokal in SQLite für die spätere Analyse gespeichert.
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
## Voraussetzungen
- Python 3.10+
- pip
- Internetverbindung
- **Optional:** Docker und Docker Compose (um ClickHouse lokal zu starten)
- **Optional:** [gitleaks](https://github.com/gitleaks/gitleaks) (zum Scannen von Geheimnissen in Repos)
- **Optional:** API-Schlüssel von [HaveIBeenPwned](https://haveibeenpwned.com/API/Key)
- LinkedIn-Sitzungscookies (`JSESSIONID` und `li_at`) für das LinkedIn-Plugin
## Installation
1. Repository klonen:```bash
git clone https://github.com/yourusername/emploleaks.git
cd emploleaks
3. (Optional) ClickHouse mit Docker für die Leaks-Datenbank starten:```bash
cd clickhouse-docker
docker compose up -d
cd ..
Das Tool ausführen:```bash python emploleaks.py
Mit Debug-Modus:```bash
python emploleaks.py -d
| Befehl | Beschreibung |
|---|---|
help | Zeigt die allgemeine Hilfe an |
help <Befehl> | Zeigt die Hilfe für einen bestimmten Befehl an |
quit | Beendet die Anwendung |
| Befehl | Beschreibung |
|---|---|
add_company --name <Name> | Fügt ein neues Unternehmen hinzu |
Die Verbindung zu ClickHouse wird in config/tokens.ini konfiguriert:```ini
[clickhouse]
host = localhost
port = 9000
user = default
passwd =
dbname = credentials_db
Wenn ClickHouse in `tokens.ini` konfiguriert ist, wird die Verbindung beim Start automatisch hergestellt.
### Suche nach Anmeldedaten und Sicherheitslücken
| Befehl | Beschreibung |
|---------|-------------|
| `find_passwords <Modus>` | Sucht nach Anmeldedaten in ClickHouse + [ProxyNova COMB](https://www.proxynova.com/tools/comb/) (3,2 Mrd. Credentials). Modi: `find_all`, `only_usernames`, `only_emails` |
| `find_passwords <Modus> --no-proxynova` | Sucht nur in lokalem ClickHouse |
| `find_passwords <Modus> --no-clickhouse` | Sucht nur in ProxyNova COMB (benötigt kein ClickHouse) |
| `find_passwords <Modus> --email <email>` | Sucht nach Anmeldedaten für eine bestimmte E-Mail |
| `find_breaches` | Sucht nach Sicherheitsverletzungen in HIBP für alle E-Mails des Unternehmens (erfordert aktives Plugin `hibp`) |
**ProxyNova COMB** ist eine öffentliche Datenbank mit 3,2 Milliarden geleakten Anmeldedaten (Combination of Many Breaches). Es benötigt keinen API-Schlüssel und wird bei jeder Suche automatisch abgefragt. Verwende `--no-proxynova`, um es zu deaktivieren.
### Infrastruktur-Erkennung
| Befehl | Beschreibung |
|---------|-------------|
| `add_domain <Domäne>` | Ordnet der ausgewählten Organisation eine Domäne zu (z.B. `add_domain faradaysec.com`) |
| `discover` | Führt Subdomänen-Enumeration für alle Domänen der Organisation mit `assetfinder` (+ optional SecurityTrails) durch und löst DNS auf |
| `print --data domains` | Zeigt die registrierten Domänen und die Anzahl der gefundenen Subdomänen an |
| `print --data subdomains` | Zeigt alle Subdomänen mit ihrer IP, Quelle und dem Datum der Entdeckung |
Das Discovery-Modul delegiert die passive Enumeration an [`assetfinder`](https://github.com/tomnomnom/assetfinder), das intern Ergebnisse von crt.sh, HackerTarget, BufferOver und anderen Quellen ohne API-Schlüssel aggregiert. Das Binary wird in `$PATH` erwartet (Installation: `go install github.com/tomnomnom/assetfinder@latest`).
Optional: Wenn Sie einen API-Schlüssel von SecurityTrails konfigurieren, werden deren Subdomänen mit denen von assetfinder zusammengeführt:```ini
[discovery]
# securitytrails_key = your_key_here
Holehe (E-Mail-Suche): verwendet die Technik des „Passwort vergessen“, um festzustellen, ob eine E-Mail auf jeder Plattform registriert ist, ohne den Besitzer zu alarmieren. Die Plattformen werden in tokens.ini konfiguriert:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret** (Benutzersuche): sucht, ob ein Benutzername auf 500+ Social-Media-Plattformen existiert. Die Benutzernamen werden manuell von Mitarbeitern über die Web-App hinzugefügt. Die Plattformen werden optional in `tokens.ini` gefiltert:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| Befehl | Beschreibung |
|---|---|
set_ai --endpoint <url> --key <key> --model <modell> | Konfiguriert den KI-Anbieter |
classify | Klassifiziert Mitarbeiter mithilfe von KI in Abteilungen (wird in der DB gespeichert) |
classify --force | Führt eine Neuklassifizierung durch, auch wenn bereits eine Abteilung zugewiesen ist |
Die KI-Klassifizierung analysiert die Titel/Rollen der Mitarbeiter und gruppiert sie nach Abteilungen (Engineering, Security, Sales usw.). Die Abteilungen werden in SQLite gespeichert und sind im HTML-Bericht sowie in der Webapp sichtbar.
Unterstützte Anbieter (jede mit OpenAI kompatible API):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniEigenständiger Daemon, der ein persönliches Telegram-Konto (via Telethon) verwendet, um genehmigten Kanälen/Gruppen beizutreten, .txt/.csv/.dat/.zip/.gz-Dateien herunterzuladen und in leaks_data/telegram/<chat>/ abzulegen. Der anschließende import_leaks-Befehl nimmt sie mit dem agentischen Parser in ClickHouse auf. Vom CLI entkoppelt – läuft als separater Prozess, sodass er 24/7 aktiv sein kann, ohne dass das CLI geöffnet sein muss.
Erstmalige Einrichtung (einmalig):
api_id und api_hash zu erhalten.config/tokens.ini hinzufügen: ```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
Subcomandos:
Neue Tabellen in data/emploleaks.db:
| Tabelle | Beschreibung |
|---|---|
telegram_groups | Snapshot der Chats (chat_id, title, username, approved, backfill_limit, last_sync_at) |
telegram_files | Heruntergeladene Dateien mit Deduplizierung nach (chat_id, message_id) und SHA-256 des Inhalts |
Daemon im Hintergrund:```bash nohup python3.13 telegram_sync.py run --watch >> logs/telegram.log 2>&1 & echo $! > /tmp/telegram_daemon.pid
---
### 100% agentenbasierter Leak-Parser
Das Modul `utils/leak_parser.py` verwendet **ausschließlich einen KI-Agenten**, um jede Datei zu parsen. Es gibt keine hartcodierten Regex (sie wurden entfernt, weil jedes neue Format subtile Extraktionsfehler verursachte).
**Pipeline des Agentens:**```
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 — Querschnittsvalidierung:
/ : \ Leerzeichen, beginnt nicht mit http/android/ftp//./, maximal ein :, kein Leerzeichen, beginnt nicht mit URL-Präfix.Determinismus: temperature=0 bei allen Aufrufen + In-Memory-Caching innerhalb eines Laufs. Dieselbe Datei erzeugt das gleiche Schema zwischen Läufen → import_leaks ist idempotent.
Typische Kosten: 1-3 API-Aufrufe pro Datei, ~$0.0001-$0.0005 mit gpt-4o-mini. Für 12 Dateien: ~$0.005 = ein halber Cent.
| Befehl | Beschreibung |
|---|---|
python emploleaks.py --webapp | Startet die Web-App (Backend auf :8421, Frontend auf :3421) |
Die Web-App ermöglicht:
Ermöglicht die Suche nach Mitarbeitern eines Unternehmens auf LinkedIn mit Browser-Sitzungscookies und die Generierung potenzieller Firmen-E-Mails. Erfasst automatisch das Firmenlogo.
Optionen:
| Option | Beschreibung |
|---|---|
JSESSIONID | LinkedIn-Sitzungscookie JSESSIONID |
li-at | LinkedIn-Sitzungscookie li_at |
hide | Den Wert von JSESSIONID bei der Anzeige verbergen (Standard: yes) |
Verfügbare Befehle innerhalb des Plugins:
| Befehl | Beschreibung |
|---|---|
run impersonate | Mit den konfigurierten Cookies authentifizieren |
run find <company_linkedin> <dominio_email> [--email-format FORMAT] | Mitarbeiter suchen und E-Mails generieren |
Verfügbare E-Mail-Formate:
f_last (z.B. [email protected]) und f.last (z.B. [email protected])--email-format: verwendet Platzhalter {n} (Anfangsbuchstabe Vorname), {s} (Nachname), {name} (vollständiger Name), {l} (Anfangsbuchstabe Nachname)
--email-format {n}.{s} erzeugt [email protected]Vollständiges Beispiel:``` 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
Ermöglicht das Abrufen von Informationen aus GitHub-Profilen, das Auflisten von Repositorys und das Scannen von Geheimnissen in Repositorys mit gitleaks.
**Optionen:**
| Option | Beschreibung |
|--------|-------------|
| `token` | Persönlicher GitHub-Zugriffstoken |
| `blur` | Token bei der Anzeige verschleiern |
| `gitleaks_path` | Pfad zur gitleaks-Binärdatei (Standard: `gitleaks` im PATH) |
| `max_repo_size` | Maximale Repository-Größe in MB (Standard: `15`) |
**Im Plugin verfügbare Befehle:**
| Befehl | Beschreibung |
|---------|-------------|
| `run stalk <username>` | E-Mail eines GitHub-Kontos abrufen |
| `run get_repos <username>` | Öffentliche Repositorys eines Benutzers auflisten |
| `run find_secrets` | Geheimnisse in Repositorys von Mitarbeitern des Unternehmens scannen |
| `run find_secrets --download-all` | Gleiche Funktion, aber ohne Größenbeschränkung |
**Vollständiges Beispiel:**```
emploleaks(miempresa)> use --plugin github
emploleaks(miempresa)(github)> setopt token ghp_xxxxxxxxxxxx
emploleaks(miempresa)(github)> run find_secrets
emploleaks(miempresa)(github)> print --data secrets
Überprüft, ob die E-Mails des Unternehmens in bekannten Datenlecks auftauchen, unter Verwendung der HIBP-API.
Optionen:
| Option | Beschreibung |
|---|---|
apikey | API-Schlüssel von HaveIBeenPwned |
rate_limit | Verzögerung zwischen API-Aufrufen in Sekunden (Standard: 2.0) |
Verfügbare Befehle innerhalb des Plugins:
| Befehl | Beschreibung |
|---|---|
run find_breaches | Suche nach Datenlecks für alle E-Mails des Unternehmens |
find_breaches | Direkter Befehl (gleichwertig, erfordert aktives hibp-Plugin) |
Vollständiges Beispiel:``` emploleaks(miempresa)> use --plugin hibp emploleaks(miempresa)(hibp)> setopt apikey <tu_api_key> emploleaks(miempresa)(hibp)> find_breaches emploleaks(miempresa)(hibp)> print --data breaches
---
## Datenbank für Leaks (ClickHouse)
EmploLeaks kann sich mit einer eigenen ClickHouse-Datenbank verbinden, die geleakte Anmeldedaten enthält, um nach Passwörtern zu suchen, die mit den entdeckten E-Mails/Benutzernamen der Mitarbeiter verknüpft sind.
### ClickHouse mit Docker starten```bash
cd clickhouse-docker
docker compose up -d
Esto expone ClickHouse en:
9000 (protocolo nativo TCP)8123 (interfaz HTTP)La carpeta leaks_data/ se monta como volumen de solo lectura dentro del contenedor.
.txt, .csv, .dat, .zip, .gz) en la carpeta leaks_data/.Der Parser erkennt automatisch die gängigsten Formate:
- `email:password`
- `email:password:url`
- `email;password`
- `email|password`
- `url,email,password`
Für unbekannte Formate wird die konfigurierte KI (OpenAI/Ollama) verwendet, um eine Stichprobe der Datei zu analysieren und zu bestimmen, wie sie zu parsen ist. Verwende `--no-ai`, um die KI-Erkennung zu überspringen.
`.zip`- und `.gz`-Dateien werden vor dem Parsen automatisch entpackt.
### Anmeldedaten suchen```
emploleaks(miempresa)> find_passwords only_emails
emploleaks(miempresa)> find_passwords find_all
emploleaks(miempresa)> print --data passwords
Wenn ClickHouse in tokens.ini konfiguriert ist, erfolgt die Verbindung automatisch beim Start des Tools.
credentials in ClickHouse## Haftungsausschluss
Dieses Werkzeug ist ausschließlich für Bildungszwecke, Sicherheitsforschung und autorisierte Pentesting-Tests konzipiert. Die Verwendung dieses Werkzeugs für böswillige oder nicht autorisierte Aktivitäten ist strengstens untersagt. Die Benutzer sind dafür verantwortlich, alle Gesetze und Nutzungsbedingungen des Projekts einzuhalten.
select_company --name <Name>| Wählt ein Unternehmen zur Bearbeitung aus |
list_companies | Listet alle Unternehmen auf |
delete_company --name <Name> | Löscht ein Unternehmen und alle zugehörigen Daten |
| Befehl | Beschreibung |
|---|
use --plugin <Name> | Aktiviert ein Plugin (linkedin, github, hibp) |
deactivate | Deaktiviert das aktuelle Plugin |
show options | Zeigt die Optionen des aktiven Plugins an |
setopt <Option> [Wert] | Konfiguriert eine Plugin-Option (wird ohne Wert über eine verdeckte Eingabeaufforderung abgefragt) |
autosave --enable / --disable | Aktiviert/deaktiviert das automatische Speichern der Konfiguration in config/tokens.ini |
autoload --enable / --disable | Aktiviert/deaktiviert das automatische Laden der Konfiguration aus config/tokens.ini |
| Befehl | Beschreibung |
|---|
connect_leaks | Stellt eine Verbindung zu ClickHouse her, wobei die in tokens.ini gespeicherte Konfiguration verwendet wird |
connect_leaks --host <Host> --port <Port> --save | Stellt eine Verbindung mit spezifischen Parametern her und speichert diese für zukünftige Sitzungen |
disconnect_leaks | Trennt die Verbindung zur ClickHouse-Datenbank |
import_leaks [Verzeichnis] | Importiert Anmeldedatendateien nach ClickHouse (Standard: leaks_data/) |
import_leaks --no-ai | Importiert nur Dateien mit bekannten Formaten, ohne KI zu verwenden |
create_db --user <Benutzer> --passwd <Passwort> --dbname <DB-Name> [--import-data <Verzeichnis>] | Erstellt die ClickHouse-Datenbank manuell (Legacy) |
| Befehl | Beschreibung |
|---|
lookup_emails | Durchsucht ~120 Plattformen nach bestätigten E-Mails mit Holehe |
lookup_emails --include-potential | Schließt auch generierte E-Mails ein |
lookup_emails --email [email protected] | Sucht nach einer bestimmten E-Mail |
lookup_emails --all | Durchsucht alle 120+ Plattformen (nicht nur die konfigurierten) |
lookup_emails --list-platforms | Listet alle verfügbaren Plattformen auf |
lookup_profiles | Sucht Profile nach Benutzername mit Maigret (erfordert geladene Benutzernamen) |
lookup_profiles --employee "Juan" | Sucht nur für einen bestimmten Mitarbeiter |
| Befehl | Beschreibung |
|---|
print --data emails | Zeigt bestätigte und potenzielle E-Mails an |
print --data passwords | Zeigt gefundene Anmeldeinformationen an |
print --data breaches | Zeigt HIBP-Datenlecks an |
print --data gits | Zeigt GitHub-Konten an |
print --data twitters | Zeigt Twitter/X-Konten an |
print --data phones | Zeigt Telefonnummern an |
print --data websites | Zeigt Webseiten an |
print --data secrets | Zeigt in Repositorien gefundene Geheimnisse an |
print --data domains | Zeigt registrierte Domains an |
print --data subdomains | Zeigt entdeckte Subdomains an |
print --data all | Zeigt alles pro Mitarbeiter konsolidiert an |
print --data all --html | Erzeugt einen interaktiven HTML-Bericht mit Fotos |
print --data all --html --ai | Erzeugt einen HTML-Bericht, der Mitarbeiter mithilfe von KI nach Abteilungen gruppiert |
print --data <typ> --export | Exportiert die Daten in eine CSV-Datei mit Zeitstempel |
| Comando | Descripción |
|---|
login | Erstauthentifizierung. Sitzung wird in config/telegram.session gespeichert |
list_groups | Listet alle Chats/Kanäle, in denen dein Konto ist, und speichert sie in SQLite |
approve <chat_id> [--limit N] | Markiert einen Chat als genehmigt und führt Backfill der letzten N Nachrichten durch |
unapprove <chat_id> | Hebt die Genehmigung auf |
list_approved | Tabelle der genehmigten Chats mit Anzahl der heruntergeladenen Dateien |
backfill <chat_id> [--limit N] | Lädt die letzten N Nachrichten eines genehmigten Chats erneut herunter |
run [--watch] | Backfill aller genehmigten; mit --watch hört es auf NewMessage-Ereignisse |
status | Zusammenfassung: genehmigte / heruntergeladene Dateien / belegter Speicherplatz |
| Feld | Typ | Beschreibung |
|---|
mail_username | String | Teil des E-Mail-Benutzernamens |
mail_domain | String | E-Mail-Domain (ohne TLD) |
mail_tld | String | TLD der E-Mail |
password | String | Geleaktes Passwort |
uri_subdomain | String | Subdomain der Website, auf der es geleakt wurde |
uri_domain | String | Domain der Website |
uri_tld | String | TLD der Website |
| Tabelle | Beschreibung |
|---|
companies | Registrierte Unternehmen (Name, Logo) |
employees | Entdeckte Mitarbeiter (Name, Titel, Foto, Unternehmen, Abteilung) |
emails | Bestätigte E-Mails (aus contact_info von LinkedIn abgerufen) |
potential_emails | Potenzielle E-Mails, generiert nach Format |
passwords | Gefundene Passwörter, die E-Mails zugeordnet sind |
username_passwords | Gefundene Passwörter nach Benutzername |
breaches | HIBP-Leaks, die E-Mails zugeordnet sind |
githubs | URLs von GitHub-Profilen/Repos |
twitters | URLs von Twitter/X-Profilen |
phones | Telefonnummern |
websites | Persönliche Websites |
secrets_repos | In Repos mit gitleaks gefundene Secrets |
social_profiles | Profile in sozialen Netzwerken (Holehe + Maigret) |
domains | Unternehmensdomains für Discovery |
subdomains | Entdeckte Subdomains (IP, Quelle, Datum) |
usernames | Mitarbeitern zugeordnete Benutzernamen für Maigret |