
企業のメンバーを漏洩した認証情報から検出するのに役立つOSINTツール
EmploLeaksは、CLIインターフェースを備えたOSINT(オープンソースインテリジェンス)ツールで、対象企業の従業員に関する情報を発見・関連付けるために設計されています。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) (リポジトリ内のシークレットスキャン用)
- **任意:** [HaveIBeenPwned](https://haveibeenpwned.com/API/Key) の API キー
- LinkedIn プラグイン用の LinkedIn セッション Cookie (`JSESSIONID` と `li_at`)
## インストール
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
デバッグモード:```bash
python emploleaks.py -d
| コマンド | 説明 |
|---|---|
help | 一般ヘルプを表示します |
help <comando> | 特定のコマンドのヘルプを表示します |
quit | アプリケーションを終了します |
| コマンド | 説明 |
|---|---|
add_company --name <nombre> | 新しい企業を追加します |
select_company --name <nombre> | 作業する企業を選択します |
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/) (32億件の認証情報) で認証情報を検索します。モード: `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** は、32億件のフィルタリングされた認証情報を含む公開データベースです (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`)。
オプションで、SecurityTrailsのAPIキーを設定した場合、そのサブドメインはassetfinderの結果とマージされます:```ini
[discovery]
# securitytrails_key = your_key_here
Holehe(メールルックアップ):"パスワードを忘れた場合"の手法を使用して、各プラットフォームにメールアドレスが登録されているかどうかを、所有者に通知せずに判断します。プラットフォームはtokens.iniで設定されます:```ini
[holehe]
platforms = google, discord, github, instagram, twitter, spotify, ...
**Maigret** (ユーザー名検索): 500以上のソーシャルメディアプラットフォームでユーザー名が存在するかを検索します。ユーザー名は従業員がWebアプリから手動で追加します。プラットフォームはオプションで`tokens.ini`でフィルタリングします:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| コマンド | 説明 |
|---|---|
set_ai --endpoint <url> --key <key> --model <modelo> | AIプロバイダーを設定 |
classify | AIを使用して従業員を部門に分類(DBに保存) |
classify --force | 既に部門が割り当てられていても再分類 |
AI分類は従業員の役職/役割を分析し、部門(Engineering、Security、Salesなど)ごとにグループ化します。部門はSQLiteに永続化され、HTMLレポートやWebアプリで表示されます。
サポートされているプロバイダー(OpenAI互換のAPIなら何でも):
set_ai --endpoint http://localhost:11434/v1 --model llama3set_ai --endpoint https://api.openai.com/v1 --key sk-... --model gpt-4o-miniTelethonを介して個人のTelegramアカウントを使用して承認されたチャンネル/グループに参加し、.txt/.csv/.dat/.zip/.gzファイルをダウンロードしてleaks_data/telegram/<chat>/に保存するスタンドアロンのデーモン。その後、import_leaksがエージェントパーサーを使用してClickHouseに取り込みます。CLIから切り離されています — 別のプロセスとして実行されるため、CLIが開いていなくても24時間稼働できます。
初期設定(ワンタイム):
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 による)でダウンロードされたファイル |
バックグラウンドデーモン:```bash nohup python3.13 telegram_sync.py run --watch >> logs/telegram.log 2>&1 & echo $! > /tmp/telegram_daemon.pid
### 100% エージェント方式のリークパーサー
`utils/leak_parser.py` モジュールは、各ファイルの解析に**AIエージェントのみ**を使用します。ハードコードされた正規表現はありません(新しいフォーマットごとに抽出に微妙なバグが発生するため削除されました)。
**エージェントのパイプライン:**```
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//で始まらない/なし, :は最大1つ, 空白なし, URLプレフィックスで始まらない決定性: すべての呼び出しでtemperature=0 + 同一実行内でのメモリ内キャッシング。同じファイルは実行間で同じスキーマを生成 → import_leaksは冪等です。
典型的なコスト: ファイルあたりAPI呼び出し1-3回, gpt-4o-miniで~$0.0001-$0.0005。12ファイルの場合: ~$0.005 = 0.5セント。
| コマンド | 説明 |
|---|---|
python emploleaks.py --webapp | Webアプリを起動(バックエンド: :8421, フロントエンド: :3421) |
Webアプリでは以下が可能:
ブラウザのセッションCookieを使用してLinkedInで企業の従業員を検索し、潜在的な企業メールを生成できます。自動的に企業のロゴを取得します。
オプション:
| オプション | 説明 |
|---|---|
JSESSIONID | LinkedInのJSESSIONIDセッションCookie |
li-at | LinkedInのli_atセッションCookie |
hide | JSESSIONIDの値を表示時に隠す(デフォルト: yes) |
プラグイン内で使用可能なコマンド:
| コマンド | 説明 |
|---|---|
run impersonate | 設定されたCookieを使用して認証 |
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 バイナリへのパス (デフォルト: PATH内の `gitleaks`) |
| `max_repo_size` | 分析するリポジトリの最大サイズ (MB) (デフォルト: `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のAPIを使用して確認します。
オプション:
| オプション | 説明 |
|---|---|
apikey | HaveIBeenPwnedのAPIキー |
rate_limit | API呼び出し間の遅延(秒単位)(デフォルト: 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データベースに接続できます。
### DockerでClickHouseを起動する```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`
未知のフォーマットの場合、設定されたAI(OpenAI/Ollama)を使用してファイルのサンプルを分析し、解析方法を決定します。`--no-ai`を使用してAI検出を省略します。
`.zip`および`.gz`ファイルは、解析前に自動的に解凍されます。
### 認証情報の検索```
emploleaks(miempresa)> find_passwords only_emails
emploleaks(miempresa)> find_passwords find_all
emploleaks(miempresa)> print --data passwords
ClickHouse が tokens.ini で設定されている場合、ツール起動時に自動的に接続されます。
credentials テーブルの構造## 免責事項
このツールは、教育、セキュリティ研究、および許可されたペネトレーションテストの目的でのみ使用するように設計されています。悪意のある目的や許可されていない活動にこのツールを使用することは固く禁じられています。ユーザーは、すべての法律およびプロジェクトの利用規約を遵守する責任を負います。
list_companies| すべての企業を表示します |
delete_company --name <nombre> | 企業とそのすべてのデータを削除します |
| コマンド | 説明 |
|---|
use --plugin <nombre> | プラグインを有効にします(linkedin、github、hibp) |
deactivate | 現在のプラグインを無効にします |
show options | 現在のプラグインのオプションを表示します |
setopt <opción> [valor] | プラグインのオプションを設定します(値が指定されない場合は非表示プロンプトで入力) |
autosave --enable / --disable | config/tokens.ini への自動保存を有効/無効にします |
autoload --enable / --disable | config/tokens.ini からの自動読み込みを有効/無効にします |
| コマンド | 説明 |
|---|
connect_leaks | tokens.ini に保存された設定を使用して ClickHouse に接続します |
connect_leaks --host <host> --port <port> --save | 特定のパラメータで接続し、今後のセッションのために保存します |
disconnect_leaks | ClickHouse データベースから切断します |
import_leaks [directorio] | 資格情報ファイルを ClickHouse にインポートします(デフォルト: leaks_data/) |
import_leaks --no-ai | 既知の形式のファイルのみをインポートし、AIを使用しません |
create_db --user <user> --passwd <pass> --dbname <db> [--import-data <dir>] | ClickHouse データベースを手動で作成します(レガシー) |
| コマンド | 説明 |
|---|
lookup_emails | Holeheを使用して約120のプラットフォームで確認済みのメールアドレスを検索 |
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 | 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 | メールアドレスの TLD |
password | String | 漏洩したパスワード |
uri_subdomain | String | 漏洩が発生したサイトのサブドメイン |
uri_domain | String | サイトのドメイン |
uri_tld | String | サイトの TLD |
| テーブル | 説明 |
|---|
companies | 登録された企業 (名前, ロゴ) |
employees | 発見された従業員 (名前, 役職, 写真, 企業, 部署) |
emails | 確認済みメール (LinkedIn の contact_info から取得) |
potential_emails | 形式から生成された可能性のあるメール |
passwords | メールに関連して発見されたパスワード |
username_passwords | ユーザー名で発見されたパスワード |
breaches | メールに関連する HIBP の漏洩 |
githubs | GitHub プロファイル/リポジトリの URL |
twitters | Twitter/X プロファイルの URL |
phones | 電話番号 |
websites | 個人ウェブサイト |
secrets_repos | gitleaks でリポジトリから発見された機密情報 |
social_profiles | ソーシャルメディアプロファイル (Holehe + Maigret) |
domains | 発見のための企業ドメイン |
subdomains | 発見されたサブドメイン (IP, ソース, 日付) |
usernames | Maigret 用の従業員に関連するユーザー名 |