
Discover Exposed AI Services
面向暴露的AI代理基础设施的互联网规模发现与安全测试平台。
AIMap 可发现、指纹识别并安全测试公开暴露的 AI 端点——包括 MCP 服务器、Ollama 实例、vLLM/LiteLLM 代理、LangServe 链、Gradio 应用、ComfyUI 节点等。可以将其视为 Shodan,但专门为 AI 代理攻击面打造。
由 Bishop Fox 构建。
警告 此工具仅用于授权的渗透测试和安全研究。您只能对您拥有或已获得明确书面许可的系统使用 AIMap。未经授权访问计算机系统是非法的。Bishop Fox 不承担任何责任,也不对因使用此工具造成的任何滥用或损害负责。请负责任地使用。
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ 后端 │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ 扫描器 │ │ 流 │
└──────────┘ └──────────┘ └──────────┘
后端 — Python/FastAPI,使用异步 MongoDB(Motor)、Redis Streams 用于攻击日志流,以及一个发现引擎,该引擎编排 Shodan 查询 → httpx 存活检查 → Nuclei 模板扫描 → 富化流水线。
前端 — React 18 + TypeScript + Tailwind CSS + shadcn/ui。包含 3D 地球仪(globe.gl)、通过 WebSocket 实时攻击流,以及类似 Shodan 的搜索界面。
扫描 — 5 个自定义 Nuclei YAML 模板,用于 MCP 服务器检测、MCP 工具枚举、OpenAI 兼容 API 检测、LangServe 检测和提示泄露测试。
每个端点根据以下因子计算 0–10 的风险评分:
# 克隆
git clone [email protected]:BishopFox/aimap.git
cd aimap
# 配置
cp .env.example .env
# 编辑 .env — 至少设置 SHODAN_API_KEY
# 启动
docker compose up --build
这会启动 4 个服务:
打开 http://localhost 访问 UI。
# 后端
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# 前端(另开一个终端)
cd frontend
npm install
npm run dev # 启动在 http://localhost:5173
确保 MongoDB 在本地 27017 端口运行。Redis 可选——当 Redis 不可用时后端会回退到内存缓冲区。
在项目根目录创建一个 .env 文件:
# 必需
SHODAN_API_KEY=你的_shodan_api_key
# 可选——Censys 作为额外的发现源
CENSYS_API_ID=
CENSYS_API_SECRET=
# 可选——启用 AI 驱动的攻击分析
ANTHROPIC_API_KEY=
# MongoDB(默认值适用于本地开发)
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=aimap
# Redis(默认值适用于本地开发;可选)
REDIS_URL=redis://localhost:6379/0
# CORS(默认允许所有来源)
CORS_ORIGINS=*
# Modal 无服务器(将扫描/攻击分派到 Modal 容器)
MODAL_ENABLED=false
# Clerk 认证——见下文
CLERK_ISSUER=
AIMap 使用 Clerk 进行认证。要启用:
# .env(项目根目录)
CLERK_ISSUER=https://your-app.clerk.accounts.dev
# frontend/.env.local
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
要禁用认证(本地开发、演示):将 CLERK_ISSUER 留空或不设置。后端将以合成 local 用户身份接受所有请求。
ollama、mcp_protocol、vllm)或输入自定义 Shodan 查询net:<cidr>)使用搜索栏配合类似 Shodan 的查询语法:
protocol:mcp # MCP 服务器
auth:none # 无认证
risk:critical # 风险评分 >= 9.0
risk:high # 风险评分 7.0 – 8.9
risk:medium # 风险评分 4.0 – 6.9
risk:low # 风险评分 1.0 – 3.9
tool:query_db # 暴露特定工具的端点
country:US # 按国家代码
port:11434 # 按端口号
org:"Amazon AWS" # 按托管组织(引号内多词值)
has:system_prompt # 具有泄露系统提示的端点
自由组合筛选条件:
protocol:mcp auth:none country:US # 美国境内未认证的 MCP 服务器
risk:critical tool:exec_code # 具有代码执行工具的严重风险端点
protocol:ollama port:11434 # 默认端口上的 Ollama
任何不匹配 key:value 模式的文本都将被视为对所有索引字段的自由文本搜索。
首页展示一个交互式 3D 地球仪,显示所有已发现的端点:
templates/ 目录中的自定义模板:
所有端点都以 /api/ 为前缀。
aimap/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI 应用、生命周期、CORS、路由
│ │ ├── config.py # 从环境变量读取 Pydantic 设置
│ │ ├── auth.py # Clerk JWT 验证(CLERK_ISSUER 为空时绕过)
│ │ ├── database.py # 异步 MongoDB(Motor)连接
│ │ ├── limiter.py # SlowAPI 速率限制
│ │ ├── routes/
│ │ │ ├── endpoints.py # CRUD + 搜索 + 地球仪 + 富化
│ │ │ ├── scans.py # 扫描生命周期 + 执行 + WebSocket
│ │ │ └── attack.py # 攻击分派 + Redis Streams + WebSocket
│ │ ├── discovery/
│ │ │ ├── orchestrator.py # 扫描流水线:Shodan → httpx → Nuclei → 导入
│ │ │ ├── shodan_adapter.py # 32 个策划的 Shodan 查询 + 结果标准化
│ │ │ ├── nuclei_runner.py # Nuclei 子进程运行器 + 发现解析器
│ │ │ └── base.py # SourceAdapter 抽象基类
│ │ └── services/
│ │ ├── attack_mcp.py # MCP 协议攻击引擎
│ │ ├── attack_ollama.py # Ollama 攻击引擎
│ │ ├── attack_openclaw.py # OpenClaw/Clawdbot 攻击引擎
│ │ ├── enrichment.py # Shodan/Nuclei 富化 + 风险评分
│ │ ├── live_probe.py # 用于模型/工具枚举的 HTTP 探测
│ │ ├── search.py # Shodan 风格查询解析器 → MongoDB 筛选器
│ │ ├── redis_client.py # 异步 Redis 单例,带回退
│ │ └── concurrency.py # 信号量 + 基于 Redis 的槽位限制
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── App.tsx # 路由 + Clerk 认证包装
│ │ ├── pages/
│ │ │ ├── Marketing.tsx # 带 3D 地球仪的公开首页
│ │ │ ├── Landing.tsx # 带地球仪的认证仪表盘
│ │ │ ├── Search.tsx # 带查询语法的端点搜索
│ │ │ ├── Explore.tsx # 浏览/筛选所有端点
│ │ │ ├── AgentDetail.tsx # 单个端点深度挖掘
│ │ │ ├── TestAgent.tsx # 攻击测试启动器
│ │ │ ├── Scans.tsx # 扫描管理
│ │ │ └── Ranges.tsx # CIDR 范围管理
│ │ ├── components/
│ │ │ ├── GlobeVisualization.tsx # globe.gl 3D 地球仪 + 图例
│ │ │ ├── Layout.tsx # 应用外壳(侧边栏 + 导航栏)
│ │ │ └── ui/ # shadcn/ui 组件
│ │ ├── hooks/useApi.ts # 所有 API 端点的 SWR 钩子
│ │ └── lib/api-client.ts # 带 Clerk 令牌注入的 fetch 包装
│ ├── Dockerfile
│ ├── nginx.conf
│ └── tailwind.config.js
├── templates/ # Nuclei YAML 模板
├── docs/ # GitHub Pages 静态站点
├── docker-compose.yml
├── .env.example
└── README.md
平台强制执行全局并发限制以防止滥用:
使用 Docker Compose 时,这些限制通过 Redis 计数器(跨容器)强制执行。在本地开发模式下,它们会回退到 asyncio.Semaphore(单进程)。
对于繁重的扫描工作负载,可以将扫描和攻击分派到 Modal 容器:
MODAL_ENABLED=true
启用后,POST /scans/{id}/run 和 POST /attack 将调用 modal.Function.from_name("aimap", "run_scan_task") / run_attack_task 而不是本地执行。如果 Modal 分派失败,将回退到本地执行。
MIT 许可证。详见 LICENSE。
本项目由 Bishop Fox 维护。
| 协议 | 检测方法 | Shodan 查询数 |
|---|
| MCP (模型上下文协议) | SSE 传输、JSON-RPC、/mcp/sse 路径 | 4 个查询 |
| Ollama | 默认端口 11434,产品指纹 | 3 个查询 |
| vLLM / LiteLLM / LocalAI | /v1/models、/v1/chat/completions 端点 | 4 个查询 |
| LangServe / LangChain | Playground 端点、langserve 标记 | 2 个查询 |
| OpenClaw / Clawdbot | 控制面板,端口 18789 | 3 个查询 |
| Open WebUI / LibreChat | 基于标题的检测 | 2 个查询 |
| Gradio | 标题、页脚水印、favicon 哈希 | 3 个查询 |
| Streamlit | 标题、favicon 哈希 | 2 个查询 |
| ComfyUI / Stable Diffusion | 标题、基于端口的检测 | 4 个查询 |
| HuggingFace TGI | HTML 标记 | 1 个查询 |
| 通用推理 | /api/generate、/api/tags 路径 | 2 个查询 |
| 因子 | 分数影响 |
|---|
| 无认证 | +4.0 |
| 未知认证状态 | +1.0 |
| 暴露 10+ 工具 | +2.0 |
| 暴露 5+ 工具 | +1.0 |
关键风险工具(例如 exec_code、run_shell) | 每个 +1.0 |
高风险工具(例如 query_db、file_read) | 每个 +0.5 |
开放的 CORS(*) | +1.0 |
| 无 TLS | +0.5 |
| 系统提示泄露 | +0.5 |
| 模型暴露 | +1.0 |
| 检测到未审查模型 | +2.0 |
| 启用注册(无需邀请) | +1.5 |
| 危险组合(例如无认证 + 代码执行工具) | 每个 +1.0 |
| 模板 | 目的 |
|---|
mcp-server-detect.yaml | 通过 SSE 传输和 JSON-RPC 能力响应检测 MCP 服务器 |
mcp-tool-enum.yaml | 枚举 MCP 服务器暴露的工具(名称、描述、输入模式) |
openai-compat-detect.yaml | 通过 /v1/models 检测 OpenAI 兼容端点 |
langserve-detect.yaml | 检测暴露 playground 的 LangServe 部署 |
prompt-leak.yaml | 通过常见注入技术尝试提取系统提示 |
| 方法 | 路径 | 描述 |
|---|
GET | /health | 健康检查 |
GET | /endpoints | 列出端点(分页、可筛选) |
POST | /endpoints/search | 带查询语法的高级搜索 |
GET | /endpoints/globe | 3D 地球仪的地理数据 |
GET | /endpoints/stats | 聚合统计信息 |
GET | /endpoints/{id} | 端点详情 |
POST | /endpoints/{id}/enrich | 触发单个端点的富化 |
POST | /endpoints/enrich-all | 批量富化 |
GET | /scans | 列出扫描 |
POST | /scans | 创建扫描 |
POST | /scans/{id}/run | 执行扫描 |
GET | /scans/query-presets | 可用的 Shodan 查询预设 |
WS | /scans/{id}/progress | 实时扫描进度 |
POST | /attack | 启动攻击测试 |
WS | /attack/{id}/stream | 实时攻击日志流 |
GET | /attack/{id}/status | 攻击状态 |