nuclei templates
Overview
Nuclei, es un software que nos permite descubrir vulnerabilidades, secretos y misconfigurations en diferentes servicios. En su página web se describe como “Community Powered Vulnerability Scanner”, y es que este software, nos permite ejecutar plantillas, que podemos tanto descargar como crear nosotros mismos.
Es esta característica, que permite crear de un modo sencillo pruebas personalizadas, lo que, desde mi punto de vista, proporciona a nuclei un gran potencial.
Pasemos pues a la práctica, tanto en la creación de templates como en la ejecución de los mismos.
Templates
Cuando hablamos de plantillas o templates, nos referimos a ficheros donde se define de forma estructurada la prueba que queremos realizar en cada servicio, encontrar un fichero concreto, una ruta, una cadena de texto … las posibilidades son infinitas. Encontraremos la documentación donde se explica detalladamente todas sus opciones en su página web.
Para iniciarnos podemos hacer uso de las plantillas creadas por la comunidad, que podemos encontrar en su GitHub.
También podemos hacer uso de otros repositorios o de aplicaciones como cent, un software que recopila por nosotros templates de distintos repositorios.
Veamos a continuación como crear nuestro propio template.
Template repo-hunter
En este ejemplo realizaremos una plantilla que buscará, mediante el análisis de direcciones web, si el servicio web está haciendo uso de repositorios tipo GitHub, snv, etc.
Todo template empieza con una cabecera que nos explica las tareas que realiza y nos permitirá después identificarla o seleccionarla mediante etiquetas.
1 | id: repo-hunter |
En este primer apartado es importante destacar, el id, que identificará:
- Nuestro template durante la ejecución de nuclei, algo que veremos más adelante.
- La severidad de la vulnerabilidad o prueba que estemos analizando. Esto nos facilitará también su tratamiento cuando estemos analizando los resultados.
- Los tags, que nos permitirán ejecutar las plantillas por categorías optimizando así su ejecución según lo que necesitemos en cada momento.
En el siguiente bloque de código, podremos ver como se define la prueba que queremos ejecutar, en este ejemplo estamos buscando ciertas rutas en una dirección web especifica, url.
1 | requests: |
Analicemos los distintos puntos del código:
Iniciamos definiendo el método, en este caso estamos usando GET, pero podemos hacer uso de cualquier método http como POST, PUT, DELETE u otros.
A continuación, indicamos el path, la ruta que queremos analizar. En este ejemplo lo estamos realizando de forma dinámica, usando la BaseURL y el repo-path que no es más que un listado que comentaremos a continuación.
En el apartado del payload, definimos el listado con las distintas url que queremos analizar. En este caso el contenido del repo-paths.txt es el siguiente.
1 | .git/ |
Hemos definido también que el tipo de ataque será sniper, que se usa para testear todos los paths indicados en el fichero.
Le hemos indicado que se detenga al primer match, lo que nos ahorrará mucho tiempo ya que en la prueba que estamos analizando no es probable que se haga uso de más de un repositorio a la vez. Para finalizar, con el parámetro theads indicamos la cantidad de direcciones que probará simultáneamente, de forma concurrente.
Esto significa que, por cada uno de los servicios web que le proporciones a nuclei éste verificará las siguientes direcciones:
https://target.domain.com/.git/
https://target.domain.com/.snv/
https://target.domain.com/CVS/
https://target.domain.com/.bzr/
https://target.domain.com/.hg/
El siguiente apartado son los matchers, las pruebas que realizaremos a las url anteriormente definidas.
1 | matchers-condition: and |
En este ejemplo definimos con la instrucción “matchers-condition: and“ que se han de cumplir ambas pruebas para dar un resultado correcto. Según las necesidades de nuestro template podemos indicar también, con “matchers-condition: or“ que nos basta el cumplimento únicamente de una de las condiciones.
El siguiente punto, el macher “type:status“ indica que queremos evaluar la respuesta http según su código, en este caso un 200, que indica que ha encontrado la url indicada. Recomiendo leer la documentación de nuclei para ver los distintos machers y types con los que podemos jugar.
Dado que hay servidores web que, para esconder un error de un fichero no encontrado “http code status 404“, nos proporcionan una página genérica donde nos informan que la pagina no existe, si no realizarámos ningún otro test obtendríamos muchos falsos positivos. Por ello añadimos la segunda condición en la que indicamos que la respuesta http ha de contener el texto “Index of“. Un texto que hemos detectado que siempre se proporciona en la respuesta http del objeto de nuestro análisis.
Así con escasas 25 líneas de código hemos podido definir como detectar si en una url existe o se está haciendo uso de un repositorio Github, snv …
Podéis descargar la plantilla completa de mi GitHub.
Veamos a continuación la ejecución de nuclei.
Runing own template
Para ejecutar un template con nuclei solo tenemos que ejecutar el siguiente comando:
1 | ~:$ nuclei –u https://target.domain.com -t template.yaml |
Si consultamos la ayuda veremos que podemos remplazar el target por un listado y el template, por una carpeta llena de ellos, lo que nos permite realizar múltiples pruebas a distintos objetivos.

También podemos obtener ciertas métricas de la ejecución si añadimos - metrics a la ejecución y consultándolo posteriormente con el siguiente comando.
1 | ~:$ curl –s localhost:9092/metrics | jq . |
Otra característica muy interesante es el uso de los tags para ejecutar únicamente las plantillas que nos interesen, así como la severidad, el tipo o el autor. De este modo la ejecución de búsqueda será más precisa y mucho más rápida, evitando ejecutar templates que no son de nuestro interés.

Como con cualquier otra herramienta, será muy interesante consultar la ayuda para obtener un mayor detalle de las opciones que esta nos proporciona y profundizar en su uso. Lo descrito en este post no es más que un ejemplo básico que creo puede servir de introducción.
Identificando servicios
Cuando realizamos nuestras plantillas nos puede ser de mucha utilidad poder identificar los distintos servicios que queramos analizar.
Una herramienta muy útil para esta tarea es network-fingerprint. Con ella podemos identificar cualquier servicio analizando las solicitudes y respuestas TCP.
Como ejemplo, identificaremos una base de datos mysql. Para ello simplemente ejecutaremos el siguiente comando dejando la aplicación a la escucha:
1 | ~:$ sudo network-fingerprint -port 3306 -ip 127.0.0.1 |
Desde otra consola accederemos a la base de datos y networ-fingerprint, tal y como se muestra en la siguiente imagen, obtendrá los datos de las solicitudes / respuestas de servicio en cuestión.

En este caso nos quedaremos con la primera “response“ y usaremos el valor en hexadecimal para identificar el servicio mysql.
Añadiremos también las cadenas de texto, “MariaDB“ y “mysql_native_password“, de la respuesta. En este caso estamos identificando cualquier versión, pero jugando con las cadenas de texto podríamos identificar versiones concretas.
Finalmente, la plantilla quedaría así:
1 | id: mysql-detect |
Conclusiones
Nuclei es una excelente herramienta que nos permite ejecutar infinidad de pruebas a nuestros servicios web y definir nuestras propias pruebas de concepto para verificar malas configuraciones, errores, vulnerabilidades …
La comunidad nos proporciona una gran cantidad de templates, que nos permite testear vulnerabilidades conocidas de un modo automatizado.
El potencial de poder crear con un lenguaje simple nuestros propios templates le ofrece sin duda una característica diferencial, que creo es la que lo ha popularizado entre los expertos en seguridad.
Hasta aquí el post de hoy. Espero haya sido de vuestro interés.
No dudéis en contactar mediante el formulario para hacerme llegar vuestros comentarios.