Ghost AcademySecLearn// Seguridad Informática
Práctica de Laboratorio · Seguridad Ofensiva

Nuclei v3

Escáner de vulnerabilidades basado en plantillas YAML · Instalación, configuración y uso práctico en Ubuntu 24.04

🐹
Go / Golang
Runtime
📄
Templates YAML
Motor de detección
⚡
Alta velocidad
Paralelismo masivo
🎯
0 falsos positivos
Verificación real
🎯

¿Qué es Nuclei?

Nuclei es un escáner de vulnerabilidades moderno, de alto rendimiento y código abierto desarrollado por ProjectDiscovery. A diferencia de escáneres tradicionales como Nessus o OpenVAS, Nuclei aprovecha un motor de plantillas simples basadas en YAML que permiten diseñar escenarios de detección de vulnerabilidades personalizados que imitan exactamente las condiciones del mundo real.

Su principal ventaja es que al verificar una vulnerabilidad replicando los pasos reales del ataque, consigue prácticamente cero falsos positivos, un problema endémico en los escáneres de vulnerabilidades tradicionales.

Escáner tradicional
  • Detección basada en versiones de software
  • Alto porcentaje de falsos positivos
  • Difícil personalización
  • Lento y con sobrecarga de red
Nuclei
  • Detección basada en comportamiento real
  • Prácticamente 0 falsos positivos
  • Miles de plantillas de la comunidad
  • Procesamiento paralelo ultrarrápido

Características principales del documento de práctica:

ℹ️

Contexto del laboratorio: Este ejercicio se realiza sobre Ubuntu 24.04 con el objetivo de instalar y configurar Nuclei y practicar escaneos reales contra un entorno de laboratorio formado por máquinas virtuales (Ubuntu + Kali). Todo el software necesario es gratuito y de código abierto.

⚖️

Ética y Legalidad

Importante
🚨

USO EXCLUSIVAMENTE EN ENTORNOS AUTORIZADOS

Nuclei es una herramienta de seguridad ofensiva. Escanear sistemas o redes sin autorización expresa y por escrito del propietario es un delito grave en la mayoría de países. En España, el artículo 197 bis del Código Penal penaliza el acceso no autorizado a sistemas informáticos con hasta 2 años de prisión.

Usos legítimos de Nuclei:

  • Auditorías de seguridad contratadas con alcance definido por escrito
  • Pruebas sobre infraestructura propia
  • Entornos de laboratorio completamente aislados (VirtualBox, VMware)
  • Programas de bug bounty donde el objetivo está explícitamente en el scope
  • Plataformas de práctica como HackTheBox, TryHackMe, DVWA, VulnHub
🔌

Protocolos Soportados

Una de las fortalezas de Nuclei v3 es su soporte de múltiples protocolos, lo que le permite detectar vulnerabilidades en una gran variedad de tecnologías desde una sola herramienta.

🌐
HTTP/HTTPS
APIs REST, apps web, headers, cookies
🌍
DNS
Subdominios, zona transfers, misconfigs
🔒
SSL/TLS
Certificados, ciphers débiles, expiración
🔌
TCP/UDP
Puertos, servicios, banners
🔍
WHOIS
Información de dominios y registros
🟨
JavaScript
Ejecución de código JS en el contexto del scan
💻
Code
Ejecución de scripts Python, Bash, Ruby
📁
File
Análisis de archivos locales
🔗
Headless
Browser automation con Chrome headless
📡
Network
Detección de servicios y fingerprinting
🏗️

Arquitectura de Plantillas YAML

El motor de Nuclei gira completamente alrededor de las plantillas YAML. Cada plantilla define: qué buscar, cómo buscarlo, qué condición indica que la vulnerabilidad existe, y cómo clasificarla.

📄 Estructura de una plantilla Nuclei
# Sección 1: Identificación única de la plantilla
id: ejemplo-vulnerabilidad-http

# Sección 2: Metadatos descriptivos
info:
  name: Ejemplo de Vulnerabilidad HTTP
  author: tu-nombre
  severity: medium       # info | low | medium | high | critical
  description: Detecta un header de seguridad faltante
  tags: http,headers,misconfig

