一款OSINT工具,用于检测公司成员是否存在泄露凭证。
EmploLeaks 是一款 OSINT(开源情报)工具,配备 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)(用于仓库中的密钥扫描)
- **可选:** [HaveIBeenPwned](https://haveibeenpwned.com/API/Key) 的 API 密钥
- LinkedIn 插件所需的会话 Cookie(`JSESSIONID` 和 `li_at`)
## 安装
1. 克隆仓库:```bash
git clone https://github.com/yourusername/emploleaks.git
cd emploleaks
3. (可选) 使用 Docker 启动 ClickHouse 用于泄露数据库:```bash
cd clickhouse-docker
docker compose up -d
cd ..
运行工具:```bash python emploleaks.py
使用调试模式:```bash
python emploleaks.py -d
| 命令 | 描述 |
|---|---|
help | 显示通用帮助 |
help <命令> | 显示特定命令的帮助 |
quit | 退出应用程序 |
| 命令 | 描述 |
|---|---|
add_company --name <名称> | 添加一家新公司 |
select_company --name <名称> | 选择一家公司进行操作 |
list_companies |
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 亿条泄露凭证的公共数据库(多泄露综合库)。无需 API 密钥,每次搜索时自动查询。使用 `--no-proxynova` 可禁用它。
### 基础设施发现
| 命令 | 描述 |
|---------|-------------|
| `add_domain <dominio>` | 将域名关联到所选公司(例如:`add_domain faradaysec.com`) |
| `discover` | 针对公司所有域名执行子域名枚举,使用 `assetfinder`(可选 SecurityTrails),并解析 DNS |
| `print --data domains` | 显示已注册的域名及发现的子域名数量 |
| `print --data subdomains` | 显示所有子域名及其 IP、来源和发现日期 |
发现模块将被动枚举委托给 [`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多个社交平台。用户名由员工通过webapp手动添加。平台可在 `tokens.ini` 中选择性过滤:```ini
[maigret]
# platforms = instagram, twitter, facebook, tiktok, reddit, github
| Comando | Descripción |
|---|---|
set_ai --endpoint <url> --key <key> --model <modelo> | 配置AI提供商 |
classify | 使用AI将员工分类到部门(保存到数据库) |
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-mini独立守护进程,使用个人Telegram账户(通过Telethon)加入已批准的频道/群组,下载 .txt/.csv/.dat/.zip/.gz 文件并放入 leaks_data/telegram/<chat>/。后续的 import_leaks 使用智能解析器将数据导入ClickHouse。与CLI解耦 — 作为独立进程运行,因此可以24/7运行而无需打开CLI。
初始设置(一次性):
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
Subcomandos:
data/emploleaks.db 中的新表格:
| Tabla | Descripción |
|---|---|
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% 基于Agent的泄露解析器
`utils/leak_parser.py` 模块**仅使用一个AI Agent**来解析每个文件。没有硬编码的正则表达式(已被移除,因为每种新格式都会引入微妙的提取错误)。
**Agent 的流程:**```
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 + 同一运行内的内存缓存。同一文件在不同运行间产生相同schema → import_leaks是幂等的。
典型成本: 每个文件1-3次API调用,约$0.0001-$0.0005(使用gpt-4o-mini)。12个文件:约$0.005 = 半美分。
| 命令 | 描述 |
|---|---|
python emploleaks.py --webapp | 启动Web应用(后端在:8421,前端在:3421) |
该Web应用允许:
允许使用浏览器会话cookie在LinkedIn上搜索公司员工,并生成潜在的企业电子邮件。自动捕获公司Logo。
选项:
| 选项 | 描述 |
|---|---|
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表的结构## 免责声明
该工具仅用于教育、安全研究和授权的渗透测试。严禁将该工具用于恶意或未经授权的活动。用户有责任遵守所有相关法律和项目服务条款。
| 显示所有公司 |
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 | 使用保存在 tokens.ini 中的配置连接到 ClickHouse |
connect_leaks --host <主机> --port <端口> --save | 使用特定参数连接并保存以供后续会话使用 |
disconnect_leaks | 断开与 ClickHouse 数据库的连接 |
import_leaks [目录] | 将凭证文件导入 ClickHouse(默认目录:leaks_data/) |
import_leaks --no-ai | 仅导入已知格式的文件,不使用 AI |
create_db --user <用户> --passwd <密码> --dbname <数据库> [--import-data <目录>] | 手动创建 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" | 仅搜索特定员工 |
| Comando | Descripción |
|---|
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文件 |
| Comando | Descripción |
|---|
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 | 已注册的公司(名称、logo) |
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 |