Escanear un sitio web habilitado para SSL o TLS con Nikto

Kali LinuxBeginner
Practicar Ahora

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, comprobaciones de versiones desactualizadas de más de 1250 servidores y problemas específicos de versión en más de 270 servidores.

Si bien Nikto puede escanear fácilmente sitios web HTTP estándar, el escaneo de sitios que utilizan SSL/TLS (HTTPS) requiere una opción específica. En este laboratorio, aprenderá a utilizar Nikto para escanear un sitio web habilitado para SSL/TLS. Utilizaremos un servidor web seguro alojado localmente para fines de prueba. Aprenderá a iniciar un escaneo SSL, dirigirlo a un puerto específico e interpretar la información relacionada con SSL en los resultados del escaneo.

Identificar un sitio web de destino mediante HTTPS

En este paso, confirmaremos que nuestro servidor web seguro de destino está en funcionamiento y es accesible. El script de configuración para este laboratorio ya ha iniciado un servidor web simple de Python que utiliza SSL/TLS. Está escuchando en localhost en el puerto 4433.

Para verificar que el servidor está en funcionamiento, podemos usar el comando curl. Dado que nuestro servidor utiliza un certificado autofirmado (que no es confiable para una Autoridad de Certificación), debemos usar la opción -k o --insecure con curl para indicarle que proceda a pesar del certificado no confiable.

Ejecute el siguiente comando en su terminal:

curl -k https://localhost:4433

Debería ver el contenido HTML de la página principal del servidor, lo que confirma que el servidor está activo y sirviendo contenido a través de HTTPS.

<html><body><h1>Welcome to the Secure Test Server!</h1></body></html>

Ahora que hemos confirmado que nuestro objetivo está operativo, podemos proceder a escanearlo.

Usar la bandera -ssl para habilitar el modo SSL

En este paso, aprenderemos por qué la bandera -ssl es esencial para escanear sitios HTTPS. Por defecto, Nikto intenta escanear objetivos a través de HTTP estándar en el puerto 80. Si lo dirige a un puerto que espera una conexión SSL/TLS sin especificar que use SSL, el escaneo fallará porque el apretón de manos inicial de la comunicación es incorrecto.

Intentemos ejecutar Nikto contra nuestro servidor seguro en el puerto 4433 sin la bandera -ssl para observar este comportamiento.

nikto -h localhost -p 4433

Verá una salida que indica que no se encontró ningún servidor web, o podría ver un mensaje de error. Esto se debe a que Nikto está intentando comunicarse en HTTP con un puerto que está escuchando para HTTPS.

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
---------------------------------------------------------------------------
+ Start Time:         ...
---------------------------------------------------------------------------
+ ERROR: No web server found on localhost:4433
---------------------------------------------------------------------------
+ 0 host(s) tested

Esto demuestra la necesidad de la bandera -ssl. Esta bandera le indica explícitamente a Nikto que envuelva sus solicitudes web en una capa SSL/TLS, lo que le permite comunicarse con servidores seguros. En el siguiente paso, utilizaremos esta bandera para realizar un escaneo adecuado.

Ejecutar el escaneo contra el objetivo HTTPS

En este paso, realizará un escaneo de vulnerabilidades adecuado contra nuestro servidor web seguro utilizando la bandera -ssl. Al combinar las banderas -h (host), -p (puerto) y -ssl, podemos instruir a Nikto para que se conecte al host y puerto correctos, y para que utilice una conexión SSL/TLS.

Ejecute el siguiente comando en su terminal para iniciar el escaneo:

nikto -h localhost -p 4433 -ssl

Nikto iniciará el escaneo. Dado que nuestro servidor está utilizando un certificado autofirmado, es probable que Nikto muestre una advertencia sobre que el emisor del certificado no es de confianza, lo cual es esperado en este caso. El escaneo procederá entonces.

La salida se verá similar a esta:

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
+ SSL Info:           Self-signed certificate.
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server:             SimpleHTTP/0.6 Python/3.10.12
+ 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
...
+ 1 host(s) tested

Ahora ha escaneado con éxito un sitio web habilitado para SSL con Nikto.

Observar las comprobaciones específicas de SSL en la salida

En este paso, analizaremos la salida del escaneo anterior para identificar información específica de las conexiones SSL/TLS. Cuando se utiliza la bandera -ssl, Nikto no solo escanea vulnerabilidades web generales, sino que también proporciona detalles sobre el certificado y la configuración SSL/TLS del servidor.

Si retrocede en la salida del comando del paso anterior, encontrará información relacionada con el certificado SSL. Para aislar esta información, puede volver a ejecutar el escaneo y usar grep para filtrar la salida. Busquemos la línea "Subject" del certificado.

nikto -h localhost -p 4433 -ssl | grep "Subject"

Este comando volverá a ejecutar el escaneo, pero solo mostrará las líneas que contienen la palabra "Subject".

+ Subject: C=US, ST=California, L=MountainView, O=LabEx, OU=IT, CN=localhost

Esta línea muestra los detalles incrustados en el certificado SSL del servidor, como el País (C), Estado (ST) y Nombre Común (CN). Esta información puede ser útil para verificar la identidad de un servidor durante una evaluación de seguridad. Nikto también verifica la información de cifrado y otras vulnerabilidades relacionadas con SSL, proporcionando una imagen más completa de la configuración del servidor seguro.

Forzar el modo SSL en un puerto no estándar

En este paso, exploraremos cómo "forzar" a Nikto a usar SSL en cualquier puerto, incluso en uno que típicamente maneja tráfico no cifrado. Esto es útil para identificar servicios mal configurados que podrían estar ejecutando HTTPS en un puerto inusual, como 8080.

Primero, necesitamos detener el servidor existente e iniciar uno nuevo en el puerto 8080.

## Stop the previous server
pkill -f "python3 /home/labex/project/https_server/server.py"

## Create a new server configuration for port 8080
cat << EOF > /home/labex/project/https_server/server_8080.py
import http.server
import ssl
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
server_address = ('0.0.0.0', 8080)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='cert.pem',
                               keyfile='key.pem',
                               ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()
EOF

## Start the new server in the background and wait a moment
python3 /home/labex/project/https_server/server_8080.py &> /dev/null &
sleep 3

Ahora, nuestro servidor seguro se está ejecutando en el puerto 8080. Sin la bandera -ssl, Nikto asumiría que este es un puerto HTTP estándar. Al incluir -ssl, lo forzamos a iniciar un handshake TLS.

Ejecute el escaneo contra el puerto 8080:

nikto -h localhost -p 8080 -ssl

La salida será similar a los escaneos anteriores, confirmando que Nikto se conectó exitosamente usando SSL/TLS a un puerto no estándar y realizó sus pruebas.

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        8080
+ SSL Info:           Self-signed certificate.
...

Esto confirma su capacidad para usar Nikto para escanear servicios SSL/TLS en cualquier puerto arbitrario.

Resumen

En este laboratorio, ha aprendido el proceso fundamental de escanear sitios web habilitados para SSL/TLS utilizando Nikto. Comenzó identificando y verificando un servidor HTTPS objetivo. Luego vio de primera mano por qué simplemente apuntar Nikto a un puerto HTTPS falla y aprendió que se requiere la bandera -ssl para habilitar la comunicación SSL/TLS.

Ejecutó con éxito un escaneo contra un servidor seguro, analizó la salida en busca de información específica de SSL, como detalles del certificado, y finalmente, aprendió a forzar el modo SSL en un puerto no estándar. Esta habilidad es crucial para realizar evaluaciones de seguridad exhaustivas en aplicaciones web modernas que dependen de HTTPS para la seguridad.