# Sección 3: Definición de la petición
http:
  - method: GET
    path:
      - "{{BaseURL}}/"       # Variable mágica = objetivo del escaneo

    # Sección 4: Condiciones que indican que la vuln existe
    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200
      - type: word
        part: header
        negative: true         # El header NO debe existir
        words:
          - "X-Frame-Options"   # Si falta este header → VULNERABLE
SecciónFunciónObligatoria
idIdentificador único de la plantilla (snake_case)✅ Sí
infoNombre, autor, severidad, descripción, tags✅ Sí
http / dns / tcp...Protocolo y petición que Nuclei enviará al objetivo✅ Sí (1 mínimo)
matchersCondiciones que deben cumplirse para marcar como vulnerable✅ Sí
extractorsExtrae información de la respuesta (versiones, IPs, tokens)❌ Opcional
variablesVariables personalizadas reutilizables en la plantilla❌ Opcional
🐹

Instalar Go (Golang)

Prerequisito

Nuclei está desarrollado en Go y se instala compilando desde su repositorio. Necesitas Go instalado primero en tu sistema. La forma más sencilla en Ubuntu es a través de snap.

1

Instalar Go mediante snap:

sudo snap install go --classic

La flag --classic es necesaria porque Go necesita acceso completo al sistema de archivos para compilar binarios. La instalación tarda 1-2 minutos dependiendo de la conexión.

2

Verificar que Go se instaló correctamente:

go version
go version go1.22.4 linux/amd64
3

Verificar el GOPATH (directorio donde Go guarda los binarios instalados):

go env GOPATH
/home/atu/go

Los binarios instalados con go install se guardarán en $(go env GOPATH)/bin/, que habitualmente es ~/go/bin/.

💡

Alternativa — instalar Go desde binario oficial (si snap no funciona o prefieres la última versión):

# Descargar Go 1.22 (comprueba la última versión en go.dev/dl)
wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version
⚡

Paso 1: Instalar Nuclei

go install

Una vez que tienes Go instalado, Nuclei se instala con un único comando que descarga el código fuente, lo compila y coloca el binario en tu carpeta de Go.

1

Instalar Nuclei v3 (última versión disponible):

go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

La flag -v (verbose) muestra el progreso de descarga y compilación. Este proceso puede tardar entre 2 y 10 minutos dependiendo de tu conexión y CPU, porque está descargando y compilando todas las dependencias de Go desde cero.

ℹ️

Espera hasta que vuelvas a ver el prompt del terminal (atu@atu-VirtualBox:~$) antes de continuar. Si el proceso sigue en marcha, verás líneas que van apareciendo. Solo cuando vuelva el prompt habrá terminado.

🗂️

Paso 2 y 3: Localizar el Binario y Configurar el PATH

Configuración permanente
1

Verificar que el binario existe en la carpeta de Go:

ls ~/go/bin/nuclei
/home/atu/go/bin/nuclei

Si el comando devuelve la ruta en verde (o simplemente no da error), el binario está instalado correctamente.

2

Añadir la carpeta de binarios de Go al PATH de forma permanente (para que nuclei funcione desde cualquier directorio sin necesidad de escribir la ruta completa):

echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.bashrc

Este comando añade una línea al archivo ~/.bashrc, que se ejecuta automáticamente cada vez que abres un nuevo terminal.

3

Recargar la configuración para que el cambio surta efecto en la sesión actual sin necesidad de cerrar el terminal:

source ~/.bashrc
✅

Paso 4: Prueba Final de la Instalación

Verificación
1

Comprobar la versión instalada de Nuclei:

nuclei -version
                  __     _
   ____  __  __  / /__  (_)
  / __ \/ / / / / / _ \/ /
 / / / / /_/ / / /  __/ /
/_/ /_/\__,_/_/_/\___/_/   v3.7.0

          projectdiscovery.io

