
Инструмент OSINT, который помогает обнаружить сотрудников компании с утекшими учетными данными
EmploLeaks — это инструмент OSINT (Open Source Intelligence) с 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 <команда> | Показывает справку по конкретной команде |
quit | Выход из приложения |
| Команда | Описание |
|---|---|
add_company --name <имя> | Добавляет новую компанию |
select_company --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>` | Ищет учетные данные для конкретного email |
| `find_breaches` | Ищет утечки в HIBP для всех email компании (требуется активный плагин `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, источником и датой обнаружения |
Модуль Discovery делегирует пассивное перечисление [`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 (поиск email): использует технику «забыл пароль», чтобы определить, зарегистрирован ли email на каждой платформе, не оповещая владельца. Платформы настраиваются в tokens.ini:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret** (поиск имени пользователя): проверяет, существует ли имя пользователя на 500+ платформах социальных сетей. Имена пользователей добавляются вручную сотрудником через веб-приложение. Платформы опционально фильтруются в `tokens.ini`:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| Comando | Descripción |
|---|---|
set_ai --endpoint <url> --key <key> --model <modelo> | Настраивает провайдера ИИ |
classify | Классифицирует сотрудников по отделам с помощью ИИ (сохраняется в БД) |
classify --force | Переклассифицирует, даже если отдел уже назначен |
Классификация на основе ИИ анализирует должности/роли сотрудников и группирует их по отделам (Engineering, Security, Sales и т.д.). Отделы сохраняются в SQLite и отображаются в HTML-отчете и веб-приложении.
Proveedores soportados (cualquier API compatible con OpenAI):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniАвтономный демон, который использует личный аккаунт Telegram (через Telethon) для входа в одобренные каналы/группы, загрузки файлов .txt/.csv/.dat/.zip/.gz и сохранения их в leaks_data/telegram/<chat>/. Последующий import_leaks загружает их в ClickHouse с помощью агентного парсера. Отделен от CLI — работает как отдельный процесс, поэтому может работать 24/7 без открытого CLI.
Setup inicial (one-time):
api_id y 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:
Новые таблицы в data/emploleaks.db:
| Таблица | Описание |
|---|---|
telegram_groups | Снимок чатов (chat_id, title, username, approved, backfill_limit, last_sync_at) |
telegram_files | Загруженные файлы с дедупликацией по (chat_id, message_id) и по SHA-256 содержимого |
Фоновый демон:```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, используя файлы cookie сессии браузера, и генерировать потенциальные корпоративные email'ы. Автоматически захватывает логотип компании.
Параметры:
| Параметр | Описание |
|---|---|
JSESSIONID | Cookie сессии JSESSIONID от LinkedIn |
li-at | Cookie сессии li_at от LinkedIn |
hide | Скрывать значение JSESSIONID при отображении (по умолчанию: yes) |
Доступные команды внутри плагина:
| Команда | Описание |
|---|---|
run impersonate | Аутентификация с использованием настроенных cookies |
run find <company_linkedin> <dominio_email> [--email-format FORMAT] | Поиск сотрудников и генерация email'ов |
Доступные форматы email:
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>` | Получить email учётной записи 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
Проверяет, появляются ли email-адреса компании в известных утечках, используя API HIBP.
Опции:
| Опция | Описание |
|---|---|
apikey | API ключ HaveIBeenPwned |
rate_limit | Задержка между вызовами API в секундах (по умолчанию: 2.0) |
Команды, доступные внутри плагина:
| Команда | Описание |
|---|---|
run find_breaches | Найти утечки для всех email-адресов компании |
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 с утёкшими учетными данными для поиска паролей, связанных с email/именами пользователей обнаруженных сотрудников.
### Запуск 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 <имя> | Удаляет компанию и все её данные |
| Команда | Описание |
|---|
use --plugin <имя> | Активирует плагин (linkedin, github, hibp) |
deactivate | Деактивирует текущий плагин |
show options | Показывает параметры активного плагина |
setopt <параметр> [значение] | Устанавливает параметр плагина (если значение не передано, запрашивается скрытым вводом) |
autosave --enable / --disable | Включает/отключает автоматическое сохранение конфигурации в config/tokens.ini |
autoload --enable / --disable | Включает/отключает автоматическую загрузку конфигурации из config/tokens.ini |
| Команда | Описание |
|---|
connect_leaks | Подключиться к ClickHouse, используя настройки, сохранённые в tokens.ini |
connect_leaks --host <хост> --port <порт> --save | Подключиться с указанными параметрами и сохранить их для будущих сессий |
disconnect_leaks | Отключиться от базы данных ClickHouse |
import_leaks [каталог] | Импортировать файлы с учётными данными в ClickHouse (по умолчанию: leaks_data/) |
import_leaks --no-ai | Импортировать только файлы с известным форматом, без использования ИИ |
create_db --user <пользователь> --passwd <пароль> --dbname <имя_бд> [--import-data <каталог>] | Создать базу данных ClickHouse вручную (устаревший способ) |
| Команда | Описание |
|---|
lookup_emails | Ищет подтвержденные email-адреса на ~120 платформах с помощью Holehe |
lookup_emails --include-potential | Также включает сгенерированные email-адреса |
lookup_emails --email [email protected] | Ищет конкретный email-адрес |
lookup_emails --all | Ищет на 120+ платформах (не только настроенных) |
lookup_emails --list-platforms | Перечисляет все доступные платформы |
lookup_profiles | Ищет профили по имени пользователя с помощью Maigret (требует загруженные имена пользователей) |
lookup_profiles --employee "Juan" | Ищет только для конкретного сотрудника |
| Comando | Descripción |
|---|
print --data emails | Показывает подтвержденные и потенциальные email-адреса |
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] | Отмечает чат как одобренный и запускает backfill последних N сообщений |
unapprove <chat_id> | Снимает одобрение |
list_approved | Таблица одобренных чатов с количеством загруженных файлов |
backfill <chat_id> [--limit N] | Повторно загружает последние N сообщений из одобренного чата |
run [--watch] | Backfill всех одобренных; с --watch слушает события NewMessage |
status | Сводка: одобренные / загруженные файлы / использованный диск |
| Поле | Тип | Описание |
|---|
mail_username | String | Часть имени пользователя email |
mail_domain | String | Домен email (без TLD) |
mail_tld | String | TLD email |
password | String | Утекший пароль |
uri_subdomain | String | Поддомен сайта, где произошла утечка |
uri_domain | String | Домен сайта |
uri_tld | String | TLD сайта |
| Таблица | Описание |
|---|
companies | Зарегистрированные компании (название, логотип) |
employees | Обнаруженные сотрудники (имя, должность, фото, компания, отдел) |
emails | Подтвержденные email (получены из contact_info LinkedIn) |
potential_emails | Потенциальные email, сгенерированные по шаблону |
passwords | Найденные пароли, связанные с email |
username_passwords | Пароли, найденные по username |
breaches | Утечки из HIBP, связанные с email |
githubs | URL профилей/репозиториев GitHub |
twitters | URL профилей Twitter/X |
phones | Номера телефонов |
websites | Личные веб-сайты |
secrets_repos | Секреты, найденные в репозиториях с помощью gitleaks |
social_profiles | Профили в социальных сетях (Holehe + Maigret) |
domains | Домены компании для discovery |
subdomains | Обнаруженные поддомены (IP, источник, дата) |
usernames | Имена пользователей, связанные с сотрудниками для Maigret |