Automatiza tus auditorías con Nuclei
Tiempo de lectura estimado: 18 minutos
Esta conferencia magistral pertenece al Módulo 5 “Inteligencia. Fuentes para la investigación” de C1b3rWall Academy 2021/2022. El objetivo de la misma es crear una plantilla para automatizar algunas tareas en la búsqueda de vulnerabilidades con Nuclei.
Una de las principales bondades de Nuclei es su gran comunidad, que nos garantiza la continuidad del software siempre que haya usuarios implicados en él. Gracias a esta comunidad también contamos con plantillas y automatizaciones que nos ahorrarán mucho trabajo y pueden ayudarnos a desbloquearnos con nuestro proyecto. En este artículo veremos la creación de dos plantillas automáticas que nos ayudará bastante.
Ventajas y requisitos de Nuclei
A nivel técnico, es compatible con diferentes protocolos, nos permite crear nuestros propios flujos de trabajo de manera simple y puede ejecutarse en múltiples objetivos con un solo comando. Para ello solo necesitamos un dispositivo compatible y tener el PERMISO de la red en la que lo vamos a lanzar.
Instalación de Nuclei
Podemos instalarlo en GNU/Linux, Windows, Mac OS y ARM desde https://github.com/projectdiscovery/nuclei. En el apartado “Releases” tendremos todas las opciones de descarga disponibles. En el caso de Linux clonamos el repositorio (cd nuclei/v2/cmd/nuclei -> go build -> mv nuclei/usr/local/bin). En el caso de Windows, tras descargarlo, lo ejecutamos con .\nuclei.exe.
Si queremos acceder a la configuración de la herramienta deberemos acceder a $HOME/.condig/nuclei/config/yaml en el caso de Linux y a %USERPROFILE/.config/nuclei/config.yaml. Ahí podremos definir cabeceras, platillas a incluir y excluir, grado de criticidad de las plantillas…
Todas estas plantillas de las que hablamos se encuentran en https://github.com/projectdiscovery/nuclei-templates y se dividen en:
- CVEs
- Vulnerabilidades del DNS
- Vulnerabilidades relacionadas con logins
- Otras
Una vez instaladas, las encontraremos en $HOME/nuclei-templates.
Cómo funciona Nuclei
Cada vez que ejecutamos Nuclei, accede a un servidor con plantillas y se las descarga, cada una con diferentes vulnerabilidades. Esta base de datos es creada por los usuarios.
Utilización de Nuclei
1. El primer paso es determinar un objetivo contra el que vamos a ejecutar Nuclei.
- Si es una sola URL o una lista separada por comas, utilizaremos la flag -u.
- Si es una lista de objetivos, utilizaremos la flag -l.
2. A continuación vamos a determinar las plantillas que vamos a utilizar en dicho escaneo.
- Podemos indicarle a la plantilla que queremos utilizar el directrio donde están dichas plantillas con la flag -t (o menos templates).
- Podemos indicarle a nuclei que queremos validar nuestras plantillas con la flag -validate.
- Podemos ejecutar solamente plantillas que cumplan determinadas condiciones con filtros como -tags, -include-tags, -exclude-tags, -include-templates -severity, -impact o -author.
3. Podemos escribir la salida de Nuclei a un archivo mediante la flag -o.
- Puedes elegir que la salida sea en markdown con la flag -me.
- Puedes activar el verbose con la flag -v.
- Puedes hacer que solo salga lo que encuentre con -silent.
Para hacer esta plantilla utilizaremos el repositorio de GitHub Vulhub (https://github.com/vulhub/vulhub). Este contiene diferentes contenedores de Docker que puedes lanzar y estos tienen alguna vulnerabilidad y si lanzamos Nuclei contra ese contenedor detectaremos que tiene vulnerabilidades. Tras alternativas podrían ser Metasploitable o VulnHub.
Apartados de las plantillas
Todas las plantillas que vayamos a utilizar deben tener diferentes secciones definidas en el archivo YAML.
- ID: El identificador aparecerá en nuestra salida si se encuentra alguna vulnerabilidad. Si metemos palabras al azar, quizá cuando encuentre una vulnerabilidad no sabemos a qué se refiere. En el ID puedes poner el CVE o algo más descriptivo para ti.
- Bloque info: El bloque de información contiene algunos datos como el nombre de la plantilla, el autor, el nivel de criticidad, la descripción de la vulnerabilidad, referencias o etiquetas.
- Bloque de peticiones: En él pueden definirse de dos formas, en la forma “raw” y en diferentes secciones que definen el método, ruta y condiciones. Es preferible el segundo método ya que definiremos mejor nuestros parámetros.
Definiremos el método (GET, POST, PUT y DELETE), la ruta (a la que va a intentar acceder. Si metemos {{BaseURL}} se reemplaza automáticamente por el objetivo) y matchers (que son las condiciones que evalúa Nuclei para determinar si se encuentra presente dicha vulnerabilidad. Pueden ser AND o OR).
Creación de plantilla
Vamos a crear dos plantillas, una que verificará que existe el fichero robots.txt y otra para la vulnerabilidad CVE-2017-9841.
Robots.txt
Las primeras preguntas que deberíamos hacernos podrían ser: ¿Cómo verificamos que existe el fichero robots.txt? ¿Qué compone un fichero robots.txt? Y ¿hay algún mensaje que generalmente aparezca? Así definiremos un ID, el bloque de información y el bloque de peticiones.
En la terminal de Linux crearemos un nuevo documento (puedes definir antes la localización o crear una nueva carpeta) con el comando nano C1b3rWall-robots.yml. Sustituye C1b3rWall-robots por el nombre que prefieras.
En id: escribiremos C1b3rWall-Robots, pero, como hemos dicho, escribe algo útil para ti. En el apartado info, debe estar contenido el name, author, severity, description, reference y tags. En nuestro caso en name pondremos C1b3rWall Robots Plantilla. En author escribimos el nombre del autor, rmateus y en severity pondremos info. En description describimos brevemente lo que hace, en este caso comprueba que existe un fichero robots.txt en la página web objetivo. En reference escribimos https://cwe.mitre.org/data/definitions/200.html. En tags ponemos las etiquetas adecuadas, como cwe-200 o robots.
El siguiente apartado es el de requests. En él escribiremos - method: GET, path: *{{BaseURL}}/robots.txt*. Después definimos las condiciones de las coincidencias con matchers-conditions: and. El primer match será type: status- status: 200. Lo siguiente sería un type: word. Las words podrían ser robots, disallow, sitemap o user-agent. También añadimos una condición para que no sea necesario que tenga todas. Por tanto, escribimos condition: or y determinamos que lo encuentre en el body con part: body. Así, la plantilla Robots estaría lista, quedaría tal que así:
info:
name: C1b3rWall Robots Plantilla
author: rmateus
severity: info
description: Comprueba que existe un fichero robots.txt en la página web objetivo.
reference: https://cwe.mitre.org/data/definitions/200.html
tags: cwe-200, robots, c1b3rwall
requests:
- method: GET
path:
- "{{BaseURL}}/robots-txt"
matchers-conditions: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "robots"
- "Disallow"
- "Sitemap"
- "User-Agent"
condition: or
part: body
Si la ejecutamos con la URL de destino, nos dice si ha encontrado robots.txt en ella.
CVE-2017-9841
Para esta vulnerabilidad utilizaremos un contenedor de Vulhub. Si ya tienes el Docker instalado, ejecuta dentro del repositorio: $ cd phpunit/CVE-2017-9841/ → $ docker-compose build → $ docker-compose up -d.
Igual que antes, creamos en la terminal un archivo con nano y lo nombramos. Lo primero es ponerle el identificador.
En el bloque de info, lo mismo que antes: name, author, severity, description, reference y tags. En este caso, tenemos que indicar que lance la petición GET a varios directorios, para ello, en el path indicamos las diferentes rutas
"{{BaseURL}}/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
"{{BaseURL}}/yii/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
"{{BaseURL}}/lavarel/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
"{{BaseURL}}/lavarel52/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
"{{BaseURL}}/lib/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
"{{BaseURL}}/zend/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”.
Es decir, metemos la URL y las posibles carpetas donde pudiera estar.
A continuación, en el body, queremos que le mande la cadena ‘’. Con esto mandamos la petición GET y a la vez mandamos la cadena. El echo va a imprimir el md5, por tanto, ponemos un condition que verifique si está o no: si está la vulnerabilidad se cumple, si no está, no.
Esta vulnerabilidad consiste en lanzar una petición POST al Util/PHP/eval-stdin.php que contenga un cuerpo que empiece por “. La plantilla quedaría así:
info:
name: Comprobación de PHPUNIT
author: rmateus
severity: info
description: Comprueba si la vulnerabiridad del PHP Unit del CVE-2017-9841 se encuentran presentes.
tags: information, C1b3rWall, phpunit, cve-2017-9841
requests:
- method: GET
path:
- "{{BaseURL}}/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
- "{
{BaseURL}}/yii/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”,
-
"{{BaseURL}}/lavarel/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
-
"{{BaseURL}}/lavarel52/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
-
"{{BaseURL}}/lib/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
-
"{{BaseURL}}/zend/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php”
body: ''
matchers-conditions: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "6dd70f16549456495373a337e6708865"
part: body
Te animamos a contribuir con el proyecto de Nuclei con plantillas para la comunidad y que ayudes a los usuarios que puedan tener dudas en el canal de discord de Project Discovery.
¿Todavía no formas parte de C1b3rWall Academy? El contenido es gratuito, únete a otras 30.000 personas desde este enlace.
Si te interesa este tema, puedes consultar la información y cursar el Máster en Ciberseguridad o ver la oferta de másteres desde aquí.
Ponente: Rafael Mateus Marques
Rafael es pentester en Hack by Security y estudiante de Ingeniería Informática de la Universidad Complutense de Madrid. Es miembro de comunidades como HackMadrid%27 y LibreLabMadrid así como ponente en DebConf, FliSol Ecuador, Tapas et Hacks y otros.
¿Cuál es tu reacción?