Use with caution. You are responsible for your actions.
Developers assume no liability and are not responsible for any misuse or damage.

[INF] Current nuclei version: v3.7.0 (latest)
2

Ver todas las opciones disponibles:

nuclei -help

Esto muestra la lista completa de flags y opciones. Muy útil durante el laboratorio para recordar la sintaxis sin salir del terminal.

🎉

Ya tienes Nuclei v3.7.0 perfectamente instalado y configurado en tu PATH. El motor está listo. Ahora configura las plantillas y comienza a trabajar.

🔧

Solución: Si ~/go/bin/ Sigue Vacío

Troubleshooting

Si después del paso 1 la carpeta ~/go/bin/ sigue vacía (sin el binario de nuclei), puede ocurrir que la instalación de Go via Snap esté usando un GOPATH diferente al esperado.

1

Consultar exactamente dónde está guardando Go los binarios:

go env GOPATH

La carpeta de los programas instalados será lo que te responda ese comando más /bin. Por ejemplo, si responde /root/go, el binario estará en /root/go/bin/nuclei.

2

Ajustar el PATH a la ruta real devuelta por GOPATH:

# Sustituye /ruta/real/go por lo que devolvió el comando anterior
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc
source ~/.bashrc

# Verificar que nuclei ya es encontrado
which nuclei
nuclei -version
3

Alternativa — ejecutar nuclei con la ruta completa (sin modificar el PATH):

# Usar la ruta completa al binario
$(go env GOPATH)/bin/nuclei -version

# Crear un alias permanente como atajo
echo "alias nuclei='$(go env GOPATH)/bin/nuclei'" >> ~/.bashrc
source ~/.bashrc
📚

El Primer Paso Obligatorio: Actualizar Plantillas

nuclei -ut

Nuclei funciona mediante templates (plantillas) que son las que contienen las reglas para detectar cada vulnerabilidad. Sin plantillas, Nuclei no puede detectar nada. La primera vez que uses Nuclei debes descargarlas antes de cualquier escaneo.

1

Descargar y actualizar todas las plantillas de la comunidad:

nuclei -ut
[INF] nuclei-templates are not installed, installing...
[INF] Successfully installed nuclei-templates at ~/.local/nuclei-templates
[INF] Downloading nuclei-templates from official repo...
[INF] [update] nuclei-templates is outdated, updating...
[INF] [update] Successfully updated nuclei-templates (v9.x.x)
[INF] Available templates: 7842

Esto descargará miles de plantillas de la comunidad en ~/.local/nuclei-templates. Tarda varios minutos la primera vez.

2

Explorar las categorías de plantillas disponibles:

# Ver la estructura de directorios de las plantillas
ls ~/.local/nuclei-templates/

# Contar cuántas plantillas hay en total
find ~/.local/nuclei-templates -name "*.yaml" | wc -l
cves/          exposures/     miscellaneous/    network/
cloud/         fuzzing/       misconfiguration/ panels/
cnvd/          helpers/       payloads/         takeovers/
code/          http/          profile/          technologies/
default-logins/  iot/         response/         workflows/
dnsrecon/      javascript/    ssl/              ...
3

Actualizar las plantillas regularmente (recomendado cada semana en uso profesional):

# Actualizar plantillas (mismo comando que la instalación inicial)
nuclei -ut

# Actualizar también el propio binario de Nuclei
nuclei -up
Directorio de plantillasQué detecta
cves/CVEs específicos con número de referencia (ej: CVE-2021-44228 Log4Shell)
exposures/Archivos y directorios sensibles expuestos (.env, backup, config)
misconfiguration/Configuraciones erróneas en servidores y servicios
default-logins/Credenciales por defecto en paneles de administración
technologies/Identificación de tecnologías y frameworks en uso
network/detection/Detección de servicios de red (puertos abiertos, versiones)
ssl/Análisis de certificados TLS, ciphers débiles
fuzzing/Técnicas de fuzzing para descubrir rutas y parámetros ocultos
panels/Detección de paneles de login de administración expuestos
⌨️

