
Uno strumento OSINT che aiuta a rilevare membri di un'azienda con credenziali compromesse
EmploLeaks è uno strumento di OSINT (Open Source Intelligence) con un'interfaccia CLI , progettato per scoprire e correlare informazioni sui dipendenti di un'azienda target. Permette di raccogliere profili LinkedIn, generare email aziendali potenziali, cercare credenziali filtrate in database di leak (ClickHouse internamente), verificare violazioni note tramite HaveIBeenPwned, scoprire l'infrastruttura dell'azienda e profilare i dipendenti sui social network. Tutte le informazioni vengono archiviate localmente in SQLite per analisi successive.
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
## Requisiti
- Python 3.10+
- pip
- Connessione a Internet
- **Opzionale:** Docker e Docker Compose (per avviare ClickHouse localmente)
- **Opzionale:** [gitleaks](https://github.com/gitleaks/gitleaks) (per scansione di segreti nei repository)
- **Opzionale:** Chiave API di [HaveIBeenPwned](https://haveibeenpwned.com/API/Key)
- Cookie di sessione di LinkedIn (`JSESSIONID` e `li_at`) per il plugin di LinkedIn
## Installazione
1. Clonare il repository:```bash
git clone https://github.com/yourusername/emploleaks.git
cd emploleaks
3. (Opzionale) Avviare ClickHouse con Docker per il database delle fughe di dati:```bash
cd clickhouse-docker
docker compose up -d
cd ..
Eseguire lo strumento:```bash python emploleaks.py
Con modalità debug:```bash
python emploleaks.py -d
| Comando | Descrizione |
|---|---|
help | Mostra l'aiuto generale |
help <comando> | Mostra l'aiuto di un comando specifico |
quit | Esce dall'applicazione |
| Comando | Descrizione |
|---|---|
add_company --name <nombre> | Aggiunge una nuova azienda |
select_company --name <nombre> |
La connessione a ClickHouse viene configurata in config/tokens.ini:```ini
[clickhouse]
host = localhost
port = 9000
user = default
passwd =
dbname = credentials_db
Se ClickHouse è configurato in `tokens.ini`, la connessione viene stabilita automaticamente all'avvio.
### Ricerca di Credenziali e Violazioni
| Comando | Descrizione |
|---------|-------------|
| `find_passwords <modo>` | Cerca credenziali in ClickHouse + [ProxyNova COMB](https://www.proxynova.com/tools/comb/) (3.2B credenziali). Modi: `find_all`, `only_usernames`, `only_emails` |
| `find_passwords <modo> --no-proxynova` | Cerca solo nel ClickHouse locale |
| `find_passwords <modo> --no-clickhouse` | Cerca solo in ProxyNova COMB (non richiede ClickHouse) |
| `find_passwords <modo> --email <email>` | Cerca credenziali per un'email specifica |
| `find_breaches` | Cerca violazioni in HIBP per tutte le email dell'azienda (richiede plugin `hibp` attivo) |
**ProxyNova COMB** è un database pubblico con 3.2 miliardi di credenziali violate (Combination Of Many Breaches). Non richiede API key e viene consultato automaticamente ad ogni ricerca. Usa `--no-proxynova` per disattivarlo.
### Discovery dell'Infrastruttura
| Comando | Descrizione |
|---------|-------------|
| `add_domain <dominio>` | Associa un dominio all'azienda selezionata (es: `add_domain faradaysec.com`) |
| `discover` | Esegue enumerazione dei sottodomini contro tutti i domini dell'azienda usando `assetfinder` (+ SecurityTrails opzionale), risolvendo DNS |
| `print --data domains` | Mostra i domini registrati e il numero di sottodomini trovati |
| `print --data subdomains` | Mostra tutti i sottodomini con il loro IP, fonte e data di scoperta |
Il modulo di Discovery delega l'enumerazione passiva a [`assetfinder`](https://github.com/tomnomnom/assetfinder), che internamente aggrega risultati da crt.sh, HackerTarget, BufferOver e altre fonti senza API key. Ci si aspetta il binario in `$PATH` (installazione: `go install github.com/tomnomnom/assetfinder@latest`).
Opzionalmente, se configuri una API key di SecurityTrails, i suoi sottodomini vengono uniti a quelli di assetfinder:```ini
[discovery]
# securitytrails_key = your_key_here
Holehe (email lookup): utilizza la tecnica 'forgot password' per determinare se un email è registrato su ogni piattaforma, senza allertare il proprietario. Le piattaforme sono configurate in tokens.ini:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret** (username lookup): cerca se un username esiste su 500+ piattaforme di social media. Gli username vengono aggiunti manualmente da un dipendente tramite la webapp. Le piattaforme sono opzionalmente filtrate in `tokens.ini`:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| Comando | Descrizione |
|---|---|
set_ai --endpoint <url> --key <key> --model <modello> | Configura il provider IA |
classify | Classifica gli impiegati in reparti usando IA (viene salvato nel DB) |
classify --force | Riclassifica anche se hanno già un reparto assegnato |
La classificazione tramite IA analizza i titoli/ruoli degli impiegati e li raggruppa per reparto (Engineering, Security, Sales, ecc.). I reparti vengono memorizzati su SQLite e sono visibili nel report HTML e nella webapp.
Provider supportati (qualsiasi API compatibile con OpenAI):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniDaemon standalone che utilizza un account personale di Telegram (via Telethon) per unirsi a canali/gruppi approvati, scaricare file .txt/.csv/.dat/.zip/.gz e lasciarli in leaks_data/telegram/<chat>/. Il successivo import import_leaks li ingerisce in ClickHouse usando il parser agentico. Disaccoppiato dal CLI — viene eseguito come processo separato, quindi può rimanere attivo 24/7 senza che il CLI sia aperto.
Setup iniziale (one-time):
api_id e 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
Sottocomandi:
Nuove tabelle in data/emploleaks.db:
| Tabella | Descrizione |
|---|---|
telegram_groups | Snapshot delle chat (chat_id, title, username, approved, backfill_limit, last_sync_at) |
telegram_files | File scaricati con deduplicazione per (chat_id, message_id) e per SHA-256 del contenuto |
Daemon in background:```bash nohup python3.13 telegram_sync.py run --watch >> logs/telegram.log 2>&1 & echo $! > /tmp/telegram_daemon.pid
---
### Parser di Leak 100% Agéntico
Il modulo `utils/leak_parser.py` utilizza **solo un agente di IA** per analizzare ogni file. Non ci sono regex hardcoded (sono state rimosse perché ogni nuovo formato introduceva bug sottili di estrazione).
**Pipeline dell'agente:**```
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 — validazione trasversale:
/ : \ spazio, non inizia con http/android/ftp//./, massimo un :, senza spazi bianchi, non inizia con prefisso URL.Determinismo: temperature=0 in tutte le chiamate + caching in memoria all'interno dello stesso run. Lo stesso file produce lo stesso schema tra run → import_leaks è idempotente.
Costo tipico: 1-3 chiamate all'API per file, ~$0.0001-$0.0005 con gpt-4o-mini. Per 12 file: ~$0.005 = mezzo centesimo.
| Comando | Descrizione |
|---|---|
python emploleaks.py --webapp | Avvia la webapp (backend su :8421, frontend su :3421) |
La webapp permette:
Permette di cercare dipendenti di un'azienda su LinkedIn utilizzando cookie di sessione del browser, e generare email aziendali potenziali. Cattura automaticamente il logo dell'azienda.
Opzioni:
| Opzione | Descrizione |
|---|---|
JSESSIONID | Cookie di sessione JSESSIONID di LinkedIn |
li-at | Cookie di sessione li_at di LinkedIn |
hide | Nascondere il valore di JSESSIONID durante la visualizzazione (default: yes) |
Comandi disponibili all'interno del plugin:
| Comando | Descrizione |
|---|---|
run impersonate | Autenticare utilizzando i cookie configurati |
run find <company_linkedin> <dominio_email> [--email-format FORMAT] | Cercare dipendenti e generare email |
Formati email disponibili:
f_last (es: [email protected]) e f.last (es: [email protected])--email-format: usa placeholder {n} (iniziale nome), {s} (cognome), {name} (nome completo), {l} (iniziale cognome)
--email-format {n}.{s} genera [email protected]Esempio completo:``` 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
Permette di ottenere informazioni dai profili GitHub, elencare repository e scansionare segreti nei repository con gitleaks.
**Opzioni:**
| Opzione | Descrizione |
|---------|-------------|
| `token` | Token di accesso personale di GitHub |
| `blur` | Offuscare il token quando visualizzato |
| `gitleaks_path` | Percorso al binario di gitleaks (default: `gitleaks` in PATH) |
| `max_repo_size` | Dimensione massima del repo da analizzare in MB (default: `15`) |
**Comandi disponibili all'interno del plugin:**
| Comando | Descrizione |
|---------|-------------|
| `run stalk <username>` | Ottenere email di un account GitHub |
| `run get_repos <username>` | Elencare repository pubblici di un utente |
| `run find_secrets` | Scansionare segreti nei repo dei dipendenti dell'azienda |
| `run find_secrets --download-all` | Uguale ma senza limite di dimensione |
**Esempio completo:**```
emploleaks(miempresa)> use --plugin github
emploleaks(miempresa)(github)> setopt token ghp_xxxxxxxxxxxx
emploleaks(miempresa)(github)> run find_secrets
emploleaks(miempresa)(github)> print --data secrets
Verifica se le email dell'azienda appaiono in breach noti utilizzando l'API di HIBP.
Opzioni:
| Opzione | Descrizione |
|---|---|
apikey | Chiave API di HaveIBeenPwned |
rate_limit | Ritardo tra le chiamate API in secondi (default: 2.0) |
Comandi disponibili all'interno del plugin:
| Comando | Descrizione |
|---|---|
run find_breaches | Cercare breach per tutte le email dell'azienda |
find_breaches | Comando diretto (equivalente, richiede plugin hibp attivo) |
Esempio completo:``` emploleaks(miempresa)> use --plugin hibp emploleaks(miempresa)(hibp)> setopt apikey <tu_api_key> emploleaks(miempresa)(hibp)> find_breaches emploleaks(miempresa)(hibp)> print --data breaches
---
## Database di Leaks (ClickHouse)
EmploLeaks può connettersi a un database ClickHouse proprio con credenziali trapelate per cercare password associate agli email/username dei dipendenti scoperti.
### Avviare ClickHouse con Docker```bash
cd clickhouse-docker
docker compose up -d
Espone ClickHouse su:
9000 (protocollo nativo TCP)8123 (interfaccia HTTP)La cartella leaks_data/ viene montata come volume di sola lettura all'interno del contenitore.
.txt, .csv, .dat, .zip, .gz) nella cartella leaks_data/.Il parser rileva automaticamente i formati più comuni:
- `email:password`
- `email:password:url`
- `email;password`
- `email|password`
- `url,email,password`
Per formati sconosciuti, utilizza l'IA configurata (OpenAI/Ollama) per analizzare un campione del file e determinare come analizzarlo. Usa `--no-ai` per omettere il rilevamento con IA.
I file `.zip` e `.gz` vengono decompressi automaticamente prima dell'analisi.
### Cerca credenziali```
emploleaks(miempresa)> find_passwords only_emails
emploleaks(miempresa)> find_passwords find_all
emploleaks(miempresa)> print --data passwords
Si ClickHouse è configurato in tokens.ini, la connessione è automatica all'avvio dello strumento.
credentials in ClickHouse## Disclaimer
Questo strumento è progettato esclusivamente per scopi educativi, di ricerca sulla sicurezza e test di pentesting autorizzati. L'uso di questo strumento per attività maliziose o non autorizzate è strettamente proibito. Gli utenti sono responsabili del rispetto di tutte le leggi e dei termini di servizio del progetto.
| Seleziona un'azienda su cui lavorare |
list_companies | Mostra tutte le aziende |
delete_company --name <nombre> | Elimina un'azienda e tutti i suoi dati |
| Comando | Descrizione |
|---|
use --plugin <nombre> | Attiva un plugin (linkedin, github, hibp) |
deactivate | Disattiva il plugin corrente |
show options | Mostra le opzioni del plugin attivo |
setopt <opción> [valor] | Imposta un'opzione del plugin (se non viene passato un valore, viene richiesto tramite prompt nascosto) |
autosave --enable / --disable | Attiva/disattiva il salvataggio automatico della configurazione in config/tokens.ini |
autoload --enable / --disable | Attiva/disattiva il caricamento automatico della configurazione da config/tokens.ini |
| Comando | Descrizione |
|---|
connect_leaks | Connettersi a ClickHouse utilizzando la configurazione salvata in tokens.ini |
connect_leaks --host <host> --port <port> --save | Connettersi con parametri specifici e salvarli per sessioni future |
disconnect_leaks | Disconnettersi dal database ClickHouse |
import_leaks [directorio] | Importare file di credenziali in ClickHouse (default: leaks_data/) |
import_leaks --no-ai | Importare solo file con formato noto, senza usare IA |
create_db --user <user> --passwd <pass> --dbname <db> [--import-data <dir>] | Creare il database ClickHouse manualmente (legacy) |
| Comando | Descrizione |
|---|
lookup_emails | Cerca email confermati su ~120 piattaforme con Holehe |
lookup_emails --include-potential | Include anche gli email generati |
lookup_emails --email [email protected] | Cerca un email specifico |
lookup_emails --all | Cerca nelle 120+ piattaforme (non solo quelle configurate) |
lookup_emails --list-platforms | Elenca tutte le piattaforme disponibili |
lookup_profiles | Cerca profili per username con Maigret (richiede username caricati) |
lookup_profiles --employee "Juan" | Cerca solo per un impiegato specifico |
| Comando | Descrizione |
|---|
print --data emails | Mostra email confermate e potenziali |
print --data passwords | Mostra credenziali trovate |
print --data breaches | Mostra violazioni di HIBP |
print --data gits | Mostra account GitHub |
print --data twitters | Mostra account Twitter/X |
print --data phones | Mostra numeri di telefono |
print --data websites | Mostra siti web |
print --data secrets | Mostra segreti trovati nei repository |
print --data domains | Mostra domini registrati |
print --data subdomains | Mostra sottodomini scoperti |
print --data all | Mostra tutto consolidato per impiegato |
print --data all --html | Genera un report HTML interattivo con foto |
print --data all --html --ai | Genera report HTML raggruppando impiegati per reparto usando IA |
print --data <tipo> --export | Esporta i dati in un file CSV con timestamp |
| Comando | Descrizione |
|---|
login | Autenticazione iniziale. Persiste la sessione in config/telegram.session |
list_groups | Elenca tutte le chat/canali in cui è presente il tuo account e ne fa uno snapshot in SQLite |
approve <chat_id> [--limit N] | Marca una chat come approvata ed esegue il backfill degli ultimi N messaggi |
unapprove <chat_id> | Rimuove l'approvazione |
list_approved | Tabella delle chat approvate con conteggio dei file scaricati |
backfill <chat_id> [--limit N] | Riscarica gli ultimi N messaggi di una chat approvata |
run [--watch] | Backfill di tutte le chat approvate; con --watch rimane in ascolto degli eventi NewMessage |
status | Riepilogo: approvate / file scaricati / disco utilizzato |
| Campo | Tipo | Descrizione |
|---|
mail_username | String | Parte dell'utente dell'email |
mail_domain | String | Dominio dell'email (senza TLD) |
mail_tld | String | TLD dell'email |
password | String | Password filtrata |
uri_subdomain | String | Sottodominio del sito in cui è stata filtrata |
uri_domain | String | Dominio del sito |
uri_tld | String | TLD del sito |
| Tabella | Descrizione |
|---|
companies | Aziende registrate (nome, logo) |
employees | Dipendenti scoperti (nome, titolo, foto, azienda, dipartimento) |
emails | Email confermate (ottenute da contact_info di LinkedIn) |
potential_emails | Email potenziali generate per formato |
passwords | Password trovate associate alle email |
username_passwords | Password trovate per username |
breaches | Violazioni di HIBP associate alle email |
githubs | URL di profili/repo GitHub |
twitters | URL di profili Twitter/X |
phones | Numeri di telefono |
websites | Siti web personali |
secrets_repos | Segreti trovati nei repository con gitleaks |
social_profiles | Profili sui social network (Holehe + Maigret) |
domains | Domini dell'azienda per discovery |
subdomains | Sottodomini scoperti (IP, fonte, data) |
usernames | Username associati ai dipendenti per Maigret |