malkreide/erlik-graph
GitHub: malkreide/erlik-graph
一款轻量级开源情报链接分析图谱工具,通过共享的 transform 体系同时支持人工可视化调查与 LLM 代理自主驱动的数据丰富。
Stars: 0 | Forks: 0
# Erlik Graph




[🇩🇪 德语版本](README.de.md)
**[Erlik](#the-erlik-portfolio)** 开源 AI OSINT 工具组合的一部分。
## 概述
Erlik Graph 重构了 Maltego 的核心理念 —— 在一个交互式**图(Graph)**中,通过 **Transform**(接收一个实体并返回相关实体的函数)将各个**实体(Entities,节点)**连接起来 —— 并将其实现为一个轻量级、可自由修改的 Python 项目。
其核心在于架构:transform 逻辑只需以纯 Python 函数的形式编写**一次**,即可通过共享同一个图存储的**两个适配器**对外提供访问:
- **FastAPI + Cytoscape** —— 可视化、可点击的调查图。由*你*来驱动,每一步都是确定性且可审计的。
- **MCP** —— 将相同的 transform 作为工具暴露出来,供 LLM 代理(例如 Claude)自主调用,以丰富数据并追踪线索。
只需添加一次 transform,它就会同时出现在两个适配器中。
## 功能
- 🔗 **实体 / Transform / 图** 模型,支持自动节点去重
- 🧩 **内置 10 个 transform** —— DNS (A/MX/NS/TXT)、证书透明度子域名 (crt.sh)、RDAP/WHOIS、IP 地理定位、HIBP 数据泄露、Shodan 服务、跨 10 个平台的用户名枚举
- 🖥️ **可视化图**前端 (Cytoscape.js),点击节点 → 运行适用的 transform → 图随之扩展
- 🤖 **MCP 适配器**将每个 transform 暴露为工具,用于 LLM 驱动的 OSINT
- ♻️ **共享核心** —— 一个 `@transform` 装饰器,两个适配器均可自动识别
- 🔌 **可插拔存储** —— 默认为内存中的 `networkx`,或使用共享的 **Neo4j** 后端,以便 MCP 和 FastAPI 适配器对*同一个*图进行读写(Claude 充实数据,你在浏览器中实时查看)
## 前置条件
- Python 3.11+
- 可选:用于 Shodan transform 的 `SHODAN_API_KEY` 和用于数据泄露 transform 的 `HIBP_API_KEY`
- 可选:运行中的 **Neo4j** 实例,以便在两个适配器之间共享同一个图
## 安装说明
```
git clone https://github.com/malkreide/erlik-graph.git
cd erlik-graph
python -m venv .venv
# Windows: .\.venv\Scripts\Activate.ps1 | Unix: source .venv/bin/activate
pip install -r requirements.txt
```
## 使用说明
### 变体 A — 可视化图 (FastAPI)
```
python -m uvicorn erlik_graph.adapters.api_server:app --reload
```
打开 http://127.0.0.1:8000 → 添加种子实体 → 点击节点 → 运行 transform → 图随之扩展。
### 变体 B — MCP (LLM 驱动)
在你的 MCP 客户端中注册该服务器(参见 [.mcp.json](.mcp.json))。这些 transform 将作为工具出现(`domain_to_subdomains`、`username_to_profiles`、`get_graph` 等),并由代理决定追踪哪些线索。
```
{
"mcpServers": {
"erlik-graph": {
"command": "python",
"args": ["-m", "erlik_graph.adapters.mcp_server"],
"cwd": "/path/to/erlik-graph"
}
}
}
```
## 配置
| 变量 | 用途 | 是否必需 |
|---|---|---|
| `SHODAN_API_KEY` | 启用 `ipv4_to_services` transform | 否(未设置时 transform 返回提示信息) |
| `HIBP_API_KEY` | 启用 `email_to_breaches` transform (Have I Been Pwned) | 否(未设置时 transform 返回提示信息) |
| `ERLIK_GRAPH_BACKEND` | 图后端:`memory` (默认) 或 `neo4j` | 否 |
| `NEO4J_URI` | 后端为 `neo4j` 时的 Bolt URI | 仅限 `neo4j` (默认 `bolt://localhost:7687`) |
| `NEO4J_USER` / `NEO4J_PASSWORD` | Neo4j 凭据 | 仅限 `neo4j` |
### 通过 Neo4j 共享图
默认情况下,每个进程都会维护自己独立的内存图,因此 MCP 和 FastAPI 适配器无法看到彼此的数据。将两者都指向 Neo4j 即可共享**同一个**图 —— 这就是预期的“Claude 充实数据,你进行可视化审查”闭环:
```
export ERLIK_GRAPH_BACKEND=neo4j
export NEO4J_URI=bolt://localhost:7687
export NEO4J_USER=neo4j
export NEO4J_PASSWORD=your-password
# Adapter 1 — LLM 通过 MCP 进行丰富
python -m erlik_graph.adapters.mcp_server
# Adapter 2 — 你在浏览器中观看同一个 graph 的增长
python -m uvicorn erlik_graph.adapters.api_server:app --reload
```
通过继承 `BaseGraphStore` 并在 `create_store()` 中返回它,即可切换至其他存储。
## 添加 transform
1. 在 `erlik_graph/transforms/` 目录下的文件中,编写一个用 `@transform(name, input_type, description)` 装饰的函数。
2. 在 `erlik_graph/transforms/__init__.py` 中导入该文件。
现在它会自动出现在**两个**适配器中。
```
@transform("domain_to_ipv4", "domain", "Resolves a domain to its IPv4 addresses.")
def domain_to_ipv4(value: str, properties: dict) -> list[Entity]:
return [Entity(type="ipv4", value=ip, link_label="resolves_to")
for ip in query(value, "A")]
```
## 项目结构
```
erlik_graph/
├── core/ Data model, registry, graph stores
│ ├── entity.py Entity / Edge, de-dup key
│ ├── registry.py @transform decorator + registry
│ ├── base_store.py BaseGraphStore — shared expand() logic
│ ├── graph_store.py in-memory networkx store
│ ├── neo4j_store.py shared Neo4j-backed store
│ └── factory.py create_store() — picks backend from env
├── transforms/ the actual logic — this is where the system grows
│ ├── dns_transforms.py
│ ├── crtsh_transforms.py
│ ├── whois_transforms.py
│ ├── geo_transforms.py
│ ├── breach_transforms.py
│ ├── shodan_transforms.py
│ └── username_transforms.py
├── adapters/
│ ├── api_server.py FastAPI endpoints
│ └── mcp_server.py MCP tools
└── web/index.html Cytoscape front-end
```
## Erlik 工具组合
**Erlik** —— 得名于突厥-蒙古(腾格里信仰)神话中的冥界之神 —— 是一个不断扩充的、专注于特定领域的开源 AI OSINT 工具家族。每个工具都存放在其**独立**的代码库中,并共享 `erlik` 标签以便于发现。`erlik-graph` 是其中的链接分析主力工具;未来会有更多工具(侦察、数据充实、监控等)作为独立代码库加入该组合。
## 法律声明
仅限对你有权调查的系统和数据使用。在汇总个人数据时,请遵守 GDPR 及相关适用法律。
## 更新日志
参见 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
MIT License — 参见 [LICENSE](LICENSE)。
## 作者
Hayal Özkan · [@malkreide](https://github.com/malkreide)
标签:AV绕过, DLL 劫持, ESC4, FastAPI, GitHub, MCP, OSINT, Python, 大语言模型, 实时处理, 无后门, 特权检测, 逆向工具