Conceptos Básicos de Uso: Sintaxis Fundamental

La sintaxis de Nuclei es simple y consistente. Siempre parte de un objetivo (-u o -list) y opcionalmente se filtra qué plantillas usar.

ComandoQué hace
nuclei -u http://ejemplo.comEscaneo básico de un solo objetivo usando todas las plantillas activas
nuclei -list objetivos.txtEscanea una lista de objetivos guardados en un archivo .txt (uno por línea)
nuclei -t exposures/Escanea usando solo un grupo específico de plantillas (ej. exposiciones de datos)
nuclei -severity critical,highFiltra para buscar solo vulnerabilidades graves (critical y high)
nuclei -tags wp-pluginSolo plantillas etiquetadas con "wp-plugin" (para WordPress)
nuclei -o resultados.txtGuarda los resultados en un archivo de texto
1

Primer escaneo — objetivo único con todas las plantillas:

nuclei -u http://testphp.vulnweb.com
⚠️

testphp.vulnweb.com es el servidor de pruebas oficial de Acunetix, diseñado específicamente para ser escaneado con herramientas de seguridad. Es el objetivo "seguro" por excelencia para prácticas de pentesting.

2

Escaneo de múltiples objetivos desde un fichero:

# Crear un archivo con varios objetivos (uno por línea)
cat > objetivos.txt << EOF
http://testphp.vulnweb.com
http://localhost:8000
http://172.26.0.192
EOF

# Escanear todos los objetivos del fichero
nuclei -list objetivos.txt -severity medium,high,critical
🚩

Flags Más Importantes

FlagDescripciónEjemplo
-u URLObjetivo único a escanear-u https://objetivo.com
-list FILEArchivo con lista de objetivos-list targets.txt
-t RUTAPlantilla o directorio de plantillas específico-t cves/ -t exposures/
-tags TAGFiltrar plantillas por etiqueta-tags wordpress,config
-severity SEVFiltrar por nivel de severidad-severity critical,high
-o FILEGuardar resultados en archivo-o resultados.txt
-json-export FILEExportar resultados en formato JSON-json-export resultado.json
-rate-limit NLimitar peticiones por segundo-rate-limit 50
-c NNúmero de plantillas paralelas-c 25
-timeout NTimeout por petición en segundos-timeout 10
-retries NNúmero de reintentos por petición-retries 3
-silentSolo mostrar resultados, sin información de progreso-silent
-vModo verbose (muestra todas las peticiones enviadas)-v
-utActualizar plantillas antes de escanear-ut
-statsMostrar estadísticas del escaneo en tiempo real-stats
-no-colorDeshabilitar colores (útil para logs)-no-color
-exclude-tags TAGExcluir plantillas con ciertos tags-exclude-tags dos
-new-templatesUsar solo las plantillas añadidas en la última actualización-new-templates
🚦

Filtrar por Severidad

Las severidades en Nuclei siguen el estándar CVSS. Filtrar por severidad es clave para priorizar qué vulnerabilidades atender primero y para evitar "ruido" innecesario en los reportes.

CRITICAL HIGH MEDIUM LOW INFO UNKNOWN
SeveridadCVSSQué implicaEjemplo
CRITICAL9.0 – 10.0Explotación trivial, impacto total. Parchear INMEDIATAMENTE.RCE sin autenticación, SQL Injection crítico
HIGH7.0 – 8.9Explotación factible, impacto alto. Parchear en <24h.SSRF, LFI, credenciales expuestas
MEDIUM4.0 – 6.9Explotación posible con condiciones. Parchear en días.XSS, CSRF, misconfigs de headers
LOW0.1 – 3.9Impacto limitado. Parchear en el próximo ciclo.Información expuesta, versiones visibles
INFO0.0Solo información. Útil para inventario de tecnologías.Detección de frameworks, headers de servidor
1

Escaneo prioritario — solo vulnerabilidades críticas y altas:

nuclei -u https://objetivo.com -severity critical,high
2

Escaneo de reconocimiento — solo información de tecnologías:

