¿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.
- Detección basada en versiones de software
- Alto porcentaje de falsos positivos
- Difícil personalización
- Lento y con sobrecarga de red
- 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:
- Formato YAML simple para crear y personalizar plantillas de vulnerabilidad
- Contribución de miles de profesionales de la seguridad para hacer frente a las vulnerabilidades de tendencia
- Reduce los falsos positivos simulando los pasos del mundo real para verificar una vulnerabilidad
- Procesamiento de escaneo paralelo ultrarrápido y agrupación de solicitudes
- Integración en canalizaciones de CI/CD para detección de vulnerabilidades y pruebas de regresión
- Soporte de múltiples protocolos: TCP, DNS, HTTP, SSL, WHOIS, JavaScript, Code y más
- Integración nativa con Jira, Splunk, GitHub, Elastic y GitLab
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
ImportanteUSO 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.
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.
# 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ón | Función | Obligatoria |
|---|---|---|
id | Identificador único de la plantilla (snake_case) | ✅ Sí |
info | Nombre, autor, severidad, descripción, tags | ✅ Sí |
http / dns / tcp... | Protocolo y petición que Nuclei enviará al objetivo | ✅ Sí (1 mínimo) |
matchers | Condiciones que deben cumplirse para marcar como vulnerable | ✅ Sí |
extractors | Extrae información de la respuesta (versiones, IPs, tokens) | ❌ Opcional |
variables | Variables personalizadas reutilizables en la plantilla | ❌ Opcional |
Instalar Go (Golang)
PrerequisitoNuclei 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.
Instalar Go mediante snap:
sudo snap install go --classicLa 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.
Verificar que Go se instaló correctamente:
go versiongo version go1.22.4 linux/amd64Verificar el GOPATH (directorio donde Go guarda los binarios instalados):
go env GOPATH/home/atu/goLos 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 versionPaso 1: Instalar Nuclei
go installUna 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.
Instalar Nuclei v3 (última versión disponible):
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latestLa 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 permanenteVerificar que el binario existe en la carpeta de Go:
ls ~/go/bin/nuclei/home/atu/go/bin/nucleiSi el comando devuelve la ruta en verde (o simplemente no da error), el binario está instalado correctamente.
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' >> ~/.bashrcEste comando añade una línea al archivo ~/.bashrc, que se ejecuta automáticamente cada vez que abres un nuevo terminal.
Recargar la configuración para que el cambio surta efecto en la sesión actual sin necesidad de cerrar el terminal:
source ~/.bashrcPaso 4: Prueba Final de la Instalación
VerificaciónComprobar 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)Ver todas las opciones disponibles:
nuclei -helpEsto 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
TroubleshootingSi 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.
Consultar exactamente dónde está guardando Go los binarios:
go env GOPATHLa 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.
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 -versionAlternativa — 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 ~/.bashrcEl Primer Paso Obligatorio: Actualizar Plantillas
nuclei -utNuclei 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.
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: 7842Esto descargará miles de plantillas de la comunidad en ~/.local/nuclei-templates. Tarda varios minutos la primera vez.
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 -lcves/ exposures/ miscellaneous/ network/
cloud/ fuzzing/ misconfiguration/ panels/
cnvd/ helpers/ payloads/ takeovers/
code/ http/ profile/ technologies/
default-logins/ iot/ response/ workflows/
dnsrecon/ javascript/ ssl/ ...
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 plantillas | Qué 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.
| Comando | Qué hace |
|---|---|
nuclei -u http://ejemplo.com | Escaneo básico de un solo objetivo usando todas las plantillas activas |
nuclei -list objetivos.txt | Escanea 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,high | Filtra para buscar solo vulnerabilidades graves (critical y high) |
nuclei -tags wp-plugin | Solo plantillas etiquetadas con "wp-plugin" (para WordPress) |
nuclei -o resultados.txt | Guarda los resultados en un archivo de texto |
Primer escaneo — objetivo único con todas las plantillas:
nuclei -u http://testphp.vulnweb.comtestphp.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.
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,criticalFlags Más Importantes
| Flag | Descripción | Ejemplo |
|---|---|---|
-u URL | Objetivo único a escanear | -u https://objetivo.com |
-list FILE | Archivo con lista de objetivos | -list targets.txt |
-t RUTA | Plantilla o directorio de plantillas específico | -t cves/ -t exposures/ |
-tags TAG | Filtrar plantillas por etiqueta | -tags wordpress,config |
-severity SEV | Filtrar por nivel de severidad | -severity critical,high |
-o FILE | Guardar resultados en archivo | -o resultados.txt |
-json-export FILE | Exportar resultados en formato JSON | -json-export resultado.json |
-rate-limit N | Limitar peticiones por segundo | -rate-limit 50 |
-c N | Número de plantillas paralelas | -c 25 |
-timeout N | Timeout por petición en segundos | -timeout 10 |
-retries N | Número de reintentos por petición | -retries 3 |
-silent | Solo mostrar resultados, sin información de progreso | -silent |
-v | Modo verbose (muestra todas las peticiones enviadas) | -v |
-ut | Actualizar plantillas antes de escanear | -ut |
-stats | Mostrar estadísticas del escaneo en tiempo real | -stats |
-no-color | Deshabilitar colores (útil para logs) | -no-color |
-exclude-tags TAG | Excluir plantillas con ciertos tags | -exclude-tags dos |
-new-templates | Usar 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.
| Severidad | CVSS | Qué implica | Ejemplo |
|---|---|---|---|
| CRITICAL | 9.0 – 10.0 | Explotación trivial, impacto total. Parchear INMEDIATAMENTE. | RCE sin autenticación, SQL Injection crítico |
| HIGH | 7.0 – 8.9 | Explotación factible, impacto alto. Parchear en <24h. | SSRF, LFI, credenciales expuestas |
| MEDIUM | 4.0 – 6.9 | Explotación posible con condiciones. Parchear en días. | XSS, CSRF, misconfigs de headers |
| LOW | 0.1 – 3.9 | Impacto limitado. Parchear en el próximo ciclo. | Información expuesta, versiones visibles |
| INFO | 0.0 | Solo información. Útil para inventario de tecnologías. | Detección de frameworks, headers de servidor |
Escaneo prioritario — solo vulnerabilidades críticas y altas:
nuclei -u https://objetivo.com -severity critical,highEscaneo de reconocimiento — solo información de tecnologías:
nuclei -u https://objetivo.com -severity info -tags techGuardar Resultados
En auditorías de seguridad siempre hay que guardar los resultados. Nuclei ofrece varios formatos de salida para diferentes necesidades.
Guardar resultados en texto plano (lo más sencillo):
nuclei -u http://172.26.0.143 -o resultados_escaneo.txtGuardar en formato JSON (mejor para integrar con otras herramientas o procesado automático):
nuclei -u http://172.26.0.143 -json-export resultados.json -silentEscaneo 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 \
-statsVer 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.txtPráctica Real: Escanear el Laboratorio
LabComo 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).
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.
Buscar configuraciones expuestas y archivos sensibles:
nuclei -u http://localhost:8000 -tags config,exposureEste escaneo busca patrones como archivos .env, config.php, backup.zip, paneles de administración expuestos, etc.
Escaneo completo de una máquina del laboratorio guardando resultados:
nuclei -u http://172.26.0.143 -o resultados_escaneo.txtEscaneo 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.txtUso 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.
| Tag | Qué detecta | Cuándo usarlo |
|---|---|---|
tech | Identificación de tecnologías | Reconocimiento inicial |
config | Archivos de configuración expuestos | Siempre, en todo objetivo web |
exposure | Archivos sensibles accesibles públicamente | Siempre, en todo objetivo web |
wp-plugin | Plugins vulnerables de WordPress | Si el objetivo usa WordPress |
wordpress | Configuraciones y CVEs de WordPress | Si el objetivo usa WordPress |
apache | Vulnerabilidades de Apache HTTP Server | Si usa Apache |
nginx | Vulnerabilidades de Nginx | Si usa Nginx |
phpmyadmin | Paneles phpMyAdmin expuestos | Auditoría de BD |
default-login | Credenciales por defecto en paneles | Auditoría de accesos |
misconfig | Configuraciones erróneas | Hardening review |
cve | CVEs con número de referencia | Búsqueda de vulnerabilidades conocidas |
log4j | Log4Shell y variantes | Si usa Java / Log4j |
xss | Cross-Site Scripting | Auditoría de apps web |
sqli | SQL Injection | Auditoría de apps web con BD |
Escaneo con múltiples tags combinados:
# Combinar múltiples tags con coma
nuclei -u http://objetivo.com -tags config,exposure,misconfigExcluir tags potencialmente disruptivos:
# Excluir plantillas de DoS y fuzzing agresivo
nuclei -u http://objetivo.com -exclude-tags dos,fuzzPráctica WordPress: Escaneando un CMS Real
wp-pluginEste 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.
Escanear plugins vulnerables de WordPress:
nuclei -u https://es.wordpress.org/ -tags wp-plugines.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.
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-themeBuscar el panel de login de WordPress expuesto:
nuclei -u http://localhost -tags wordpress -t exposures/Buscar credenciales por defecto en el panel de WordPress:
nuclei -u http://localhost/wordpress -tags default-loginControl 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.
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| Flag | Valor | Significado |
|---|---|---|
-rate-limit 50 | 50 req/s | Máximo 50 peticiones por segundo al servidor |
-c 15 | 15 hilos | 15 plantillas ejecutándose en paralelo |
-timeout 10 | 10 seg | Tiempo máximo de espera por petición |
-retries 2 | 2 intentos | Reintentar peticiones fallidas 2 veces |
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,highCrear una Plantilla Propia
AvanzadoLa 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.
Crear el directorio de plantillas personalizadas:
mkdir -p ~/nuclei-custom-templates
cd ~/nuclei-custom-templatesPlantilla 1 — Detectar header de seguridad X-Frame-Options faltante:
nano ~/nuclei-custom-templates/missing-xframe-options.yamlid: 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"
Plantilla 2 — Detectar directorio .git expuesto:
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
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 successfullyEjecutar 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
DevSecOpsUna 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
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
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.
| Plataforma | Cómo integrar | Caso de uso |
|---|---|---|
| Jira | -report-config jira.yaml | Abrir tickets automáticamente por cada vulnerabilidad encontrada |
| Splunk | Enviar output JSON al índice de Splunk | Correlacionar hallazgos con SIEM para detección continua |
| GitHub | GitHub Actions + nuclei-action | Bloquear PRs que introduzcan vulnerabilidades críticas |
| GitLab | GitLab CI + nuclei binary | Integración en pipeline SAST de GitLab |
| Elastic | Output JSON → Logstash → Elasticsearch | Dashboard de vulnerabilidades en Kibana |
| Slack | Webhooks con herramienta notify de ProjectDiscovery | Notificaciones en tiempo real al canal de seguridad |
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-workspaceResolución de Problemas
Troubleshooting| Problema | Causa | Solución |
|---|---|---|
nuclei: command not found | El 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 refused | Sin acceso a internet | Verificar conexión: ping github.com |
| Plantillas no encontradas | No se han descargado | Ejecutar nuclei -ut primero |
| El escáner es muy lento | Demasiadas plantillas o red lenta | Filtrar con -tags o -severity para reducir el número |
| El objetivo bloquea las peticiones | WAF detecta el escáner | Usar -rate-limit 20 y -H "User-Agent: Mozilla/5.0" |
| Error de go install: module not found | Versión de Go desactualizada | Actualizar Go: sudo snap refresh go |
| Muchos falsos positivos | Plantillas muy genéricas con todos los targets | Filtrar por tags específicos del objetivo |
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 configResumen 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 -utFlujo de trabajo de un escaneo profesional
-tags tech -severity info-tags config,exposure-severity critical,high-o reporte.txt -json-exportComandos 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ísticasCapacidades adquiridas
- ✓Instalar Go mediante snap en Ubuntu 24.04
- ✓Instalar Nuclei v3 con go install desde el repositorio oficial
- ✓Configurar el PATH de forma permanente en ~/.bashrc
- ✓Resolver el problema del GOPATH alternativo de Snap
- ✓Descargar y actualizar las plantillas de la comunidad
- ✓Entender la arquitectura YAML de las plantillas de Nuclei
- ✓Ejecutar escaneos básicos con -u y -list
- ✓Filtrar por severidad y tags para escaneos dirigidos
- ✓Guardar resultados en texto plano y JSON
- ✓Escanear el entorno de laboratorio Ubuntu + Kali
- ✓Aplicar el consejo profesional de filtrado por tags
- ✓Escanear instalaciones WordPress con plantillas específicas
- ✓Controlar la velocidad del escaneo con rate-limit
- ✓Crear y validar plantillas YAML propias
- ✓Conocer las posibilidades de integración CI/CD y plataformas externas