
露出したAIサービスを発見
露出したAIエージェントインフラ向けのインターネット規模の探索・セキュリティテストプラットフォーム。
AIMapは、公開されているAIエンドポイント(MCPサーバー、Ollamaインスタンス、vLLM/LiteLLMプロキシ、LangServeチェーン、Gradioアプリ、ComfyUIノードなど)を発見、フィンガープリント、セキュリティテストします。ShodanをAIエージェントのアタックサーフェスに特化させたものと考えてください。
Bishop Fox によって構築されました。
警告 このツールは許可された侵入テストおよびセキュリティ研究のみを目的としています。所有しているシステム、またはテストする明示的な書面による許可を得たシステムに対してのみAIMapを使用してください。コンピュータシステムへの不正アクセスは違法です。Bishop Foxは一切の責任を負わず、このツールの誤用や損害について責任を負いません。責任を持って使用してください。
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ Backend │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ Scanner │ │ Streams │
└──────────┘ └──────────┘ └──────────┘
バックエンド — Python/FastAPI、非同期MongoDB (Motor)、攻撃ログストリーミング用のRedis Streams、およびShodanクエリ→httpx死活チェック→Nucleiテンプレートスキャン→エンリッチメントパイプラインを調整する探索エンジン。
フロントエンド — React 18 + TypeScript + Tailwind CSS + shadcn/ui。3D地球儀 (globe.gl)、WebSocketによるリアルタイム攻撃ストリーミング、Shodanスタイルの検索インターフェースを特徴としています。
スキャン — MCPサーバー検出、MCPツール列挙、OpenAI互換API検出、LangServe検出、プロンプト漏洩テストのための5つのカスタムNuclei YAMLテンプレート。
各エンドポイントには、以下から計算された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ファイルを作成します。
# Required
SHODAN_API_KEY=your_shodan_api_key
# Optional — Censys as an additional discovery source
CENSYS_API_ID=
CENSYS_API_SECRET=
# Optional — enables AI-powered attack analysis
ANTHROPIC_API_KEY=
# MongoDB (defaults work for local dev)
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=aimap
# Redis (defaults work for local dev; optional)
REDIS_URL=redis://localhost:6379/0
# CORS (default allows all origins)
CORS_ORIGINS=*
# Modal serverless (dispatches scans/attacks to Modal containers)
MODAL_ENABLED=false
# Clerk auth — see below
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ユーザーIDで受け入れます。
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ストリーム + 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(シングルプロセス)にフォールバックします。
大量のスキャンワークロードのために、スキャンと攻撃をM相談コンテナにディスパッチできます。
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 (Model Context Protocol) | 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 | タイトル、フッターウォーターマーク、ファビコンハッシュ | 3クエリ |
| Streamlit | タイトル、ファビコンハッシュ | 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 | 1つのエンドポイントのエンリッチメントをトリガー |
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 | 攻撃ステータス |