
Descubra Serviços de IA Expostos
Plataforma de descoberta e testes de segurança em escala de internet para infraestrutura exposta de agentes de IA.
O AIMap encontra, identifica por impressão digital e testa a segurança de endpoints de IA publicamente expostos — servidores MCP, instâncias Ollama, proxies vLLM/LiteLLM, cadeias LangServe, aplicativos Gradio, nós ComfyUI e muito mais. Pense no Shodan, mas criado especificamente para a superfície de ataque de agentes de IA.
Criado pela Bishop Fox.
Aviso Esta ferramenta destina-se exclusivamente a testes de penetração autorizados e pesquisa de segurança. Você deve usar o AIMap apenas contra sistemas que possui ou para os quais tem permissão explícita por escrito para testar. O acesso não autorizado a sistemas de computador é ilegal. A Bishop Fox não assume nenhuma responsabilidade e não se responsabiliza por qualquer uso indevido ou dano causado por esta ferramenta. Use com responsabilidade.
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ Backend │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ Scanner │ │ Streams │
└──────────┘ └──────────┘ └──────────┘
Backend — Python/FastAPI com MongoDB assíncrono (Motor), Redis Streams para transmissão de logs de ataque e um mecanismo de descoberta que orquestra consultas Shodan → verificações de disponibilidade httpx → varreduras de templates Nuclei → pipeline de enriquecimento.
Frontend — React 18 + TypeScript + Tailwind CSS + shadcn/ui. Inclui um globo 3D (globe.gl), transmissão de ataques em tempo real via WebSocket e uma interface de busca no estilo Shodan.
Varredura — 5 templates YAML personalizados do Nuclei para detecção de servidores MCP, enumeração de ferramentas MCP, detecção de APIs compatíveis com OpenAI, detecção de LangServe e teste de vazamento de prompt.
Cada endpoint recebe uma pontuação de risco de 0 a 10 calculada a partir de:
# 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
Isso inicia 4 serviços:
Abra http://localhost para acessar a interface.
# 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
Certifique-se de que o MongoDB esteja rodando localmente na porta 27017. O Redis é opcional — o backend usa buffers em memória quando o Redis não está disponível.
Crie um arquivo .env na raiz do projeto:
# 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=
O AIMap usa Clerk para autenticação. Para habilitar:
# .env (project root)
CLERK_ISSUER=https://your-app.clerk.accounts.dev
# frontend/.env.local
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
Para desabilitar a autenticação (desenvolvimento local, demonstrações): deixe CLERK_ISSUER vazio ou não definido. O backend aceitará todas as requisições com uma identidade de usuário sintética local.
ollama, mcp_protocol, vllm) ou insira uma consulta personalizada do Shodannet:<cidr> no início de cada consulta)Use a barra de busca com a sintaxe de consulta no estilo 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
Combine filtros livremente:
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
Qualquer texto que não corresponda a um padrão key:value é tratado como uma busca de texto livre em todos os campos indexados.
A página inicial apresenta um globo 3D interativo mostrando todos os endpoints descobertos:
Templates personalizados no diretório templates/:
Todos os endpoints são prefixados com /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
A plataforma aplica limites globais de concorrência para evitar abuso:
Ao usar o Docker Compose, esses limites são aplicados por meio de contadores Redis (entre contêineres). No modo de desenvolvimento local, eles usam fallback para asyncio.Semaphore (processo único).
Para cargas de trabalho pesadas de varredura, varreduras e ataques podem ser despachados para contêineres Modal:
MODAL_ENABLED=true
Quando habilitado, POST /scans/{id}/run e POST /attack chamarão modal.Function.from_name("aimap", "run_scan_task") / run_attack_task em vez de executar localmente. Usa fallback para execução local se o despacho no Modal falhar.
Licença MIT. Consulte LICENSE para obter detalhes.
Este projeto é mantido pela Bishop Fox.
| Protocolo | Método de Detecção | Consultas Shodan |
|---|
| MCP (Model Context Protocol) | transporte SSE, JSON-RPC, caminhos /mcp/sse | 4 consultas |
| Ollama | porta padrão 11434, impressão digital do produto | 3 consultas |
| vLLM / LiteLLM / LocalAI | endpoints /v1/models, /v1/chat/completions | 4 consultas |
| LangServe / LangChain | endpoints de playground, marcadores langserve | 2 consultas |
| OpenClaw / Clawdbot | painel de controle, porta 18789 | 3 consultas |
| Open WebUI / LibreChat | detecção baseada no título | 2 consultas |
| Gradio | título, marca d'água no rodapé, hash de favicon | 3 consultas |
| Streamlit | título, hash de favicon | 2 consultas |
| ComfyUI / Stable Diffusion | título, detecção baseada na porta | 4 consultas |
| HuggingFace TGI | marcadores HTML | 1 consulta |
| Inferência genérica | caminhos /api/generate, /api/tags | 2 consultas |
| Fator | Impacto na Pontuação |
|---|
| Sem autenticação | +4.0 |
| Status de autenticação desconhecido | +1.0 |
| 10+ ferramentas expostas | +2.0 |
| 5+ ferramentas expostas | +1.0 |
Ferramenta de risco crítico (ex.: exec_code, run_shell) | +1.0 cada |
Ferramenta de alto risco (ex.: query_db, file_read) | +0.5 cada |
CORS aberto (*) | +1.0 |
| Sem TLS | +0.5 |
| Prompt de sistema vazado | +0.5 |
| Modelos expostos | +1.0 |
| Modelo sem censura detectado | +2.0 |
| Cadastro habilitado (sem exigir convite) | +1.5 |
| Combinação perigosa (ex.: sem autenticação + ferramenta de execução de código) | +1.0 cada |
| Template | Finalidade |
|---|
mcp-server-detect.yaml | Detecta servidores MCP via transporte SSE e resposta de capacidades JSON-RPC |
mcp-tool-enum.yaml | Enumera ferramentas expostas por servidores MCP (nomes, descrições, esquemas de entrada) |
openai-compat-detect.yaml | Detecta endpoints compatíveis com OpenAI via /v1/models |
langserve-detect.yaml | Detecta implantações LangServe com playground exposto |
prompt-leak.yaml | Tenta extrair prompts de sistema usando técnicas comuns de injeção |
| Método | Caminho | Descrição |
|---|
GET | /health | Verificação de saúde |
GET | /endpoints | Listar endpoints (paginado, filtrável) |
POST | /endpoints/search | Busca avançada com sintaxe de consulta |
GET | /endpoints/globe | Dados geográficos para o globo 3D |
GET | /endpoints/stats | Estatísticas agregadas |
GET | /endpoints/{id} | Detalhes do endpoint |
POST | /endpoints/{id}/enrich | Acionar enriquecimento para um endpoint |
POST | /endpoints/enrich-all | Enriquecimento em lote |
GET | /scans | Listar varreduras |
POST | /scans | Criar uma varredura |
POST | /scans/{id}/run | Executar uma varredura |
GET | /scans/query-presets | Predefinições de consulta Shodan disponíveis |
WS | /scans/{id}/progress | Progresso da varredura em tempo real |
POST | /attack | Iniciar um teste de ataque |
WS | /attack/{id}/stream | Fluxo de logs de ataque em tempo real |
GET | /attack/{id}/status | Status do ataque |