Este artículo se centra en Gobuster, una herramienta ofensiva de seguridad ampliamente utilizada en la fase de reconocimiento de información. Exploraremos cómo la herramienta puede enumerar directorios web, subdominios y hosts virtuales.
Preparación del entorno
Para los ejercicios prácticos, utilizaremos una máquina virtual Ubuntu 20.04 proporcionada por TryHackMe como servidor web objetivo. Este servidor está configurado con múltiples subdominios y hosts virtuales, e incluye dos sistemas de gestión de contenido (CMS): WordPress y Joomla.
En este laboratorio, emplearemos la AttackBox proporiconada por TryHackMe, que ya tiene Gobuster instalado, para enumerar directorios y subdominios del servidor objetivo. Si prefieres usar tu propia máquina, necesitarás conectarte a la VPN de TryHackMe e instalar Gobuster manualmente, siguiendo las instrucciones de su repositorio en GitHub.
Para asegurar que los nombres de dominio se resuelvan correctamente en el entorno de laboratorio local, es posible que debas configurar el servidor DNS en tu máquina de ataque. Esto se puede lograr editando el archivo /etc/systemd/resolved.conf.
sudo nano /etc/systemd/resolved.conf
Descomenta la línea DNS= y añade la dirección IP de la máquina objetivo (MACHINE_IP). Luego, reinicia el servicio systemd-resolved.
sudo systemctl restart systemd-resolved
El contenido final del archivo debería verse similar a esto:
[Resolve]
DNS=MACHINE_IP
#FallbackDNS=
#Domains=
Introducción a Gobuster
Gobuster es una herramienta ofensiva de código abierto escrita en Go. Utiliza listas de palabras para realizar ataques de fuerza bruta y enumerar directorios web, subdominios DNS, hosts virtuales, buckets de Amazon S3 y Google Cloud Storage. Es una herramienta popular entre los profesionales de seguridad para pruebas de penetración y evaluaciones.
Es importante distinguir entre dos conceptos clave que aplica esta herramienta:
- Enumeración: El acto de listar todos los recursos disponibles, como directorios en un servidor web.
- Fuerza bruta: El método de probar sistemáticamente todas las combinaciones posibles de una lista, similar a probar cada llave en un candado.
Resumen de la herramienta
La página de ayuda de Gobuster (gobuster --help) proporciona una visión general de sus capacidades. Los comandos principales para nuestro propósito son:
dir: Para la enumeración de directorios y archivos web.dns: Para la enumeración de subdominios DNS.vhost: Para la enumeración de hosts virtuales.
Varios flags son comunes a múltiples modos:
| Flag | Descripción |
|---|---|
-t, --threads |
Número de hilos concurrentes (por defecto 10). Ajustar según los recursos del sistema. |
-w, --wordlist |
Ruta al archivo de diccionario. |
--delay |
Tiempo de espera entre peticiones para evadir detección. |
-o, --output |
Archivo donde guardar los resultados. |
Ejemplo de uso básico para enumerar directorios:
gobuster dir -u "http://objetivo.ejemplo/" -w /ruta/al/diccionario.txt -t 50
Caso de uso: Enumeración de directorios y archivos
El modo dir de Gobuster permite descubrir la estructura de directorios y archivos de un sitio web. Es común que las aplicaciones web tengan rutas predecibles (e.g., /admin, /backup), lo que las hace vulnerables a este tipo de escaneo.
Flags específicos del modo dir
| Flag | Descripción |
|---|---|
-c, --cookies |
Cookies a enviar con cada petición (ej. ID de sesión). |
-x, --extensions |
Extensiones de archivo a buscar (ej. .php, .js). |
-k, --no-tls-validation |
Omite la validación de certificados SSL/TLS. Útil para entornos con certificados autofirmados. |
-s, --status-codes |
Mostrar solo respuestas con códigos de estado específicos (ej. 200, 301). |
-r, --follow-redirect |
Seguir redirecciones HTTP (códigos 301, 302). |
Ejemplo práctico
Para escanear el sitio http://sitio.ejemplo buscando archivos .php y .js, ignorando errores de certificado:
gobuster dir -u "http://sitio.ejemplo" -w /usr/share/wordlists/dirb/common.txt -x .php,.js -k
Este comando generará peticiones como http://sitio.ejemplo/login.php, http://sitio.ejemplo/config.js, etc., y reportará los que devuelvan un código de estado 200 (Encontrado).
Caso de uso: Enumeración de subdominios DNS
El modo dns se utiliza para descubrir subdominios asociados a un dominio principal. Es crucial porque un subdominio puede albergar versiones vulnerables de una aplicación o servicios no seguros que no existen en el dominio principal.
Flags específicos del modo dns
| Flag | Descripción |
|---|---|
-d, --domain |
Dominio objetivo a enumerar. |
--show-ips |
Muestra las direcciones IP a las que resuelve cada subdominio. |
--resolver |
Especifica un servidor DNS personalizado para la resolución. |
Ejemplo práctico
Para enumerar subdominios del dominio ejemplo.thm:
gobuster dns -d ejemplo.thm -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt --show-ips
La herramienta realizará consultas DNS como www.ejemplo.thm, mail.ejemplo.thm, ftp.ejemplo.thm, etc., e informará de los que existan junto con sus direcciones IP.
Caso de uso: Enumeración de hosts virtuales (vhost)
Los hosts virtuales (vhosts) permiten alojar múltiples sitios web en un mismo servidor físico y dirección IP. La herramienta distingue entre un subdominio (resuelto vía DNS) y un vhost (resuelto internamente por el servidor web al analizar el encabezado Host de la petición).
Diferencia entre modos dns y vhost
- El modo
dnsconsulta servidores DNS para encontrar registros A o CNAME. - El modo
vhostenvía peticiones HTTP directamente al servidor web, variando el encabezadoHosten cada una.
Flags específicos del modo vhost
| Flag | Descripción |
|---|---|
-u, --url |
URL base del servidor objetivo (generalmente la IP). |
--domain |
Dominio base a adjuntar a las entradas del diccionario para formar el nombre del host (ej. ejemplo.thm). |
--append-domain |
Indica a Gobuster que adjunte el dominio configurado a cada palabra del diccionario. |
--exclude-length |
Excluye respuestas con un tamaño de cuerpo específico. Es útil para filtrar falsos positivos que suelen tener respuestas de error de tamaño constante. |
Ejemplo práctico
Para buscar vhosts en la IP 10.10.10.5 que respondan como subdominios de ejemplo.thm:
gobuster vhost -u "http://10.10.10.5" --domain ejemplo.thm -w /ruta/a/diccionario.txt --append-domain --exclude-length 300
Gobuster enviará peticiones con un encabezado Host como:
Host: web.ejemplo.thm
Host: api.ejemplo.thm
Host: portal.ejemplo.thm
Y reportará aquellos que devuelvan una respuesta HTTP 200 (OK), lo que indica que el servidor está configurado para servir ese host virtual.