nuclei -u https://objetivo.com -severity info -tags tech
💾

Guardar Resultados

En auditorías de seguridad siempre hay que guardar los resultados. Nuclei ofrece varios formatos de salida para diferentes necesidades.

1

Guardar resultados en texto plano (lo más sencillo):

nuclei -u http://172.26.0.143 -o resultados_escaneo.txt
2

Guardar en formato JSON (mejor para integrar con otras herramientas o procesado automático):

nuclei -u http://172.26.0.143 -json-export resultados.json -silent
3

Escaneo completo con múltiples formatos de salida:

nuclei -u http://172.26.0.143 \
  -severity critical,high,medium \
  -o resultados.txt \
  -json-export resultados.json \
  -stats
4

Ver los resultados guardados:

# Ver el archivo de texto
cat resultados_escaneo.txt

# Ver el JSON formateado (requiere jq)
cat resultados.json | jq .

# Contar cuántas vulnerabilidades encontró
wc -l resultados_escaneo.txt
🔬

Práctica Real: Escanear el Laboratorio

Lab

Como tienes montado un entorno con Ubuntu y Kali, puedes usar Nuclei para ver qué "puertas" están abiertas en tus máquinas virtuales. Este es el escenario descrito en el documento de práctica.

⚠️

Sustituye las IPs 172.26.0.192 y 172.26.0.143 por las IPs reales de tus máquinas virtuales. Puedes obtenerlas con ip a en cada VM.

Escaneo de Tecnologías (Muy rápido)

Este comando detecta qué software corre en el objetivo — framework web, CMS, servidor, versiones. Es el primer escaneo que siempre se debe hacer (reconocimiento).

1

Detectar tecnologías del objetivo:

nuclei -u http://172.26.0.192 -t network/detection
[INF] Using Nuclei Engine 3.7.0 (templates: 7842)
[INF] Targets loaded for current scan: 1

[tech-detect] [http] [info] http://172.26.0.192 [Apache]
[tech-detect] [http] [info] http://172.26.0.192 [PHP/8.2.0]
[openssh-detect] [tcp] [info] 172.26.0.192:22 [SSH-2.0-OpenSSH_9.0p1]

Escaneo de "Fuzzing" y Archivos Expuestos

Si tienes un servidor web corriendo, este escaneo busca archivos de configuración, backups y directorios sensibles que no debería haber expuesto.

2

Buscar configuraciones expuestas y archivos sensibles:

nuclei -u http://localhost:8000 -tags config,exposure

Este escaneo busca patrones como archivos .env, config.php, backup.zip, paneles de administración expuestos, etc.

3

Escaneo completo de una máquina del laboratorio guardando resultados:

nuclei -u http://172.26.0.143 -o resultados_escaneo.txt
4

Escaneo de reconocimiento de toda la red local (identificar hosts activos y sus tecnologías):

# Crear lista de IPs de la red local
cat > red_local.txt << EOF
http://172.26.0.1
http://172.26.0.192
http://172.26.0.143
EOF

# Escanear con plantillas de detección y tecnologías
nuclei -list red_local.txt \
  -t technologies/ \
  -t network/detection \
  -severity info \
  -o reconocimiento.txt
🏷️

Uso Eficiente de Tags

Las etiquetas (tags) son la herramienta más potente para controlar qué plantillas ejecuta Nuclei. Filtrar por tags es siempre mejor que ejecutar todas las plantillas a ciegas.

💡

Consejo de Hacker Ético: Nuclei puede ser muy ruidoso. Si escaneas una web con todas las plantillas a la vez, el servidor podría bloquearte o generarías miles de logs en sus sistemas de monitorización. Siempre es mejor empezar filtrando por etiquetas (tags) específicas del objetivo.

