nekiyRichie/recon-mcp

GitHub: nekiyRichie/recon-mcp

一个无需 API 密钥的 MCP 服务器,为 AI agent 提供 15 个免费公开 OSINT 工具,用于被动收集互联网基础设施情报。

Stars: 0 | Forks: 0

# recon-mcp 一个 MCP server,为 AI agent 提供 15 个基于免费、公开来源的 OSINT 工具。 无需 API 密钥,无需账户,无需注册——这里的每个数据源都允许在 未认证状态下访问。 它也是一个完整的实战示例,展示了当 MCP server 必须在实际使用中生存,而不仅仅是作为演示时,会发生哪些改变:响应格式化、上下文预算控制、针对不同 endpoint 的重试策略,以及将原本需要十次调用的固定流程压缩为一次的复合工具。 ``` "Map the attack surface of example.com" → recon_domain("example.com") 1 call, ~4s → 240 subdomains from Certificate Transparency → 15 resolved in parallel → 9 addresses profiled for open ports and known CVEs ``` ## 安装 ``` git clone https://github.com//recon-mcp && cd recon-mcp python -m venv .venv && . .venv/bin/activate pip install -e . ``` 将其注册到任何 MCP 客户端。对于 Claude Desktop / Claude Code: ``` { "mcpServers": { "recon": { "command": "/absolute/path/to/recon-mcp/.venv/bin/recon-mcp" } } } ``` 这就是全部设置。没有配置文件,也不需要进行任何 认证。 ## 工具 | 工具 | 功能 | |---|---| | `recon_domain` | 完整的初步扫描:CT → DNS → 主机暴露情况,一次调用完成 | | `crt_subdomains` | 从证书透明度日志 (Certificate Transparency logs) 获取子域名 | | `crt_certificates` | 原始 CT 条目 —— 颁发者、有效期、SAN | | `dns_records` | 一次并行调用获取 A/AAAA/CNAME/MX/NS/TXT/SOA 记录 | | `dns_lookup` | 查询一种特定的记录类型 | | `dns_reverse` | 查询 IPv4 地址的 PTR 记录 | | `host_profile` | Shodan InternetDB:端口、主机名、标签、CVE | | `host_ports` | 仅查询开放端口 | | `host_vulns` | 仅查询 CVE,并附带误报警告 | | `cve_lookup` | 查询单个 CVE:CVSS 分数、向量、描述 | | `cve_search` | 按关键字搜索 CVE,按最新排序 | | `rdap_domain` | 注册数据:日期、注册商、域名服务器 | | `rdap_ip` | 网络块所有者、IP 范围、国家 | | `wayback_urls` | 某个域名下归档的历史 URL | | `wayback_snapshots` | 某个 URL 随时间变化的快照,附带摘要 | 数据来源:[crt.sh](https://crt.sh)、Cloudflare 和 Google DNS-over-Https、 [Shodan InternetDB](https://internetdb.shodan.io)、[NVD](https://nvd.nist.gov)、 [RDAP](https://rdap.org)、[Wayback Machine](https://web.archive.org)。 ## 设计说明 这些部分经历了多次迭代,并最终呈现出当前的设计原因。 ### 统一响应格式,包括失败时 每个工具都返回相同的结构: ``` { "ok": true, "status": 200, "data": {}, "pivots": {"hosts": [], "ips": [], "emails": [], "urls": []}, "truncated": false, "hint": "..." } ``` 如果每个工具都自行发明返回格式,会导致模型在每次调用时都要重新理解数据结构。错误状态也保持相同的结构——如果一个工具在失败时返回一个纯字符串,会迫使 agent 在读取任何内容之前,必须先根据类型进行分支判断。 `hint` 字段携带了状态码无法表达的信息:例如 Shodan 返回 404 意味着“从未被爬取,可能没有暴露的端口”,而不是“工具损坏”;或者从 banner 匹配中获得的 CVE 列表在补丁被回溯移植时,可能会产生误报。 ### 默认紧凑模式,`full` 为可选 侦察 endpoint 返回的数据量通常很大。对一个活跃域名进行 CT 查询会返回数万条记录;将这些数据直接交给模型会导致会话上下文超限。因此,列表会被自动截断为 25 项,字符串会被截断为 6000 个字符,并设置 `truncated` 标志以确保不会有数据被静默丢弃。当调用者明确需要全部数据时,任何工具都可以接受 `full: true` 参数。 这个限制是有意设得很紧的。Agent 随时可以请求更多数据——但它无法恢复已经爆掉的上下文窗口。 ### `pivots` —— 无需解析步骤的下一跳 每次响应都会从 payload 中提取主机名、IP、邮箱和 URL。 接下来值得查询的标识符通常出现在难以预测的地方:主机名可能出现在证书主体中、重定向目标或 PTR 记录中,且它们的字段名各不相同。将这些信息集中提取出来,意味着 agent 可以直接进行链式查询,而无需通过解析自然语言来寻找下一个查询目标。 ### 针对 endpoint 的重试预算 为所有数据源设置相同的重试策略在两个极端情况下都是错误的。crt.sh 响应缓慢,且在高负载下容易出现网关错误:因此需要长超时、少重试、保持耐心。NVD 将未认证的调用者限制为大约每 30 秒 5 次请求:因此需要积极退避,并缓存一小时。DNS 查询快速且成本低:短超时,并立即使用备用解析器重试。 对一个已知损坏的 endpoint 重试四次,会将一次失败的调用变成让 agent 停滞四十秒——这在用户体验上等同于工具坏了。 ### 复合工具 针对域名的初步扫描流程总是相同的序列,模型在这些步骤之间的“推理”毫无价值,反而增加了真实的延迟。 `recon_domain` 在进程内运行,并并行展开这些调用:原本约 15 次的调用被压缩为 1 次。各个单源工具仍然保留,以便深入挖掘概览中发现的具体细节。 它的 `host_limit` 上限是关键所在。某些域名可能有成千上万个子域名;解析所有这些子域名将意味着进行数千次 DNS 查询,并产生一个无人能阅读的结果。该工具会选取最有潜力的部分进行查询,明确指出跳过了多少,并让调用者根据需要自行决定是否深入查询。 ### 故障限制在工具内部 如果 handler 中出现未捕获的异常,该异常将作为协议错误传播,并且(取决于客户端)可能会中断连接,或者导致 agent 对发生的事情一无所知。所有异常都会在边界处被捕获,并作为标准的失败响应返回:一个损坏的工具最多只会浪费一个对话轮次,而不会导致整个会话崩溃。 日志输出被重定向到 stderr,绝不输出到 stdout——因为 stdout 用于承载 MCP 协议数据,在那里出现的一行意外日志会破坏数据流,从客户端侧调试这种问题是非常痛苦的。 ## 适用范围与使用场景 该项目仅查询关于面向互联网的基础设施的公共数据库。它不会向目标本身发送任何流量:数据完全来源于证书日志、被动 DNS、归档的爬取记录和现有的扫描索引。这使得它非常适合用于攻击面映射、资产盘点和前期介入研究。 它不是扫描器,也不能确认任何漏洞状态。从 Shodan 获取的 CVE 是通过 banner 推断出来的,并且会过时;归档的 URL 可能早已失效。这里的所有信息都只是需要进一步验证的线索,而不是可以直接报告的发现。 ## License MIT
标签:ESC4, GitHub, MCP, OSINT, Python, 动态插桩, 实时处理, 无后门, 资产测绘, 逆向工具