
Uma ferramenta OSINT que ajuda a detectar membros de uma empresa com credenciais vazadas.
EmploLeaks é uma ferramenta de OSINT (Open Source Intelligence) com uma interface CLI, projetada para descobrir e correlacionar informações sobre funcionários de uma empresa alvo. Permite coletar perfis do LinkedIn, gerar e-mails corporativos potenciais, buscar credenciais vazadas em bases de dados de leaks (ClickHouse internamente), verificar brechas conhecidas através do HaveIBeenPwned, descobrir infraestrutura da empresa e perfilhar funcionários em redes sociais. Toda a informação é armazenada localmente em SQLite para análise posterior.
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
## Requisitos
- Python 3.10+
- pip
- Conexão à Internet
- **Opcional:** Docker e Docker Compose (para executar o ClickHouse localmente)
- **Opcional:** [gitleaks](https://github.com/gitleaks/gitleaks) (para escaneamento de segredos em repositórios)
- **Opcional:** chave de API do [HaveIBeenPwned](https://haveibeenpwned.com/API/Key)
- Cookies de sessão do LinkedIn (`JSESSIONID` e `li_at`) para o plugin do LinkedIn
## Instalação
1. Clonar o repositório:```bash
git clone https://github.com/yourusername/emploleaks.git
cd emploleaks
3. (Opcional) Iniciar o ClickHouse com Docker para o banco de dados de vazamentos:```bash
cd clickhouse-docker
docker compose up -d
cd ..
Executar a ferramenta:```bash python emploleaks.py
Com modo debug:```bash
python emploleaks.py -d
| Comando | Descrição |
|---|---|
help | Mostra a ajuda geral |
help <comando> | Mostra a ajuda de um comando específico |
quit | Sai da aplicação |
| Comando | Descrição |
|---|---|
add_company --name <nome> | Adiciona uma nova empresa |
select_company --name <nome> |
A conexão ao ClickHouse é configurada em config/tokens.ini:```ini
[clickhouse]
host = localhost
port = 9000
user = default
passwd =
dbname = credentials_db
Se o ClickHouse estiver configurado em `tokens.ini`, a conexão é estabelecida automaticamente ao iniciar.
### Busca de Credenciais e Brechas
| Comando | Descrição |
|---------|-------------|
| `find_passwords <modo>` | Busca credenciais no ClickHouse + [ProxyNova COMB](https://www.proxynova.com/tools/comb/) (3.2B credenciais). Modos: `find_all`, `only_usernames`, `only_emails` |
| `find_passwords <modo> --no-proxynova` | Apenas busca no ClickHouse local |
| `find_passwords <modo> --no-clickhouse` | Apenas busca no ProxyNova COMB (não requer ClickHouse) |
| `find_passwords <modo> --email <email>` | Busca credenciais para um e-mail específico |
| `find_breaches` | Busca brechas no HIBP para todos os e-mails da empresa (requer plugin `hibp` ativo) |
**ProxyNova COMB** é uma base de dados pública com 3.2 bilhões de credenciais vazadas (Combination Of Many Breaches). Não requer chave de API e é consultada automaticamente a cada busca. Use `--no-proxynova` para desativá-la.
### Descoberta de Infraestrutura
| Comando | Descrição |
|---------|-------------|
| `add_domain <dominio>` | Associa um domínio à empresa selecionada (ex: `add_domain faradaysec.com`) |
| `discover` | Executa enumeração de subdomínios contra todos os domínios da empresa usando `assetfinder` (+ SecurityTrails opcional), resolvendo DNS |
| `print --data domains` | Mostra os domínios registrados e a quantidade de subdomínios encontrados |
| `print --data subdomains` | Mostra todos os subdomínios com seu IP, fonte e data de descoberta |
O módulo de Descoberta delega a enumeração passiva ao [`assetfinder`](https://github.com/tomnomnom/assetfinder), que internamente agrega resultados de crt.sh, HackerTarget, BufferOver e outras fontes sem chave de API. O binário deve estar no `$PATH` (instalação: `go install github.com/tomnomnom/assetfinder@latest`).
Opcionalmente, se você configurar uma chave de API do SecurityTrails, seus subdomínios são mesclados com os do assetfinder:```ini
[discovery]
# securitytrails_key = your_key_here
Holehe (email lookup): utiliza a técnica de "forgot password" para determinar se um e-mail está registrado em cada plataforma, sem alertar o proprietário. As plataformas são configuradas em tokens.ini:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret** (username lookup): procura se um username existe em 500+ plataformas de redes sociais. Os usernames são adicionados manualmente por funcionário a partir da webapp. As plataformas são opcionalmente filtradas em `tokens.ini`:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| Comando | Descrição |
|---|---|
set_ai --endpoint <url> --key <key> --model <modelo> | Configura o provedor de IA |
classify | Classifica funcionários em departamentos usando IA (salva no BD) |
classify --force | Re-classifica mesmo que já tenham departamento atribuído |
A classificação por IA analisa os títulos/funções dos funcionários e os agrupa por departamento (Engineering, Security, Sales, etc.). Os departamentos são persistidos no SQLite e ficam visíveis no relatório HTML e na webapp.
Provedores suportados (qualquer API compatível com OpenAI):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniDaemon standalone que usa uma conta pessoal do Telegram (via Telethon) para entrar em canais/grupos aprovados, baixar arquivos .txt/.csv/.dat/.zip/.gz e deixá-los em leaks_data/telegram/<chat>/. O import_leaks posterior os ingere no ClickHouse usando o parser agentivo. Decoupled do CLI — roda como processo separado, podendo ficar 24/7 sem a CLI estar aberta.
Setup inicial (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
Subcomandos:
Tabelas novas em data/emploleaks.db:
| Tabela | Descrição |
|---|---|
telegram_groups | Snapshot de chats (chat_id, title, username, approved, backfill_limit, last_sync_at) |
telegram_files | Arquivos baixados com dedup por (chat_id, message_id) e por SHA-256 do conteúdo |
Daemon em segundo plano:```bash nohup python3.13 telegram_sync.py run --watch >> logs/telegram.log 2>&1 & echo $! > /tmp/telegram_daemon.pid
---
### Parser de Leaks 100% Agêntico
O módulo `utils/leak_parser.py` usa **exclusivamente um agente de IA** para processar cada arquivo. Não há regex hardcoded (elas foram eliminadas porque cada novo formato introduzia bugs sutis de extração).
**Pipeline do 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 — validação transversal:
/ : \ space, não começa com http/android/ftp//./, máximo um :, sem whitespace, não começa com prefixo de URL.Determinismo: temperature=0 em todas as chamadas + caching em memória dentro de uma mesma execução. O mesmo arquivo produz o mesmo schema entre execuções → import_leaks é idempotente.
Custo típico: 1-3 chamadas à API por arquivo, ~$0.0001-$0.0005 com gpt-4o-mini. Para 12 arquivos: ~$0.005 = meio centavo.
| Comando | Descrição |
|---|---|
python emploleaks.py --webapp | Lança a webapp (backend em :8421, frontend em :3421) |
A webapp permite:
Permite buscar funcionários de uma empresa no LinkedIn usando cookies de sessão do navegador, e gerar e-mails corporativos potenciais. Captura automaticamente o logotipo da empresa.
Opções:
| Opção | Descrição |
|---|---|
JSESSIONID | Cookie de sessão JSESSIONID do LinkedIn |
li-at | Cookie de sessão li_at do LinkedIn |
hide | Ocultar o valor do JSESSIONID ao exibi-lo (padrão: yes) |
Comandos disponíveis dentro do plugin:
| Comando | Descrição |
|---|---|
run impersonate | Autenticar usando as cookies configuradas |
run find <company_linkedin> <dominio_email> [--email-format FORMAT] | Buscar funcionários e gerar e-mails |
Formatos de e-mail disponíveis:
f_last (ex: [email protected]) e f.last (ex: [email protected])--email-format: usa placeholders {n} (inicial nome), {s} (sobrenome), {name} (nome completo), {l} (inicial sobrenome)
--email-format {n}.{s} gera [email protected]Exemplo 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
Permite obter informações de perfis do GitHub, listar repositórios e escanear segredos em repositórios com gitleaks.
**Opções:**
| Opção | Descrição |
|--------|-------------|
| `token` | Token de acesso pessoal do GitHub |
| `blur` | Ofuscar o token ao exibi-lo |
| `gitleaks_path` | Caminho para o binário do gitleaks (padrão: `gitleaks` no PATH) |
| `max_repo_size` | Tamanho máximo do repo para analisar em MB (padrão: `15`) |
**Comandos disponíveis dentro do plugin:**
| Comando | Descrição |
|---------|-------------|
| `run stalk <username>` | Obter email de uma conta GitHub |
| `run get_repos <username>` | Listar repositórios públicos de um usuário |
| `run find_secrets` | Escanear segredos em repositórios de funcionários da empresa |
| `run find_secrets --download-all` | Igual, mas sem limite de tamanho |
**Exemplo 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 os emails da empresa aparecem em brechas conhecidas usando a API do HIBP.
Opções:
| Opção | Descrição |
|---|---|
apikey | API key do HaveIBeenPwned |
rate_limit | Atraso entre chamadas à API em segundos (padrão: 2.0) |
Comandos disponíveis dentro do plugin:
| Comando | Descrição |
|---|---|
run find_breaches | Buscar brechas para todos os emails da empresa |
find_breaches | Comando direto (equivalente, requer plugin hibp ativo) |
Exemplo 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
---
## Base de Dados de Vazamentos (ClickHouse)
EmploLeaks pode conectar-se a um banco de dados ClickHouse próprio com credenciais vazadas para buscar senhas associadas aos e-mails/nomes de usuário dos funcionários descobertos.
### Iniciar ClickHouse com Docker```bash
cd clickhouse-docker
docker compose up -d
Isso expõe o ClickHouse em:
9000 (protocolo nativo TCP)8123 (interface HTTP)A pasta leaks_data/ é montada como volume somente leitura dentro do contêiner.
.txt, .csv, .dat, .zip, .gz) na pasta leaks_data/.O parser detecta automaticamente os formatos mais comuns:
- `email:password`
- `email:password:url`
- `email;password`
- `email|password`
- `url,email,password`
Para formatos desconhecidos, utiliza a IA configurada (OpenAI/Ollama) para analisar uma amostra do arquivo e determinar como analisá-lo. Use `--no-ai` para omitir a detecção com IA.
Arquivos `.zip` e `.gz` são descompactados automaticamente antes da análise.
### Buscar credenciais```
emploleaks(miempresa)> find_passwords only_emails
emploleaks(miempresa)> find_passwords find_all
emploleaks(miempresa)> print --data passwords
Se o ClickHouse estiver configurado no tokens.ini, a conexão é automática ao iniciar a ferramenta.
credentials no ClickHouse## Aviso Legal
Esta ferramenta foi projetada exclusivamente para fins educacionais, de pesquisa em segurança e testes de pentest autorizados. O uso desta ferramenta para atividades maliciosas ou não autorizadas é estritamente proibido. Os usuários são responsáveis por cumprir todas as leis e termos de serviço do projeto.
| Seleciona uma empresa para trabalhar |
list_companies | Mostra todas as empresas |
delete_company --name <nome> | Remove uma empresa e todos os seus dados |
| Comando | Descrição |
|---|
use --plugin <nome> | Ativa um plugin (linkedin, github, hibp) |
deactivate | Desativa o plugin atual |
show options | Mostra as opções do plugin ativo |
setopt <opção> [valor] | Configura uma opção do plugin (se nenhum valor for passado, é solicitado via prompt oculto) |
autosave --enable / --disable | Ativa/desativa o salvamento automático de configuração em config/tokens.ini |
autoload --enable / --disable | Ativa/desativa o carregamento automático de configuração de config/tokens.ini |
| Comando | Descrição |
|---|
connect_leaks | Conectar ao ClickHouse usando a configuração salva em tokens.ini |
connect_leaks --host <host> --port <port> --save | Conectar com parâmetros específicos e salvá-los para futuras sessões |
disconnect_leaks | Desconectar do banco de dados ClickHouse |
import_leaks [diretório] | Importar arquivos de credenciais para o ClickHouse (padrão: leaks_data/) |
import_leaks --no-ai | Importar apenas arquivos com formato conhecido, sem usar IA |
create_db --user <user> --passwd <pass> --dbname <db> [--import-data <dir>] | Criar o BD ClickHouse manualmente (legacy) |
| Comando | Descrição |
|---|
lookup_emails | Busca e-mails confirmados em ~120 plataformas com Holehe |
lookup_emails --include-potential | Inclui também os e-mails gerados |
lookup_emails --email [email protected] | Busca um e-mail específico |
lookup_emails --all | Busca nas 120+ plataformas (não apenas as configuradas) |
lookup_emails --list-platforms | Lista todas as plataformas disponíveis |
lookup_profiles | Busca perfis por username com Maigret (requer usernames carregados) |
lookup_profiles --employee "Juan" | Busca apenas para um funcionário específico |
| Comando | Descrição |
|---|
print --data emails | Mostra emails confirmados e potenciais |
print --data passwords | Mostra credenciais encontradas |
print --data breaches | Mostra breaches do HIBP |
print --data gits | Mostra contas do GitHub |
print --data twitters | Mostra contas do Twitter/X |
print --data phones | Mostra números de telefone |
print --data websites | Mostra sites |
print --data secrets | Mostra segredos encontrados em repositórios |
print --data domains | Mostra domínios registrados |
print --data subdomains | Mostra subdomínios descobertos |
print --data all | Mostra tudo consolidado por funcionário |
print --data all --html | Gera um relatório HTML interativo com fotos |
print --data all --html --ai | Gera relatório HTML agrupando funcionários por departamento usando IA |
print --data <tipo> --export | Exporta os dados para um arquivo CSV com timestamp |
| Comando | Descrição |
|---|
login | Autenticação inicial. Persiste sessão em config/telegram.session |
list_groups | Lista todos os chats/canais onde sua conta está, e os snapshotta no SQLite |
approve <chat_id> [--limit N] | Marca um chat como aprovado e executa backfill dos últimos N mensagens |
unapprove <chat_id> | Remove a aprovação |
list_approved | Tabela de chats aprovados com contagem de arquivos baixados |
backfill <chat_id> [--limit N] | Re-baixa os últimos N mensagens de um chat aprovado |
run [--watch] | Backfill de todos os aprovados; com --watch fica ouvindo eventos NewMessage |
status | Resumo: aprovados / arquivos baixados / disco usado |
| Campo | Tipo | Descrição |
|---|
mail_username | String | Parte do usuário do email |
mail_domain | String | Domínio do email (sem TLD) |
mail_tld | String | TLD do email |
password | String | Senha vazada |
uri_subdomain | String | Subdomínio do site onde vazou |
uri_domain | String | Domínio do site |
uri_tld | String | TLD do site |
| Tabela | Descrição |
|---|
companies | Empresas registradas (nome, logo) |
employees | Funcionários descobertos (nome, cargo, foto, empresa, departamento) |
emails | E-mails confirmados (obtidos de contact_info do LinkedIn) |
potential_emails | E-mails potenciais gerados por formato |
passwords | Senhas encontradas associadas a e-mails |
username_passwords | Senhas encontradas por username |
breaches | Vazamentos do HIBP associados a e-mails |
githubs | URLs de perfis/repos GitHub |
twitters | URLs de perfis Twitter/X |
phones | Números de telefone |
websites | Sites web pessoais |
secrets_repos | Segredos encontrados em repositórios com gitleaks |
social_profiles | Perfis em redes sociais (Holehe + Maigret) |
domains | Domínios da empresa para discovery |
subdomains | Subdomínios descobertos (IP, fonte, data) |
usernames | Usernames associados a funcionários para Maigret |