TagQué detectaCuándo usarlo
techIdentificación de tecnologíasReconocimiento inicial
configArchivos de configuración expuestosSiempre, en todo objetivo web
exposureArchivos sensibles accesibles públicamenteSiempre, en todo objetivo web
wp-pluginPlugins vulnerables de WordPressSi el objetivo usa WordPress
wordpressConfiguraciones y CVEs de WordPressSi el objetivo usa WordPress
apacheVulnerabilidades de Apache HTTP ServerSi usa Apache
nginxVulnerabilidades de NginxSi usa Nginx
phpmyadminPaneles phpMyAdmin expuestosAuditoría de BD
default-loginCredenciales por defecto en panelesAuditoría de accesos
misconfigConfiguraciones erróneasHardening review
cveCVEs con número de referenciaBúsqueda de vulnerabilidades conocidas
log4jLog4Shell y variantesSi usa Java / Log4j
xssCross-Site ScriptingAuditoría de apps web
sqliSQL InjectionAuditoría de apps web con BD
1

Escaneo con múltiples tags combinados:

# Combinar múltiples tags con coma
nuclei -u http://objetivo.com -tags config,exposure,misconfig
2

Excluir tags potencialmente disruptivos:

# Excluir plantillas de DoS y fuzzing agresivo
nuclei -u http://objetivo.com -exclude-tags dos,fuzz
🔷

Práctica WordPress: Escaneando un CMS Real

wp-plugin

Este es el ejemplo práctico del documento de práctica. WordPress es el CMS más extendido del mundo y uno de los objetivos más frecuentes en auditorías. Nuclei tiene cientos de plantillas específicas para WordPress.

1

Escanear plugins vulnerables de WordPress:

nuclei -u https://es.wordpress.org/ -tags wp-plugin
⚠️

es.wordpress.org es el sitio oficial de WordPress y pertenece a Automattic. Escanear sitios de terceros sin autorización es ilegal. En este caso concreto, WordPress tiene un programa de divulgación responsable. Para la práctica del laboratorio, usa siempre tu propia instalación de WordPress en local o en tu VM.

2

Escaneo completo de WordPress en tu entorno local:

# Suponiendo que tienes WordPress instalado en tu VM
nuclei -u http://localhost/wordpress -tags wordpress,wp-plugin,wp-theme
3

Buscar el panel de login de WordPress expuesto:

nuclei -u http://localhost -tags wordpress -t exposures/
4

Buscar credenciales por defecto en el panel de WordPress:

nuclei -u http://localhost/wordpress -tags default-login
🚦

Control de Velocidad y Carga

Nuclei puede generar mucho tráfico. Controlar la velocidad es esencial para no crashear el objetivo, evitar ser bloqueado por WAFs, y respetar los límites del entorno de laboratorio.

1

Escaneo silencioso y controlado (el más recomendado para entornos reales):

nuclei -u http://objetivo.com \
  -rate-limit 50 \
  -c 15 \
  -timeout 10 \
  -retries 2 \
  -tags config,exposure
FlagValorSignificado
-rate-limit 5050 req/sMáximo 50 peticiones por segundo al servidor
-c 1515 hilos15 plantillas ejecutándose en paralelo
-timeout 1010 segTiempo máximo de espera por petición
-retries 22 intentosReintentar peticiones fallidas 2 veces
2

Escaneo rápido de laboratorio (sin límites, máximo rendimiento):

# Para entornos locales donde no hay riesgo de bloqueo
nuclei -u http://localhost:8000 \
  -c 50 \
  -stats \
  -severity critical,high
✏️

Crear una Plantilla Propia

Avanzado

La verdadera potencia de Nuclei está en poder escribir tus propias plantillas para detectar vulnerabilidades específicas de un objetivo concreto. Esta es la habilidad diferenciadora de un pentester avanzado.

1

Crear el directorio de plantillas personalizadas:

mkdir -p ~/nuclei-custom-templates
cd ~/nuclei-custom-templates
2

Plantilla 1 — Detectar header de seguridad X-Frame-Options faltante:

nano ~/nuclei-custom-templates/missing-xframe-options.yaml
📄 missing-xframe-options.yaml
id: missing-xframe-options

info:
  name: X-Frame-Options Header Missing
  author: alumno
  severity: medium
  description: El servidor no envía el header X-Frame-Options,
    lo que permite ataques de Clickjacking.
  tags: http,headers,misconfig,clickjacking

