Cómo usar Gobuster para enumerar directorios web: guía completa para pentesters
> Disclaimer legal: Todo lo descrito en este artículo aplica exclusivamente a sistemas con autorización explícita por escrito: HackTheBox, TryHackMe, laboratorios propios o entornos de staging con permiso del propietario. Escanear sistemas sin autorización es ilegal en la mayoría de jurisdicciones.
Tabla de contenidos
- ¿Qué es Gobuster y por qué usarlo?
- Instalación y verificación
- Tabla de flags de referencia rápida
- Comandos por escenario
- Wordlists recomendadas
- Modo DNS: enumeración de subdominios
- Errores comunes y cómo evitarlos
- Limitación real que la mayoría omite
- Próximos pasos
- FAQ
Aprender cómo usar Gobuster para enumerar directorios web es una de las habilidades más prácticas que puedes desarrollar como pentester. Si llevas tiempo en esto, ya sabes que la enumeración web es donde se gana o se pierde una intrusión: puedes tener el exploit más sofisticado del mundo, pero si no encuentras el endpoint correcto, no llegas a ningún lado. Gobuster es la herramienta que uso en el 90% de mis reconocimientos web, y no porque sea la única opción, sino porque entiendes exactamente qué está haciendo, cuándo falla y por qué.
Este artículo no es el típico «instala gobuster, ejecuta este comando, listo». Vas a aprender la tabla completa de flags con casos de uso reales, comandos categorizados por escenario (CTF vs. aplicación real vs. entorno con WAF), y la sección que más falta hace en internet: los errores que te van a costar una hora si no los conoces de antemano.
Qué necesitas antes de empezar:
- Kali Linux, Parrot OS o cualquier distro Linux con capacidad de instalar Go — revisa las mejores aplicaciones de ciberseguridad en Ubuntu si estás montando tu entorno desde cero
- Conocimiento básico de HTTP: códigos de estado, qué es un GET request, qué significa un redirect 301 vs. 302
- Acceso a plataformas de práctica legal: HackTheBox, TryHackMe, o un servidor web propio en laboratorio local
Tiempo real para completar este proceso: Una enumeración básica tarda entre 2 y 15 minutos dependiendo del tamaño de la wordlist y el delay del servidor. Configurar tu flujo de trabajo inicial con Gobuster te lleva unos 30 minutos la primera vez.
Última actualización: junio 2024 — Gobuster v3.6.0
¿Qué es Gobuster y por qué usarlo para enumerar directorios web?
Gobuster es un escáner de fuerza bruta escrito en Go que trabaja en tres modos principales: dir (directorios y archivos), dns (subdominios) y vhost (virtual hosts). A diferencia de Dirb o Dirbuster, Gobuster no tiene interfaz gráfica, no usa recursión por defecto y está diseñado para ser rápido y predecible.
La razón real por la que prefiero Gobuster sobre Dirb en la mayoría de escenarios tiene que ver con el control de concurrencia. Dirb usa un solo hilo por defecto y su implementación de múltiples hilos es inestable en versiones antiguas — he visto Dirb crashear en servidores con rate limiting agresivo. Gobuster con -t 10 y --delay 200ms te da control quirúrgico sobre la carga que generas, lo que importa mucho cuando el servidor tiene un WAF o cuando estás en un engagement real donde no puedes hacer ruido.
Dirsearch es una alternativa válida y tiene mejor soporte para recursión automática, pero Gobuster gana en velocidad bruta cuando tienes claro lo que buscas. Para CTFs donde el tiempo importa, Gobuster es mi primera opción.
Instalación y verificación de Gobuster
En Kali Linux ya viene preinstalado. Verifica:
bash
gobuster version
gobuster version 3.6.0
Si no lo tienes o necesitas la versión más reciente:
bash
Opción 1: apt
sudo apt update && sudo apt install gobuster
Opción 2: desde Go (para la versión más reciente)
go install github.com/OJ/gobuster/v3@latest
Para SecLists, que es donde viven las mejores wordlists:
bash
sudo apt install seclists
Se instala en /usr/share/seclists/
Si no tienes apt o prefieres el repositorio directamente:
bash
git clone https://github.com/danielmiessler/SecLists.git /usr/share/seclists
Tabla de flags de Gobuster: referencia rápida
Esta es la tabla que tengo pegada en mi segundo monitor. No todas las guías las documentan con contexto real de cuándo usarlas.
| Flag | Descripción | Cuándo usarla |
|——|————-|—————|
| -u | URL objetivo | Siempre. Obligatoria |
| -w | Wordlist | Siempre. Obligatoria |
| -t | Threads (hilos) | Default: 10. Sube a 50 en CTFs, baja a 5 con WAF |
| -x | Extensiones de archivo | Cuando buscas .php, .txt, .bak, .html |
| -o | Output a archivo | En engagements reales, siempre guarda el output |
| -s | Status codes válidos | Default: 200,204,301,302,307,401,403. Modifica según necesidad |
| -b | Status codes a excluir (blacklist) | Útil para filtrar 404 personalizados que devuelven 200 |
| --delay | Delay entre requests | Con WAF o rate limiting. Ej: 200ms |
| -r | Seguir redirects | Cuidado: puede ocultar 301s interesantes |
| -k | Skip TLS verification | HTTPS con certificado self-signed |
| -H | Header personalizado | Para pasar cookies, tokens, o User-Agent |
| -c | Cookie | Autenticación por cookie |
| -a | User-Agent | Cambiar el UA por defecto |
| --timeout | Timeout por request | Default: 10s. Baja en redes rápidas |
| -e | Expanded mode | Muestra la URL completa en el output |
| -n | No status | Omite el status code del output |
| -q | Quiet mode | Solo muestra resultados, sin banner |
| --wildcard | Forzar scan con wildcard | Cuando el servidor responde a cualquier path con 200 |
| -z | No progress | Desactiva la barra de progreso (útil para pipes) |
| --exclude-length | Excluir por longitud de respuesta | Filtrar falsos positivos con respuestas idénticas |
Cómo usar Gobuster para enumerar directorios web: comandos por escenario
Escenario 1: CTF estándar — primera enumeración rápida
Cuando entro a una máquina nueva en HackTheBox, este es mi primer comando para enumerar directorios web con Gobuster. Quiero resultados rápidos con una wordlist mediana:
bash
gobuster dir \
-u http://10.10.11.25 \
-w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \
-t 50 \
-x php,html,txt \
-o gobuster_initial.txt
Output real de una máquina de práctica:
===============================================================
Gobuster v3.6.0
by OJ Reeves (@TheColonial) & Christian Meike (@firefart)
===============================================================
[+] Url: http://10.10.11.25
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.6.0
[+] Extensions: php,html,txt
[+] Timeout: 10s
===============================================================
Starting gobuster in directory/file enumeration mode
===============================================================
/index.php (Status: 200) [Size: 4523]
/login.php (Status: 200) [Size: 1832]
/admin (Status: 301) [Size: 312] [–> http://10.10.11.25/admin/]
/uploads (Status: 301) [Size: 314] [–> http://10.10.11.25/uploads/]
/config.php (Status: 200) [Size: 0]
/robots.txt (Status: 200) [Size: 67]
/.htaccess (Status: 403) [Size: 277]
Progress: 882240 / 882244 (100.00%)
===============================================================
Finished
===============================================================
El config.php con size 0 es interesante — generalmente significa que el archivo existe pero no devuelve contenido visible. Vale la pena revisarlo con otras técnicas.
Escenario 2: Aplicación con autenticación — enumerar detrás del login
Cuando ya tienes credenciales o una sesión activa y quieres enumerar rutas autenticadas:
bash
gobuster dir \
-u http://10.10.11.25/admin/ \
-w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
-t 20 \
-x php,html \
-c «PHPSESSID=abc123def456; security=low» \
-H «Authorization: Bearer eyJhbGciOiJIUzI1NiJ9…» \
-o gobuster_auth.txt
Escenario 3: Enumerar directorios web con Gobuster en servidores con WAF o rate limiting
Cuando el servidor empieza a devolver 429 o los resultados son inconsistentes, bajas los hilos y añades delay:
bash
gobuster dir \
-u https://target.example.com \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-t 5 \
–delay 300ms \
-k \
-a «Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36» \
-o gobuster_waf.txt
El -k es para ignorar errores de certificado TLS. El User-Agent personalizado ayuda a evadir WAFs básicos que bloquean el string gobuster/3.x.x.
Escenario 4: Enumeración de subdominios con Gobuster (modo DNS)
bash
gobuster dns \
-d target.example.com \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-t 30 \
–resolver 8.8.8.8 \
-o gobuster_dns.txt
Escenario 5: Virtual hosts (cuando hay múltiples apps en el mismo IP)
bash
gobuster vhost \
-u http://10.10.11.25 \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-t 30 \
–append-domain \
-o gobuster_vhost.txt
El flag --append-domain añade el dominio base a cada entrada de la wordlist — sin esto, Gobuster prueba las entradas como subdominios en bruto y muchos CTFs fallan en este punto.
Escenario 6: Búsqueda de archivos de backup y configuración
Este es el escenario que más flags ocultos encuentra en CTFs:
bash
gobuster dir \
-u http://10.10.11.25 \
-w /usr/share/seclists/Discovery/Web-Content/raft-large-files.txt \
-x bak,old,orig,backup,conf,config,sql,db,zip,tar.gz \
-t 30 \
-o gobuster_files.txt
Wordlists para Gobuster: cuál usar y cuándo
No todas las wordlists son iguales y elegir mal te hace perder tiempo o resultados.
Para CTFs:
directory-list-2.3-medium.txt— Mi default. 220k entradas, cubre el 95% de CTFsraft-medium-directories.txt— Mejor para aplicaciones modernas (Next.js, React apps)common.txt— Cuando quieres resultados en 2 minutos, no en 15
Para aplicaciones reales:
directory-list-2.3-big.txt— Cuando tienes tiempo y necesitas cobertura máximaraft-large-words.txt— Combina directorios y archivos, bueno para apps con estructura no estándar
Para tecnologías específicas:
/usr/share/seclists/Discovery/Web-Content/CMS/— Wordlists específicas para WordPress, Drupal, Joomlaspring-boot.txt— Para aplicaciones Spring Boot con Actuator endpointsapi/api-endpoints.txt— Para APIs REST
Observación técnica propia: directory-list-2.3-medium.txt está ordenada por frecuencia de aparición en sitios reales, no alfabéticamente. Esto significa que los directorios más comunes aparecen primero en el output — si vas a interrumpir el scan antes de que termine (algo que hago frecuentemente en CTFs con tiempo limitado), esta wordlist te da los mejores resultados en los primeros minutos comparado con raft-medium-directories.txt que está ordenada alfabéticamente y puede tardarse en llegar a entradas como /admin o /backup.
Modo DNS: enumeración de subdominios con Gobuster
El modo DNS de Gobuster es menos conocido pero igual de útil, especialmente en bug bounty y reconocimiento de infraestructura:
bash
gobuster dns \
-d hackthebox.eu \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt \
-t 50 \
–resolver 1.1.1.1 \
-o subdominios.txt
===============================================================
Gobuster v3.6.0
===============================================================
[+] Domain: hackthebox.eu
[+] Threads: 50
[+] Resolver: 1.1.1.1
[+] Wordlist: /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
===============================================================
Found: www.hackthebox.eu
Found: app.hackthebox.eu
Found: forum.hackthebox.eu
Found: cdn.hackthebox.eu
===============================================================
Un punto importante: el modo DNS hace resolución real de DNS, no peticiones HTTP. Si el subdominio resuelve pero no tiene un servidor web activo, igual aparece en los resultados. Siempre valida con curl o httpx los subdominios encontrados.
Errores comunes al usar Gobuster para enumerar directorios web
Error 1: El servidor devuelve 200 para todo (wildcard responses)
Este me costó 45 minutos en una máquina de TryHackMe. El servidor estaba configurado para devolver HTTP 200 con una página de «Not Found» personalizada para cualquier ruta que no existiera. Gobuster reportaba cientos de falsos positivos.
Cómo lo detectas: Todos los resultados tienen exactamente el mismo tamaño de respuesta, o el scan devuelve miles de resultados en segundos.
Cómo lo resuelves:
bash
Primero, identifica el tamaño de la respuesta falsa
curl -s -o /dev/null -w «%{sizedownload}» http://10.10.11.25/estarutanoexiste_123456
Luego excluye ese tamaño específico
gobuster dir \
-u http://10.10.11.25 \
-w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \
–exclude-length 1234 \
-t 30
Si el tamaño varía (respuestas dinámicas con wildcard), usa el flag --wildcard para que Gobuster detecte automáticamente el patrón y lo filtre. Aunque en mi experiencia, --exclude-length da más control.
Error 2: Usar demasiados hilos en un servidor lento
El default de 10 hilos ya puede ser demasiado para un servidor de laboratorio en una VM con poca RAM. Síntoma: empiezas a ver timeouts y el scan se congela. La solución no es reiniciar — es bajar los hilos. Si necesitas ejecutar scans largos sin supervisión, combina esto con [comandos en background usando nohup o tmux](https://hackchest.net/linux/comandos-en-background/):
bash
Si ves esto frecuentemente en el output:
[ERROR] Get «http://10.10.11.25/admin»: context deadline exceeded
Baja los hilos y añade delay
gobuster dir \
-u http://10.10.11.25 \
-w /usr/share/wordlists/dirb/common.txt \
-t 5 \
–delay 100ms \
–timeout 15s
Error 3: Olvidar las extensiones en aplicaciones PHP/ASP
Si escaneas solo directorios sin -x, te pierdes la mitad de los resultados en aplicaciones con archivos individuales. Un /admin puede no existir como directorio, pero /admin.php sí. Para aplicaciones PHP:
bash
-x php,php3,php5,phtml,html,htm,txt,bak,old
Para ASP.NET:
bash
-x asp,aspx,ashx,asmx,config,cs
Error 4: No guardar el output y perder resultados
Suena obvio, pero en el calor de un CTF con tiempo límite, es fácil no usar -o. Si el terminal se cierra o necesitas comparar con un scan posterior, perdiste todo. Para automatizar este tipo de tareas, consulta la guía de Bash scripting para hacking ético. Siempre:
bash
gobuster dir -u http://target -w wordlist.txt -o $(date +%Y%m%d%H%M%S)gobuster.txt
Error 5: Confiar ciegamente en los 403
Un 403 (Forbidden) no significa que el directorio no exista — significa que existe pero no tienes acceso. Muchos pentesters los ignoran, pero un /admin con 403 puede ser accesible con técnicas de bypass de autenticación, headers específicos, o simplemente cambiando el método HTTP. Anota todos los 403 para revisarlos después.
Limitación real de Gobuster que la mayoría de tutoriales omite
Gobuster no hace recursión por defecto y su flag de recursión (-r en modo dir) solo sigue redirects HTTP, no entra automáticamente en subdirectorios encontrados.
Si encuentras /admin/ y quieres enumerar dentro de ese directorio, tienes que lanzar un segundo scan manualmente:
bash
gobuster dir -u http://10.10.11.25/admin/ -w wordlist.txt -t 30
Para recursión automática real, Dirsearch o Feroxbuster son mejores opciones. Feroxbuster en particular está diseñado explícitamente para esto y tiene una sintaxis similar a Gobuster. Lo uso cuando sé que la aplicación tiene estructura de directorios profunda. Para automatizar flujos completos de reconocimiento que incluyan múltiples herramientas, revisa las herramientas para automatizar tareas en Linux:
bash
feroxbuster -u http://10.10.11.25 -w wordlist.txt -x php,html –depth 3
Pero para el primer escaneo rápido sin saber la estructura, Gobuster sigue siendo mi primera opción por velocidad y simplicidad.
Próximos pasos
Si llegaste hasta aquí, ya tienes suficiente para hacer enumeración web seria con Gobuster. Estos son los siguientes artículos que tienen sentido leer ahora:
- Writeup TryHackMe: Salas para principiantes — Si nunca has resuelto un CTF completo, empieza aquí antes de intentar aplicar Gobuster en máquinas complejas. Este writeup cubre el contexto de cuándo y por qué usar enumeración web en un flujo de pentesting real.
- Bash scripting para hacking ético: guía práctica — Automatiza tus scans de Gobuster con scripts que ejecutan múltiples comandos en secuencia, filtran outputs y generan reportes. El script de reconocimiento web que muestro ahí integra Gobuster con Nmap y Whatweb.
- Fuzzing de APIs REST con ffuf: guía práctica — Gobuster en modo
dirno está optimizado para fuzzing de parámetros o endpoints de API. ffuf tiene un sistema de filtros más potente y es la herramienta estándar para este tipo de reconocimiento.
- Reconocimiento web completo: del dominio al shell — Gobuster es una pieza del puzzle. Este artículo cubre el flujo completo: Nmap → Whatweb → Gobuster → Nikto → explotación, con ejemplos de máquinas reales de HackTheBox.
FAQ sobre Gobuster para enumerar directorios web
¿Cuál es la diferencia entre Gobuster y ffuf para enumerar directorios web?
Ambos hacen fuerza bruta de rutas HTTP, pero ffuf tiene un sistema de filtros mucho más potente (por tamaño, palabras, líneas, regex) y está optimizado para fuzzing de parámetros. Gobuster es más simple y rápido para enumeración directa de directorios. Para un primer scan de directorios, Gobuster. Para fuzzing fino de parámetros o cuando tienes muchos falsos positivos, ffuf.
¿Por qué Gobuster no encuentra directorios aunque sé que existen?
Las causas más comunes son: wordlist incorrecta para la tecnología (usando wordlist de directorios genéricos en una app WordPress), falta de extensiones (-x), el servidor devuelve 200 para todo (wildcard — ver sección de errores), o el directorio requiere autenticación y no estás pasando la cookie. Verifica cada uno en ese orden.
¿Qué wordlist usar con Gobuster cuando no sé qué tecnología corre el servidor?
/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt combinado con /usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt. Si tienes tiempo, lanza whatweb o revisa las cabeceras HTTP primero — un X-Powered-By: PHP/7.4 o un Server: Apache ya te dice qué extensiones añadir con el flag -x.
¿Cuántos hilos usar en Gobuster para enumerar directorios web sin ser detectado?
Depende del entorno. En CTFs: 50 hilos sin problema. En aplicaciones reales con WAF: empieza con 5 hilos y --delay 300ms. En servidores de laboratorio lentos: 10 hilos con --delay 100ms. La regla general es: si empiezas a ver errores de timeout o respuestas 429, reduce a la mitad y añade delay.

