
Scopri i servizi AI esposti
Piattaforma di discovery e test di sicurezza su scala Internet per infrastrutture AI esposte.
AIMap trova, identifica tramite impronte digitali e sottopone a test di sicurezza gli endpoint AI pubblicamente esposti — server MCP, istanze Ollama, proxy vLLM/LiteLLM, catene LangServe, app Gradio, nodi ComfyUI e altro. Pensalo come Shodan, ma costruito appositamente per la superficie d'attacco degli agenti AI.
Creato da Bishop Fox.
Avviso Questo strumento è destinato esclusivamente a test di penetrazione autorizzati e ricerca sulla sicurezza. Devi usare AIMap solo contro sistemi che possiedi o per i quali hai ricevuto esplicito permesso scritto di test. L'accesso non autorizzato ai sistemi informatici è illegale. Bishop Fox non si assume alcuna responsabilità e non è responsabile di usi impropri o danni causati da questo strumento. Usalo in modo responsabile.
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ Backend │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ Scanner │ │ Streams │
└──────────┘ └──────────┘ └──────────┘
Backend — Python/FastAPI con MongoDB asincrono (Motor), Redis Streams per lo streaming dei log degli attacchi e un motore di discovery che orchestra query Shodan → controlli di liveness httpx → scansioni dei template Nuclei → pipeline di arricchimento.
Frontend — React 18 + TypeScript + Tailwind CSS + shadcn/ui. Include un globo 3D (globe.gl), streaming degli attacchi in tempo reale via WebSocket e un'interfaccia di ricerca in stile Shodan.
Scanning — 5 template Nuclei YAML personalizzati per il rilevamento di server MCP, enumerazione degli strumenti MCP, rilevamento di API compatibili con OpenAI, rilevamento di LangServe e test di fuga del prompt.
Ogni endpoint riceve un punteggio di rischio da 0 a 10 calcolato da:
# Clone
git clone [email protected]:BishopFox/aimap.git
cd aimap
# Configure
cp .env.example .env
# Edit .env — at minimum set SHODAN_API_KEY
# Launch
docker compose up --build
Questo avvia 4 servizi:
Apri http://localhost per accedere all'interfaccia.
# Backend
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Frontend (separate terminal)
cd frontend
npm install
npm run dev # starts on http://localhost:5173
Assicurati che MongoDB sia in esecuzione localmente sulla porta 27017. Redis è opzionale — il backend utilizza buffer in memoria quando Redis non è disponibile.
Crea un file .env nella radice del progetto:
# 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 usa Clerk per l'autenticazione. Per abilitarla:
# .env (project root)
CLERK_ISSUER=https://your-app.clerk.accounts.dev
# frontend/.env.local
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
Per disabilitare l'autenticazione (sviluppo locale, demo): lascia CLERK_ISSUER vuoto o non impostato. Il backend accetterà tutte le richieste con un'identità utente sintetica local.
ollama, mcp_protocol, vllm) oppure inserisci una query Shodan personalizzatanet:<cidr> a ogni query)Usa la barra di ricerca con la sintassi delle query in stile Shodan:
protocol:mcp # MCP servers
auth:none # No authentication
risk:critical # Risk score >= 9.0
risk:high # Risk score 7.0 – 8.9
risk:medium # Risk score 4.0 – 6.9
risk:low # Risk score 1.0 – 3.9
tool:query_db # Endpoints exposing a specific tool
country:US # By country code
port:11434 # By port number
org:"Amazon AWS" # By hosting organization (quote multi-word values)
has:system_prompt # Endpoints with leaked system prompts
Combina i filtri liberamente:
protocol:mcp auth:none country:US # Unauthenticated MCP servers in the US
risk:critical tool:exec_code # Critical endpoints with code execution tools
protocol:ollama port:11434 # Ollama on default port
Qualsiasi testo che non corrisponde a un pattern key:value viene trattato come ricerca a testo libero su tutti i campi indicizzati.
La pagina iniziale include un globo 3D interattivo che mostra tutti gli endpoint scoperti:
Template personalizzati nella directory templates/:
Tutti gli endpoint hanno il prefisso /api/.
aimap/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app, lifespan, CORS, routers
│ │ ├── config.py # Pydantic settings from env
│ │ ├── auth.py # Clerk JWT verification (bypass when CLERK_ISSUER empty)
│ │ ├── database.py # Async MongoDB (Motor) connection
│ │ ├── limiter.py # SlowAPI rate limiting
│ │ ├── routes/
│ │ │ ├── endpoints.py # CRUD + search + globe + enrichment
│ │ │ ├── scans.py # Scan lifecycle + execution + WebSocket
│ │ │ └── attack.py # Attack dispatch + Redis Streams + WebSocket
│ │ ├── discovery/
│ │ │ ├── orchestrator.py # Scan pipeline: Shodan → httpx → Nuclei → ingest
│ │ │ ├── shodan_adapter.py # 32 curated Shodan queries + result normalization
│ │ │ ├── nuclei_runner.py # Nuclei subprocess runner + finding parser
│ │ │ └── base.py # SourceAdapter abstract base
│ │ └── services/
│ │ ├── attack_mcp.py # MCP protocol attack engine
│ │ ├── attack_ollama.py # Ollama attack engine
│ │ ├── attack_openclaw.py # OpenClaw/Clawdbot attack engine
│ │ ├── enrichment.py # Shodan/Nuclei enrichment + risk scoring
│ │ ├── live_probe.py # HTTP probing for model/tool enumeration
│ │ ├── search.py # Shodan-style query parser → MongoDB filters
│ │ ├── redis_client.py # Async Redis singleton with fallback
│ │ └── concurrency.py # Semaphore + Redis-based slot limiting
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── App.tsx # Routes + Clerk auth wrapper
│ │ ├── pages/
│ │ │ ├── Marketing.tsx # Public landing page with 3D globe
│ │ │ ├── Landing.tsx # Authenticated dashboard with globe
│ │ │ ├── Search.tsx # Endpoint search with query syntax
│ │ │ ├── Explore.tsx # Browse/filter all endpoints
│ │ │ ├── AgentDetail.tsx # Single endpoint deep-dive
│ │ │ ├── TestAgent.tsx # Attack test launcher
│ │ │ ├── Scans.tsx # Scan management
│ │ │ └── Ranges.tsx # CIDR range management
│ │ ├── components/
│ │ │ ├── GlobeVisualization.tsx # globe.gl 3D globe + legend
│ │ │ ├── Layout.tsx # App shell (sidebar + navbar)
│ │ │ └── ui/ # shadcn/ui components
│ │ ├── hooks/useApi.ts # SWR hooks for all API endpoints
│ │ └── lib/api-client.ts # Fetch wrapper with Clerk token injection
│ ├── Dockerfile
│ ├── nginx.conf
│ └── tailwind.config.js
├── templates/ # Nuclei YAML templates
├── docs/ # GitHub Pages static site
├── docker-compose.yml
├── .env.example
└── README.md
La piattaforma applica limiti di concorrenza globali per prevenire abusi:
Quando si usa Docker Compose, questi limiti vengono applicati tramite contatori Redis (cross-container). In modalità di sviluppo locale, si ripiega su asyncio.Semaphore (single-process).
Per carichi di scansione pesanti, scansioni e attacchi possono essere inviati a contenitori Modal:
MODAL_ENABLED=true
Quando abilitato, POST /scans/{id}/run e POST /attack chiameranno modal.Function.from_name("aimap", "run_scan_task") / run_attack_task invece di eseguire localmente. Se l'invio a Modal fallisce, si ripiega sull'esecuzione locale.
Licenza MIT. Vedi LICENSE per i dettagli.
Questo progetto è mantenuto da Bishop Fox.
| Protocollo | Metodo di Rilevamento | Query Shodan |
|---|
| MCP (Model Context Protocol) | trasporto SSE, JSON-RPC, percorsi /mcp/sse | 4 query |
| Ollama | porta predefinita 11434, impronta del prodotto | 3 query |
| vLLM / LiteLLM / LocalAI | endpoint /v1/models, /v1/chat/completions | 4 query |
| LangServe / LangChain | endpoint playground, marcatori langserve | 2 query |
| OpenClaw / Clawdbot | dashboard di controllo, porta 18789 | 3 query |
| Open WebUI / LibreChat | rilevamento basato sul titolo | 2 query |
| Gradio | titolo, filigrana nel footer, hash favicon | 3 query |
| Streamlit | titolo, hash favicon | 2 query |
| ComfyUI / Stable Diffusion | titolo, rilevamento basato sulla porta | 4 query |
| HuggingFace TGI | marcatori HTML | 1 query |
| Inferenza generica | percorsi /api/generate, /api/tags | 2 query |
| Fattore | Impatto sul Punteggio |
|---|
| Nessuna autenticazione | +4.0 |
| Stato autenticazione sconosciuto | +1.0 |
| 10+ strumenti esposti | +2.0 |
| 5+ strumenti esposti | +1.0 |
Strumento a rischio critico (es. exec_code, run_shell) | +1.0 ciascuno |
Strumento ad alto rischio (es. query_db, file_read) | +0.5 ciascuno |
CORS aperto (*) | +1.0 |
| Nessun TLS | +0.5 |
| Prompt di sistema esposto | +0.5 |
| Modelli esposti | +1.0 |
| Modello non censurato rilevato | +2.0 |
| Registrazione abilitata (nessun invito richiesto) | +1.5 |
| Combinazione pericolosa (es. nessuna autenticazione + strumento di esecuzione codice) | +1.0 ciascuna |
| Template | Scopo |
|---|
mcp-server-detect.yaml | Rileva i server MCP tramite trasporto SSE e risposta delle capabilities JSON-RPC |
mcp-tool-enum.yaml | Enumera gli strumenti esposti dai server MCP (nomi, descrizioni, schemi di input) |
openai-compat-detect.yaml | Rileva endpoint compatibili con OpenAI tramite /v1/models |
langserve-detect.yaml | Rileva deployment LangServe con playground esposto |
prompt-leak.yaml | Tenta l'estrazione del prompt di sistema tramite tecniche di injection comuni |
| Metodo | Percorso | Descrizione |
|---|
GET | /health | Controllo di salute |
GET | /endpoints | Elenca gli endpoint (impaginati, filtrabili) |
POST | /endpoints/search | Ricerca avanzata con sintassi query |
GET | /endpoints/globe | Dati geografici per il globo 3D |
GET | /endpoints/stats | Statistiche aggregate |
GET | /endpoints/{id} | Dettaglio endpoint |
POST | /endpoints/{id}/enrich | Attiva l'arricchimento per un singolo endpoint |
POST | /endpoints/enrich-all | Arricchimento in batch |
GET | /scans | Elenca le scansioni |
POST | /scans | Crea una scansione |
POST | /scans/{id}/run | Esegui una scansione |
GET | /scans/query-presets | Preset di query Shodan disponibili |
WS | /scans/{id}/progress | Avanzamento scansione in tempo reale |
POST | /attack | Lancia un test di attacco |
WS | /attack/{id}/stream | Streaming dei log di attacco in tempo reale |
GET | /attack/{id}/status | Stato dell'attacco |