http:
  - method: GET
    path:
      - "{{BaseURL}}/"

    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200
      - type: word
        part: header
        negative: true
        words:
          - "x-frame-options"
3

Plantilla 2 — Detectar directorio .git expuesto:

📄 exposed-git-directory.yaml
id: exposed-git-directory

info:
  name: Directorio .git Expuesto
  author: alumno
  severity: high
  description: El directorio .git es accesible públicamente.
    Un atacante puede descargar el código fuente completo.
  tags: http,exposure,git,disclosure

http:
  - method: GET
    path:
      - "{{BaseURL}}/.git/HEAD"

    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200
      - type: word
        words:
          - "ref: refs/"   # Contenido del archivo HEAD de Git
4

Validar la sintaxis de tu plantilla:

# Nuclei valida la plantilla sin ejecutarla
nuclei -validate -t ~/nuclei-custom-templates/missing-xframe-options.yaml
[INF] Loaded 1 templates for validation
[INF] All templates validated successfully
5

Ejecutar tu plantilla personalizada contra un objetivo:

# Usar una plantilla concreta
nuclei -u http://localhost -t ~/nuclei-custom-templates/missing-xframe-options.yaml

# Usar todas las plantillas del directorio personalizado
nuclei -u http://localhost -t ~/nuclei-custom-templates/
🔄

Integración en Pipelines CI/CD

DevSecOps

Una de las características más valoradas de Nuclei en entornos empresariales es su fácil integración en pipelines de CI/CD para ejecutar escaneos de seguridad automáticamente en cada despliegue.

Ejemplo: GitHub Actions

📄 .github/workflows/nuclei-scan.yml
name: Nuclei Security Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Run Nuclei Scan
        uses: projectdiscovery/nuclei-action@main
        with:
          target: https://staging.miapp.com
          flags: "-severity critical,high -tags config,exposure"
          github-report: true
          github-token: ${{ secrets.GITHUB_TOKEN }}

Flujo DevSecOps con Nuclei

💻
Commit
Dev sube código
→
🔄
CI/CD Pipeline
Build + Test
→
⚡
Nuclei Scan
Scan automático
→
🚨
Gate
Bloquear si CRIT
→
🚀
Deploy
Solo si pasa el scan
🔗

Integraciones con Plataformas Externas

Nuclei se integra nativamente con las plataformas de gestión más usadas en entornos empresariales para automatizar el ciclo completo de detección → notificación → remediación.

PlataformaCómo integrarCaso de uso
Jira-report-config jira.yamlAbrir tickets automáticamente por cada vulnerabilidad encontrada
SplunkEnviar output JSON al índice de SplunkCorrelacionar hallazgos con SIEM para detección continua
GitHubGitHub Actions + nuclei-actionBloquear PRs que introduzcan vulnerabilidades críticas
GitLabGitLab CI + nuclei binaryIntegración en pipeline SAST de GitLab
ElasticOutput JSON → Logstash → ElasticsearchDashboard de vulnerabilidades en Kibana
SlackWebhooks con herramienta notify de ProjectDiscoveryNotificaciones en tiempo real al canal de seguridad
1

Enviar resultados a Slack mediante notify (herramienta complementaria de ProjectDiscovery):

# Instalar notify
go install github.com/projectdiscovery/notify/cmd/notify@latest

# Ejecutar Nuclei y enviar resultados a Slack
nuclei -u http://objetivo.com -severity critical,high -silent | \
  notify -slack -id mi-workspace
🔧

Resolución de Problemas

