
Descubrir servicios de IA expuestos
Plataforma de descubrimiento y pruebas de seguridad a escala de Internet para infraestructura expuesta de agentes de IA.
AIMap encuentra, identifica y prueba la seguridad de endpoints de IA expuestos públicamente — servidores MCP, instancias Ollama, proxies vLLM/LiteLLM, cadenas LangServe, aplicaciones Gradio, nodos ComfyUI y más. Piensa en Shodan, pero diseñado específicamente para la superficie de ataque de agentes de IA.
Creado por Bishop Fox.
Advertencia Esta herramienta está destinada únicamente a pruebas de penetración autorizadas e investigación de seguridad. Solo debes usar AIMap contra sistemas que poseas o para los que tengas permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal. Bishop Fox no asume ninguna responsabilidad y no se hace responsable del mal uso o daño causado por esta herramienta. Úsala de forma responsable.
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ Backend │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ Scanner │ │ Streams │
└──────────┘ └──────────┘ └──────────┘
Backend — Python/FastAPI con MongoDB asíncrono (Motor), Redis Streams para streaming de registros de ataque, y un motor de descubrimiento que orquesta consultas Shodan → comprobaciones de actividad httpx → escaneos de plantillas Nuclei → pipeline de enriquecimiento.
Frontend — React 18 + TypeScript + Tailwind CSS + shadcn/ui. Incluye un globo 3D (globe.gl), streaming de ataques en tiempo real vía WebSocket y una interfaz de búsqueda al estilo Shodan.
Escaneo — 5 plantillas Nuclei YAML personalizadas para detección de servidores MCP, enumeración de herramientas MCP, detección de API compatible con OpenAI, detección de LangServe y pruebas de filtración de avisos.
Cada endpoint recibe una puntuación de riesgo de 0 a 10 calculada a partir de:
# Clonar
git clone [email protected]:BishopFox/aimap.git
cd aimap
# Configurar
cp .env.example .env
# Editar .env — como mínimo configurar SHODAN_API_KEY
# Iniciar
docker compose up --build
Esto inicia 4 servicios:
Abre http://localhost para acceder a la interfaz.
# Backend
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Frontend (terminal separada)
cd frontend
npm install
npm run dev # se inicia en http://localhost:5173
Asegúrate de que MongoDB se esté ejecutando localmente en el puerto 27017. Redis es opcional — el backend recurre a buffers en memoria cuando Redis no está disponible.
Crea un archivo .env en la raíz del proyecto:
# Requerido
SHODAN_API_KEY=tu_clave_api_shodan
# Opcional — Censys como fuente de descubrimiento adicional
CENSYS_API_ID=
CENSYS_API_SECRET=
# Opcional — habilita análisis de ataques impulsado por IA
ANTHROPIC_API_KEY=
# MongoDB (los valores por defecto funcionan para desarrollo local)
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=aimap
# Redis (los valores por defecto funcionan para desarrollo local; opcional)
REDIS_URL=redis://localhost:6379/0
# CORS (por defecto permite todos los orígenes)
CORS_ORIGINS=*
# Modal serverless (despacha escaneos/ataques a contenedores Modal)
MODAL_ENABLED=false
# Autenticación Clerk — ver más abajo
CLERK_ISSUER=
AIMap utiliza Clerk para autenticación. Para habilitarlo:
# .env (raíz del proyecto)
CLERK_ISSUER=https://tu-app.clerk.accounts.dev
# frontend/.env.local
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
Para deshabilitar la autenticación (desarrollo local, demos): deja CLERK_ISSUER vacío o sin configurar. El backend aceptará todas las solicitudes con una identidad de usuario sintética local.
ollama, mcp_protocol, vllm) o ingresa una consulta Shodan personalizadanet:<cidr> a cada consulta)Usa la barra de búsqueda con sintaxis de consulta al estilo Shodan:
protocol:mcp # Servidores MCP
auth:none # Sin autenticación
risk:critical # Puntuación de riesgo >= 9.0
risk:high # Puntuación de riesgo 7.0 – 8.9
risk:medium # Puntuación de riesgo 4.0 – 6.9
risk:low # Puntuación de riesgo 1.0 – 3.9
tool:query_db # Endpoints que exponen una herramienta específica
country:US # Por código de país
port:11434 # Por número de puerto
org:"Amazon AWS" # Por organización de alojamiento (valores de varias palabras entre comillas)
has:system_prompt # Endpoints con avisos del sistema filtrados
Combina filtros libremente:
protocol:mcp auth:none country:US # Servidores MCP sin autenticación en EE. UU.
risk:critical tool:exec_code # Endpoints críticos con herramientas de ejecución de código
protocol:ollama port:11434 # Ollama en puerto por defecto
Cualquier texto que no coincida con un patrón clave:valor se trata como búsqueda de texto libre en todos los campos indexados.
La página de inicio presenta un globo 3D interactivo que muestra todos los endpoints descubiertos:
Plantillas personalizadas en el directorio templates/:
Todos los endpoints tienen el prefijo /api/.
aimap/
├── backend/
│ ├── app/
│ │ ├── main.py # Aplicación FastAPI, ciclo de vida, CORS, enrutadores
│ │ ├── config.py # Configuración Pydantic desde variables de entorno
│ │ ├── auth.py # Verificación JWT de Clerk (omisión cuando CLERK_ISSUER está vacío)
│ │ ├── database.py # Conexión asíncrona MongoDB (Motor)
│ │ ├── limiter.py # Limitación de tasa SlowAPI
│ │ ├── routes/
│ │ │ ├── endpoints.py # CRUD + búsqueda + globo + enriquecimiento
│ │ │ ├── scans.py # Ciclo de vida del escaneo + ejecución + WebSocket
│ │ │ └── attack.py # Despacho de ataques + Redis Streams + WebSocket
│ │ ├── discovery/
│ │ │ ├── orchestrator.py # Pipeline de escaneo: Shodan → httpx → Nuclei → ingesta
│ │ │ ├── shodan_adapter.py # 32 consultas Shodan seleccionadas + normalización de resultados
│ │ │ ├── nuclei_runner.py # Ejecutor de subprocesos Nuclei + analizador de hallazgos
│ │ │ └── base.py # Clase base abstracta SourceAdapter
│ │ └── services/
│ │ ├── attack_mcp.py # Motor de ataque para protocolo MCP
│ │ ├── attack_ollama.py # Motor de ataque para Ollama
│ │ ├── attack_openclaw.py # Motor de ataque para OpenClaw/Clawdbot
│ │ ├── enrichment.py # Enriquecimiento Shodan/Nuclei + puntuación de riesgo
│ │ ├── live_probe.py # Sondeo HTTP para enumeración de modelos/herramientas
│ │ ├── search.py # Analizador de consultas al estilo Shodan → filtros MongoDB
│ │ ├── redis_client.py # Singleton Redis asíncrono con fallback
│ │ └── concurrency.py # Semáforo + limitación de ranuras basada en Redis
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── App.tsx # Rutas + envoltura de autenticación Clerk
│ │ ├── pages/
│ │ │ ├── Marketing.tsx # Página de inicio pública con globo 3D
│ │ │ ├── Landing.tsx # Panel autenticado con globo
│ │ │ ├── Search.tsx # Búsqueda de endpoints con sintaxis de consulta
│ │ │ ├── Explore.tsx # Explorar/filtrar todos los endpoints
│ │ │ ├── AgentDetail.tsx # Análisis profundo de un endpoint
│ │ │ ├── TestAgent.tsx # Lanzador de pruebas de ataque
│ │ │ ├── Scans.tsx # Gestión de escaneos
│ │ │ └── Ranges.tsx # Gestión de rangos CIDR
│ │ ├── components/
│ │ │ ├── GlobeVisualization.tsx # Globo 3D globe.gl + leyenda
│ │ │ ├── Layout.tsx # Esqueleto de la aplicación (barra lateral + barra de navegación)
│ │ │ └── ui/ # Componentes shadcn/ui
│ │ ├── hooks/useApi.ts # Hooks SWR para todos los endpoints de la API
│ │ └── lib/api-client.ts # Envoltorio Fetch con inyección de token Clerk
│ ├── Dockerfile
│ ├── nginx.conf
│ └── tailwind.config.js
├── templates/ # Plantillas YAML de Nuclei
├── docs/ # Sitio estático de GitHub Pages
├── docker-compose.yml
├── .env.example
└── README.md
La plataforma impone límites de concurrencia globales para evitar el abuso:
Cuando se usa Docker Compose, estos límites se aplican mediante contadores Redis (entre contenedores). En modo de desarrollo local, recurren a asyncio.Semaphore (un solo proceso).
Para cargas de trabajo de escaneo pesadas, los escaneos y ataques pueden enviarse a contenedores Modal:
MODAL_ENABLED=true
Cuando está habilitado, POST /scans/{id}/run y POST /attack llamarán a modal.Function.from_name("aimap", "run_scan_task") / run_attack_task en lugar de ejecutarse localmente. Recurre a la ejecución local si el envío a Modal falla.
Licencia MIT. Consulta LICENSE para más detalles.
Este proyecto es mantenido por Bishop Fox.
| Protocolo | Método de detección | Consultas Shodan |
|---|
| MCP (Model Context Protocol) | Transporte SSE, JSON-RPC, rutas /mcp/sse | 4 consultas |
| Ollama | Puerto por defecto 11434, huella del producto | 3 consultas |
| vLLM / LiteLLM / LocalAI | Endpoints /v1/models, /v1/chat/completions | 4 consultas |
| LangServe / LangChain | Endpoints de Playground, marcadores langserve | 2 consultas |
| OpenClaw / Clawdbot | Panel de control, puerto 18789 | 3 consultas |
| Open WebUI / LibreChat | Detección por título | 2 consultas |
| Gradio | Título, marca de agua en el pie de página, hash del favicon | 3 consultas |
| Streamlit | Título, hash del favicon | 2 consultas |
| ComfyUI / Stable Diffusion | Título, detección por puerto | 4 consultas |
| HuggingFace TGI | Marcadores HTML | 1 consulta |
| Inferencia genérica | Rutas /api/generate, /api/tags | 2 consultas |
| Factor | Impacto en la puntuación |
|---|
| Sin autenticación | +4.0 |
| Estado de autenticación desconocido | +1.0 |
| 10+ herramientas expuestas | +2.0 |
| 5+ herramientas expuestas | +1.0 |
Herramienta de riesgo crítico (ej., exec_code, run_shell) | +1.0 cada una |
Herramienta de alto riesgo (ej., query_db, file_read) | +0.5 cada una |
CORS abierto (*) | +1.0 |
| Sin TLS | +0.5 |
| Aviso del sistema filtrado | +0.5 |
| Modelos expuestos | +1.0 |
| Modelo sin censura detectado | +2.0 |
| Registro habilitado (sin invitación requerida) | +1.5 |
| Combinación peligrosa (ej., sin autenticación + herramienta de ejecución de código) | +1.0 cada una |
| Plantilla | Propósito |
|---|
mcp-server-detect.yaml | Detecta servidores MCP a través del transporte SSE y la respuesta de capacidades JSON-RPC |
mcp-tool-enum.yaml | Enumera las herramientas expuestas por servidores MCP (nombres, descripciones, esquemas de entrada) |
openai-compat-detect.yaml | Detecta endpoints compatibles con OpenAI a través de /v1/models |
langserve-detect.yaml | Detecta despliegues LangServe con playground expuesto |
prompt-leak.yaml | Intenta la extracción del aviso del sistema mediante técnicas comunes de inyección |
| Método | Ruta | Descripción |
|---|
GET | /health | Comprobación de estado |
GET | /endpoints | Listar endpoints (paginados, filtrables) |
POST | /endpoints/search | Búsqueda avanzada con sintaxis de consulta |
GET | /endpoints/globe | Datos geográficos para el globo 3D |
GET | /endpoints/stats | Estadísticas agregadas |
GET | /endpoints/{id} | Detalle del endpoint |
POST | /endpoints/{id}/enrich | Activar enriquecimiento para un endpoint |
POST | /endpoints/enrich-all | Enriquecimiento masivo |
GET | /scans | Listar escaneos |
POST | /scans | Crear un escaneo |
POST | /scans/{id}/run | Ejecutar un escaneo |
GET | /scans/query-presets | Presets de consulta Shodan disponibles |
WS | /scans/{id}/progress | Progreso del escaneo en vivo |
POST | /attack | Lanzar una prueba de ataque |
WS | /attack/{id}/stream | Transmisión en vivo del registro de ataque |
GET | /attack/{id}/status | Estado del ataque |