Nessus MCP Server
Un servidor MCP para interactuar con el escáner de vulnerabilidades Tenable Nessus.
Documentación
Servidor MCP de Nessus
Un servidor de Model Context Protocol (MCP) para interactuar con el escáner de vulnerabilidades Tenable Nessus. Este servidor permite a los asistentes de IA realizar análisis y escaneo de vulnerabilidades a través del protocolo MCP.
Se comunica con una instancia real de Nessus a través de su API REST utilizando autenticación por clave API. Si no se configuran NESSUS_URL/NESSUS_ACCESS_KEY/NESSUS_SECRET_KEY, se utiliza un modo simulado autocontenido para desarrollo y pruebas locales.
Características
- Escaneo de vulnerabilidades: Iniciar y monitorear escaneos de vulnerabilidades contra objetivos específicos
- Gestión de escaneos: Listar, rastrear y recuperar resultados de escaneos de vulnerabilidades
- Análisis de vulnerabilidades: Buscar y obtener información detallada sobre vulnerabilidades específicas
- Modo simulado: Modo simulado completamente funcional para pruebas sin una clave API de Nessus
Herramientas
El servidor proporciona las siguientes herramientas:
| Nombre de la herramienta | Descripción |
|---|---|
list_scan_templates | Listar plantillas de escaneo de Nessus disponibles |
start_scan | Iniciar un nuevo escaneo de vulnerabilidades contra un objetivo |
get_scan_status | Verificar el estado de un escaneo en ejecución |
get_scan_results | Obtener los resultados de un escaneo completado |
list_scans | Listar todos los escaneos y su estado |
get_vulnerability_details | Obtener información detallada sobre una vulnerabilidad específica |
search_vulnerabilities | Buscar vulnerabilidades por palabra clave |
Instalación
Requisitos previos
- Node.js 20 o superior
- TypeScript (para desarrollo)
Compilar desde el código fuente
-
Clonar el repositorio:
git clone https://github.com/Cyreslab-AI/nessus-mcp-server.git cd nessus-mcp-server -
Instalar dependencias:
npm install -
Compilar el servidor:
npm run build
Uso
Ejecutar en modo simulado
Por defecto, el servidor se ejecuta en modo simulado, que no requiere una clave API de Nessus:
node build/index.js
Ejecutar con una instancia real de Nessus
Para conectarse a una instancia real de Nessus, configure las siguientes variables de entorno:
NESSUS_URL=https://your-nessus-instance:8834
NESSUS_ACCESS_KEY=your-access-key
NESSUS_SECRET_KEY=your-secret-key
El servidor cambia al modo real tan pronto como se configuran las tres; de lo contrario, se ejecuta en modo simulado.
Luego ejecute el servidor:
node build/index.js
Generar un par de claves API
En la interfaz web de Nessus: Configuración > Mi cuenta > Claves API > Generar. Nessus muestra la clave de acceso y la clave secreta solo una vez al generarlas, así que guárdelas en un lugar seguro (por ejemplo, un gestor de secretos o la configuración de entorno de su cliente MCP); Nessus no puede mostrarlas nuevamente.
Las solicitudes se autentican con el encabezado HTTP X-ApiKeys: accessKey=<key>; secretKey=<key> en cada llamada. No hay un paso separado de inicio de sesión/sesión, ni cookies o tokens que renovar.
Certificados autofirmados
Es muy común que Nessus se implemente con un certificado TLS autofirmado. Por defecto, este servidor verifica los certificados de manera estricta y fallará contra una instancia autofirmada. Para optar explícitamente por omitir la verificación de certificados (por ejemplo, para una instancia interna en la que confíe), configure:
NESSUS_ALLOW_SELF_SIGNED=true
Déjelo sin configurar (o false) siempre que la instancia tenga un certificado emitido por una CA de confianza. El servidor registra una advertencia en stderr al inicio cuando esto está habilitado.
Notas de diseño sobre el mapeo en modo real
Algunas de las herramientas de este servidor no tienen un equivalente exacto 1:1 en la API REST de Nessus, por lo que se tomaron las siguientes decisiones:
start_scan:scan_type(basic-network-scan/web-app-scan/compliance-scan) es un nombre lógico, no un UUID de plantilla de Nessus (esos son específicos de la instancia y los devuelveGET /editor/scan/templates). Este servidor resuelve el nombre lógico a una plantilla comparando primero los valores conocidos denamede la plantilla, y recurriendo a una coincidencia difusa contra el nombre/título de la plantilla.start_scanluego crea el escaneo (POST /scans) y lo lanza inmediatamente (POST /scans/{id}/launch), ya que la herramienta se llama "iniciar", no "crear".get_scan_results: los resultados reales de escaneo se agregan por plugin en todo el escaneo (del resumenvulnerabilitiesdeGET /scans/{id}), no los registros completamente enriquecidos por vulnerabilidad que devuelven los datos simulados. Obtener el texto completo de CVSS/descripción/remediación para cada plugin significaría una llamada API adicional a Nessus por hallazgo, lo que no escala para escaneos con muchos hallazgos. Useget_vulnerability_detailscon unplugin_idespecífico de los resultados para profundizar en el detalle completo de un hallazgo.get_vulnerability_details: en modo simulado, esto toma un ID de CVE. Contra una instancia real de Nessus, debe ser un ID de plugin de Nessus numérico en su lugar (por ejemplo,156327), porque la API REST local de Nessus no tiene un endpoint que resuelva un CVE o palabra clave arbitraria a un plugin; solo existeGET /plugins/plugin/{id}(búsqueda por ID de plugin numérico). Una entrada con formato de CVE en modo real devuelve un error claro y documentado en lugar de fallar silenciosamente.search_vulnerabilities: Nessus no tiene un único endpoint de "buscar todas las vulnerabilidades"; los hallazgos solo existen en el contexto de los resultados de un escaneo. En modo real, esta herramienta acepta unscan_idopcional para limitar la búsqueda a un escaneo; sin él, la búsqueda cubre los escaneos completados actualizados más recientemente (máximo 10, para limitar el número de llamadas API en instancias con muchos escaneos). Esta es una decisión de alcance deliberada, documentada en la descripción de la propia herramienta.
Uso con Claude for Desktop
Para usar este servidor con Claude for Desktop:
-
Edite su archivo de configuración de Claude for Desktop:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
-
Agregue la configuración del servidor:
{
"mcpServers": {
"nessus": {
"command": "node",
"args": ["/path/to/nessus-mcp-server/build/index.js"],
"env": {
"NESSUS_URL": "https://your-nessus-instance:8834",
"NESSUS_ACCESS_KEY": "your-access-key",
"NESSUS_SECRET_KEY": "your-secret-key",
"NESSUS_ALLOW_SELF_SIGNED": "false"
}
}
}
}
Para el modo simulado, puede omitir la sección env.
Ejemplos de interacción
Iniciar un escaneo
start_scan:
target: 192.168.1.1
scan_type: basic-network-scan
Obtener resultados de escaneo
get_scan_results:
scan_id: scan-1234567890
Buscar vulnerabilidades
search_vulnerabilities:
keyword: log4j
Contra una instancia real de Nessus, opcionalmente limite la búsqueda a un escaneo:
search_vulnerabilities:
keyword: log4j
scan_id: 42
Desarrollo
Estructura del proyecto
src/index.ts: Punto de entrada principal del servidorsrc/nessus-api.ts: Cliente API de Nessus con respaldo simuladosrc/mock-data.ts: Datos simulados de vulnerabilidades para pruebassrc/tools/: Implementaciones de herramientassrc/utils/: Funciones de utilidad
Agregar nuevas herramientas
- Defina el esquema de la herramienta y el manejador en el archivo apropiado en
src/tools/ - Importe y registre la herramienta en
src/index.ts
Estado de verificación
Las solicitudes en modo real se implementan directamente contra el contrato documentado de la API REST de Tenable Nessus (endpoints, cuerpos de solicitud y formas de respuesta). Se han verificado mediante:
- Una compilación limpia de TypeScript (
npm run build). - Ejercitar cada herramienta a través de stdio en modo real contra un
NESSUS_URLinalcanzable (por ejemplo,https://localhost:1), confirmando que el servidor se inicia, acepta solicitudes y devuelve una respuestaisErrorlimpia con un mensaje descriptivo (conexión rechazada, TLS, tiempo de espera, etc.) en lugar de fallar o recurrir silenciosamente a datos simulados.
No se han verificado contra una instancia real de Nessus, ya que no había ninguna disponible en el entorno donde se construyó. Si conecta esto a una instancia real y algo no coincide (por ejemplo, un nombre de plantilla que su instancia no tiene, o un campo de respuesta que difiere según la versión de Nessus), abra un issue.
Licencia
MIT
Aviso legal
Este servidor no está afiliado ni respaldado por Tenable. Nessus es una marca comercial de Tenable, Inc.