Troubleshooting
ProblemaCausaSolución
nuclei: command not foundEl PATH no incluye ~/go/bin/Ejecutar source ~/.bashrc o añadir al PATH con el GOPATH correcto
Binario no aparece en ~/go/bin/GOPATH diferente al esperado (instalación Snap)Ejecutar go env GOPATH y buscar en esa ruta + /bin/
Error al instalar: connection refusedSin acceso a internetVerificar conexión: ping github.com
Plantillas no encontradasNo se han descargadoEjecutar nuclei -ut primero
El escáner es muy lentoDemasiadas plantillas o red lentaFiltrar con -tags o -severity para reducir el número
El objetivo bloquea las peticionesWAF detecta el escánerUsar -rate-limit 20 y -H "User-Agent: Mozilla/5.0"
Error de go install: module not foundVersión de Go desactualizadaActualizar Go: sudo snap refresh go
Muchos falsos positivosPlantillas muy genéricas con todos los targetsFiltrar por tags específicos del objetivo
1

Comandos de diagnóstico útiles:

# Ver dónde está instalado el binario
which nuclei
ls -la ~/go/bin/nuclei

# Ver la versión de Go y su GOPATH
go version
go env GOPATH
go env GOROOT

# Verificar que el PATH está correctamente configurado
echo $PATH | tr ':' '\n' | grep go

# Forzar reinstalación de Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

# Verificar la validez de una plantilla custom
nuclei -validate -t mi-plantilla.yaml

# Ejecutar en modo debug para ver todas las peticiones
nuclei -u http://objetivo.com -debug -tags config
📋

Resumen y Cheatsheet de Referencia

🎉

¡Laboratorio completado! Has instalado Nuclei v3 desde Go, configurado el PATH, actualizado las plantillas de la comunidad, realizado escaneos de vulnerabilidades reales en el laboratorio y aprendido a crear plantillas propias.

Instalación completa desde cero

──── 1. INSTALAR GO ─────────────────────────────────────────────
sudo snap install go --classic
go version

──── 2. INSTALAR NUCLEI ─────────────────────────────────────────
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

──── 3. CONFIGURAR PATH ─────────────────────────────────────────
echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.bashrc
source ~/.bashrc

──── 4. VERIFICAR ───────────────────────────────────────────────
nuclei -version

──── 5. DESCARGAR PLANTILLAS ────────────────────────────────────
nuclei -ut

Flujo de trabajo de un escaneo profesional

🔍
Reconocimiento
-tags tech -severity info
→
🎯
Escaneo dirigido
-tags config,exposure
→
🚨
Críticos y altos
-severity critical,high
→
📄
Informe
-o reporte.txt -json-export

Comandos de referencia rápida

──── ESCANEOS BÁSICOS ───────────────────────────────────────────
nuclei -u http://objetivo.com                                # Todo
nuclei -u http://objetivo.com -severity critical,high        # Solo graves
nuclei -u http://objetivo.com -tags config,exposure          # Por categoría
nuclei -list targets.txt                                     # Múltiples objetivos

──── PRÁCTICA DEL LABORATORIO ───────────────────────────────────
nuclei -u http://172.26.0.192 -t network/detection           # Detección de servicios
nuclei -u http://localhost:8000 -tags config,exposure        # Archivos expuestos
nuclei -u http://172.26.0.143 -o resultados_escaneo.txt      # Guardar resultados
nuclei -u https://es.wordpress.org/ -tags wp-plugin          # WordPress (propio)

──── CONTROL DE VELOCIDAD ───────────────────────────────────────
nuclei -u http://objetivo.com -rate-limit 50 -c 15           # Modo profesional
nuclei -u http://objetivo.com -exclude-tags dos,fuzz         # Excluir disruptivos

──── GESTIÓN DE PLANTILLAS ──────────────────────────────────────
nuclei -ut                                                   # Actualizar plantillas
nuclei -up                                                   # Actualizar Nuclei
nuclei -validate -t mi-plantilla.yaml                        # Validar plantilla
nuclei -tl                                                   # Listar todas las plantillas

──── SALIDA Y REPORTES ──────────────────────────────────────────
nuclei -u http://objetivo.com -o resultado.txt               # Texto plano
nuclei -u http://objetivo.com -json-export resultado.json    # JSON
nuclei -u http://objetivo.com -silent                        # Solo resultados
nuclei -u http://objetivo.com -stats                         # Con estadísticas

Capacidades adquiridas