malkreide/erlik-graph

GitHub: malkreide/erlik-graph

一款轻量级开源情报链接分析图谱工具,通过共享的 transform 体系同时支持人工可视化调查与 LLM 代理自主驱动的数据丰富。

Stars: 0 | Forks: 0

# Erlik Graph ![Version](https://img.shields.io/badge/version-0.1.0-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Python](https://img.shields.io/badge/python-3.11+-blue) ![Type](https://img.shields.io/badge/OSINT-graph-black) [🇩🇪 德语版本](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, 大语言模型, 实时处理, 无后门, 特权检测, 逆向工具