Introducción
Nikto es un popular escáner de servidores web de código abierto que realiza pruebas exhaustivas contra servidores web para múltiples elementos, incluyendo más de 6700 archivos/programas potencialmente peligrosos, verifica versiones desactualizadas de más de 1250 servidores y problemas específicos de versión en más de 270 servidores.
A veces, una aplicación web requiere que una cabecera HTTP específica esté presente en las solicitudes. Esto podría ser para autenticación (como una clave API o un token de sesión), para enrutar a una versión específica de una aplicación, o para habilitar un modo de depuración. Los escaneos estándar de Nikto fallarían o serían incompletos en estos escenarios porque carecerían de la cabecera requerida.
En este laboratorio, aprenderá a utilizar la opción -addheaders de Nikto para incluir cabeceras personalizadas en sus escaneos. Esto le permite probar aplicaciones que tienen requisitos de cabecera específicos, asegurando una evaluación de seguridad más completa y precisa.
Identificar una cabecera HTTP personalizada requerida por una aplicación
En este paso, interactuará con una aplicación web simple para comprender por qué una cabecera personalizada podría ser necesaria. Tenemos un servidor web ejecutándose en el puerto 8000 que requiere una cabecera específica, X-LabEx-Auth, para el acceso.
Primero, intentemos acceder a la aplicación web sin la cabecera personalizada utilizando el comando curl.
curl http://127.0.0.1:8000
Recibirá un mensaje de "Acceso Denegado" (Access Denied), ya que falta la cabecera requerida.
Access Denied
Ahora, enviemos la solicitud nuevamente, pero esta vez incluiremos la cabecera personalizada requerida utilizando la opción -H en curl. La cabecera es X-LabEx-Auth con el valor SecretToken.
curl -H "X-LabEx-Auth: SecretToken" http://127.0.0.1:8000
Esta vez, el servidor concede el acceso y devuelve un mensaje de bienvenida. Esto confirma que la aplicación verifica esta cabecera específica.
Welcome, authorized user! The server is Apache/2.4.1 (Unix).
Este proceso demuestra cómo identificar y confirmar la necesidad de una cabecera personalizada antes de ejecutar un escaneo de seguridad.
Utilizar la opción -addheaders para especificar la cabecera y el valor
En este paso, aprenderá sobre la opción de Nikto que se utiliza para añadir cabeceras personalizadas a sus escaneos.
Ahora que sabemos que se requiere una cabecera personalizada, necesitamos indicarle a Nikto que la incluya en todas sus solicitudes HTTP. Nikto proporciona la opción -addheaders para este propósito.
La sintaxis es sencilla:
-addheaders "NombreCabecera:ValorCabecera"
Reemplace NombreCabecera con el nombre de la cabecera (por ejemplo, X-LabEx-Auth) y ValorCabecera con su valor correspondiente (por ejemplo, SecretToken).
Si necesita añadir múltiples cabeceras personalizadas, puede separarlas con un carácter de nueva línea (\n). Por ejemplo:
-addheaders "Cabecera1:Valor1\nCabecera2:Valor2"
Para nuestro escenario actual, la estructura completa del comando Nikto para escanear la aplicación de destino se vería así. Tenga en cuenta que no estamos ejecutando el comando en este paso; solo lo estamos construyendo para comprender la sintaxis.
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Este comando instruye a Nikto a apuntar al host en http://127.0.0.1:8000 y a añadir la cabecera X-LabEx-Auth: SecretToken a cada solicitud que envíe durante el escaneo.
Ejecutar un escaneo con la cabecera personalizada incluida
En este paso, ejecutará un escaneo de Nikto utilizando la opción -addheaders que acaba de aprender.
Con el comando correcto construido, es hora de ejecutar el escaneo. Esto permitirá a Nikto interactuar con la aplicación como un usuario autorizado, descubriendo potencialmente vulnerabilidades que no son visibles para usuarios no autenticados.
Ejecute el siguiente comando en su terminal:
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Nikto comenzará ahora el escaneo. Dado que cada solicitud incluye la cabecera X-LabEx-Auth: SecretToken, la aplicación web las procesará correctamente. Observe la salida de Nikto. Identificará el servidor y comenzará a probar diversas vulnerabilidades.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ "Allowed HTTP Methods: HEAD, OPTIONS, GET"
+ OSVDB-3233: /: Found a default page.
...
+ 15 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
La conclusión clave es que el escaneo se ejecuta correctamente, mientras que un escaneo sin la cabecera sería bloqueado por la aplicación.
Verificar que la cabecera se está enviando utilizando una herramienta proxy
En este paso, verificará que Nikto está enviando realmente la cabecera personalizada con sus solicitudes. Aunque herramientas profesionales como Burp Suite u OWASP ZAP se utilizan típicamente para esto, podemos simular un proxy con un simple listener de netcat (nc).
Primero, necesita abrir una segunda terminal. Puede hacerlo haciendo clic en el icono "+" en la barra de pestañas del panel de terminal.
En la nueva pestaña de terminal, inicie un listener de netcat en un puerto, por ejemplo, 8888. Este listener simplemente imprimirá cualquier dato que reciba.
nc -l -p 8888
Ahora, vuelva a su pestaña de terminal original. Ejecute el escaneo de Nikto de nuevo, pero esta vez, apúntelo a su listener de netcat en lugar del servidor web real. Esto hará que Nikto envíe su solicitud HTTP a netcat, permitiéndonos inspeccionarla.
nikto -h http://127.0.0.1:8888 -addheaders "X-LabEx-Auth: SecretToken"
Después de ejecutar el comando, cambie rápidamente a la segunda pestaña de terminal donde se está ejecutando netcat. Verá la solicitud HTTP sin procesar enviada por Nikto. Busque la cabecera X-LabEx-Auth: SecretToken en la salida.
GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000001)
X-LabEx-Auth: SecretToken
Accept-Encoding: gzip,deflate
Connection: close
Como puede ver, la cabecera personalizada está incluida en la solicitud. Esto confirma que la opción -addheaders está funcionando como se esperaba.
Ahora puede detener el listener de netcat presionando Ctrl+C en la segunda pestaña de terminal y luego cerrar la pestaña.
Probar vulnerabilidades que requieren cabeceras específicas
En este paso, comprenderá la implicación práctica de seguridad de usar cabeceras personalizadas comparando escaneos con y sin la cabecera.
Muchas vulnerabilidades, como referencias directas inseguras a objetos (IDOR) o fallos de escalada de privilegios, solo existen en secciones autenticadas de una aplicación. Un escaneo que no proporcione la cabecera de autenticación correcta pasará completamente por alto estos problemas.
Para ilustrar esto, primero, ejecute un escaneo de Nikto contra el servidor web sin la cabecera personalizada. Esto simula un escaneo por parte de un atacante no autenticado.
nikto -h http://127.0.0.1:8000
Nikto se ejecutará, pero cada solicitud que envíe recibirá una respuesta de "Acceso Denegado". El escáner no puede analizar correctamente la aplicación porque no puede superar la comprobación de autorización inicial. Los resultados de dicho escaneo tienen un valor limitado.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ "Allowed HTTP Methods: GET, HEAD, OPTIONS"
+ OSVDB-3233: /: The site returned a 403 Forbidden, this may indicate that it's a default file.
...
Al comparar esto con el escaneo exitoso que ejecutó en el Paso 3 (que utilizó la cabecera), puede ver la diferencia. El escaneo con la cabecera personalizada pudo interactuar con la lógica central de la aplicación (como lo indica el mensaje "Welcome" que vimos con curl) y realizar pruebas significativas. El escaneo sin la cabecera se detuvo en la puerta de entrada.
Esto resalta la importancia de usar cabeceras personalizadas para garantizar que sus escaneos de vulnerabilidades sean lo más completos posible.
Resumen
En este laboratorio, ha aprendido una técnica crucial para realizar evaluaciones efectivas de seguridad de aplicaciones web con Nikto.
Ha logrado con éxito:
- Identificar el requisito de una aplicación para una cabecera HTTP personalizada utilizando
curl. - Aprender la sintaxis de la opción
-addheadersde Nikto. - Realizar un escaneo de Nikto que incluía una cabecera personalizada para obtener acceso autorizado.
- Verificar que la cabecera personalizada se estaba enviando correctamente utilizando un listener de
netcat. - Comprender cómo los escaneos con cabeceras personalizadas pueden descubrir vulnerabilidades que de otro modo se pasarían por alto.
Esta habilidad es esencial para cualquier profesional de la seguridad, ya que permite pruebas más exhaustivas de aplicaciones web modernas y complejas que dependen de cabeceras para la autenticación, la gestión del estado y otras funciones.


