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 herramientaDescripción
list_scan_templatesListar plantillas de escaneo de Nessus disponibles
start_scanIniciar un nuevo escaneo de vulnerabilidades contra un objetivo
get_scan_statusVerificar el estado de un escaneo en ejecución
get_scan_resultsObtener los resultados de un escaneo completado
list_scansListar todos los escaneos y su estado
get_vulnerability_detailsObtener información detallada sobre una vulnerabilidad específica
search_vulnerabilitiesBuscar vulnerabilidades por palabra clave

Instalación

Requisitos previos

  • Node.js 20 o superior
  • TypeScript (para desarrollo)

Compilar desde el código fuente

  1. Clonar el repositorio:

    git clone https://github.com/Cyreslab-AI/nessus-mcp-server.git
    cd nessus-mcp-server
    
  2. Instalar dependencias:

    npm install
    
  3. 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 devuelve GET /editor/scan/templates). Este servidor resuelve el nombre lógico a una plantilla comparando primero los valores conocidos de name de la plantilla, y recurriendo a una coincidencia difusa contra el nombre/título de la plantilla. start_scan luego 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 resumen vulnerabilities de GET /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. Use get_vulnerability_details con un plugin_id especí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 existe GET /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 un scan_id opcional 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:

  1. 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
  2. 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 servidor
  • src/nessus-api.ts: Cliente API de Nessus con respaldo simulado
  • src/mock-data.ts: Datos simulados de vulnerabilidades para pruebas
  • src/tools/: Implementaciones de herramientas
  • src/utils/: Funciones de utilidad

Agregar nuevas herramientas

  1. Defina el esquema de la herramienta y el manejador en el archivo apropiado en src/tools/
  2. 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_URL inalcanzable (por ejemplo, https://localhost:1), confirmando que el servidor se inicia, acepta solicitudes y devuelve una respuesta isError limpia 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.