Bienvenidos a un nuevo post en Byte Mind, en este caso vamos a hablar de Gobuster, una herramienta muy potente y muy utilizada hoy en día para el proceso de enumeración en aplicaciones web, además dejaremos una cheat sheet muy útil para hacer más sencillo el trabajo en esta fase del pentesting. Así que vamos a explicar en que consiste esta herramienta, cómo es posible su instalación, cual es su funcionamiento y también vamos a ver las posibilidades de evitar que hagan estos escaneos a nuestra propia infraestructura.
Índice
Qué es gobuster
Gobuster es una herramienta open source que permite la identificación de contenido web como directorios o ficheros que pudiesen estar accesibles u ocultos en un portal web. Esto lo realiza a través de solicitudes http con un diccionario o por fuerza bruta, y detectará la existencia de las mismas en función del código de respuesta obtenido.
Resumiendo tiene la capacidad de realizar las siguientes enumeraciones:
- URIs (directorios y ficheros) en portales web
- Subdominios DNS con soporte para wildcard
- Nombres de virtual hosts en servidores web
- Buckets S3 de Amazon públicos
Instalación de gobuster
La instalación de gobuster puede realizarse de varias formas.
Si disponemos de una distribución basada en debian podemos hacerlo con apt
1 |
sudo apt install gobuster |
En caso contrario se puede descargar desde su página de github e instalar y compilar con go
1 2 3 4 |
git clone https://github.com/OJ/gobuster.git cd gobuster go get && go build go install |
O hacer todo directamente desde go
1 |
go install github.com/OJ/gobuster/v3@latest |
Ejemplos de uso
Como ya indicábamos se pueden hacer 4 tipos de enumeraciones, de URIs, DNS, vhosts y buckets S3 así que vamos a ver cada una de ellas.
Enumeración de URIs
Para la enumeración de directorios y ficheros utilizaremos la palabra clave dir, que como todo comando tiene su propia ayuda
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ gobuster dir --help Uses directory/file enumeration mode Usage: gobuster dir [flags] Flags: -f, --add-slash Append / to each request -c, --cookies string Cookies to use for the requests -d, --discover-backup Upon finding a file search for backup files --exclude-length ints exclude the following content length (completely ignores the status). Supply multiple times to exclude multiple sizes. -e, --expanded Expanded mode, print full URLs -x, --extensions string File extension(s) to search for -r, --follow-redirect Follow redirects -H, --headers stringArray Specify HTTP headers, -H 'Header1: val1' -H 'Header2: val2' -h, --help help for dir --hide-length Hide the length of the body in the output -m, --method string Use the following HTTP method (default "GET") -n, --no-status Don't print status codes -k, --no-tls-validation Skip TLS certificate verification -P, --password string Password for Basic Auth --proxy string Proxy to use for requests [http(s)://host:port] --random-agent Use a random User-Agent string -s, --status-codes string Positive status codes (will be overwritten with status-codes-blacklist if set) -b, --status-codes-blacklist string Negative status codes (will override status-codes if set) (default "404") --timeout duration HTTP Timeout (default 10s) -u, --url string The target URL -a, --useragent string Set the User-Agent string (default "gobuster/3.1.0") -U, --username string Username for Basic Auth --wildcard Force continued operation when wildcard found Global Flags: --delay duration Time each thread waits between requests (e.g. 1500ms) --no-error Don't display errors -z, --no-progress Don't display progress -o, --output string Output file to write results to (defaults to stdout) -p, --pattern string File containing replacement patterns -q, --quiet Don't print the banner and other noise -t, --threads int Number of concurrent threads (default 10) -v, --verbose Verbose output (errors) -w, --wordlist string Path to the wordlist |
Por ejemplo podemos escanear directorios
1 |
$ gobuster dir -u http://www.example.com/ -w /path/to/dictionary |
Al anterior le podemos indicar el número de hilos que queremos utilizar para que sea más rápido el escaneo
1 |
$ gobuster dir -u http://www.example.com/ -w /path/to/dictionary -t 100 |
O los códigos de respuesta que esperamos obtener
1 |
$ gobuster dir -u http://www.example.com/ -w /path/to/dictionary -t 100 -s 200,301,302,403 |
Si quisiéramos buscar ficheros, tendríamos que añadir la opción -x con las extensiones que se desea buscar, por ejemplo:
1 |
$ gobuster dir -u http://www.example.com/ -w /path/to/dictionary -x php,txt |
Enumeración de DNS
Para la enumeración de subdominios dns utilizaremos la palabra clave dir, que como todo comando tiene su propia ayuda
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ gobuster dns --help Uses DNS subdomain enumeration mode Usage: gobuster dns [flags] Flags: -d, --domain string The target domain -h, --help help for dns -r, --resolver string Use custom DNS server (format server.com or server.com:port) -c, --show-cname Show CNAME records (cannot be used with '-i' option) -i, --show-ips Show IP addresses --timeout duration DNS resolver timeout (default 1s) --wildcard Force continued operation when wildcard found Global Flags: --delay duration Time each thread waits between requests (e.g. 1500ms) --no-error Don't display errors -z, --no-progress Don't display progress -o, --output string Output file to write results to (defaults to stdout) -p, --pattern string File containing replacement patterns -q, --quiet Don't print the banner and other noise -t, --threads int Number of concurrent threads (default 10) -v, --verbose Verbose output (errors) -w, --wordlist string Path to the wordlist |
Veamos un ejemplo de enumeración de subdominios
1 |
$ gobuster dns -d example.com -w /path/to/dictionary -t 100 |
Es posible añadir la opción -i para que muestra la dirección ip del subdominio
1 |
$ gobuster dns -d example.com -w /path/to/dictionary -t 100 -i |
Enumeración de Virtual Hosts
Para la enumeración de virtual hosts utilizaremos la palabra clave vhost, que como todo comando tiene su propia ayuda
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ gobuster vhost --help Uses VHOST enumeration mode Usage: gobuster vhost [flags] Flags: -c, --cookies string Cookies to use for the requests -r, --follow-redirect Follow redirects -H, --headers stringArray Specify HTTP headers, -H 'Header1: val1' -H 'Header2: val2' -h, --help help for vhost -m, --method string Use the following HTTP method (default "GET") -k, --no-tls-validation Skip TLS certificate verification -P, --password string Password for Basic Auth --proxy string Proxy to use for requests [http(s)://host:port] --random-agent Use a random User-Agent string --timeout duration HTTP Timeout (default 10s) -u, --url string The target URL -a, --useragent string Set the User-Agent string (default "gobuster/3.1.0") -U, --username string Username for Basic Auth Global Flags: --delay duration Time each thread waits between requests (e.g. 1500ms) --no-error Don't display errors -z, --no-progress Don't display progress -o, --output string Output file to write results to (defaults to stdout) -p, --pattern string File containing replacement patterns -q, --quiet Don't print the banner and other noise -t, --threads int Number of concurrent threads (default 10) -v, --verbose Verbose output (errors) -w, --wordlist string Path to the wordlist |
Para la enumeración de virtualhost podemos ver un simple ejemplo
1 |
$ gobuster vhost -u http://www.example.com/ -w /path/to/dictionary |
Al cual, entre los ya vistos, podemos añadir autenticación si es necesaria
1 |
$ gobuster vhost -u http://www.example.com/ -w /path/to/dictionary -U username -P password |
O el método GET o POST a utilizar aunque por defecto ya utiliza GET
1 |
$ gobuster vhost -u http://www.example.com/ -w /path/to/dictionary -m POST |
Enumeración de Bucket S3
Para la enumeración de buckets S3 utilizaremos la palabra clave s3, que como todo comando tiene su propia ayuda
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ gobuster s3 --help Uses aws bucket enumeration mode Usage: gobuster s3 [flags] Flags: -h, --help help for s3 -m, --maxfiles int max files to list when listing buckets (only shown in verbose mode) (default 5) --proxy string Proxy to use for requests [http(s)://host:port] --random-agent Use a random User-Agent string --timeout duration HTTP Timeout (default 10s) -a, --useragent string Set the User-Agent string (default "gobuster/3.1.0") Global Flags: --delay duration Time each thread waits between requests (e.g. 1500ms) --no-error Don't display errors -z, --no-progress Don't display progress -o, --output string Output file to write results to (defaults to stdout) -p, --pattern string File containing replacement patterns -q, --quiet Don't print the banner and other noise -t, --threads int Number of concurrent threads (default 10) -v, --verbose Verbose output (errors) -w, --wordlist string Path to the wordlist |
Que podemos ver una forma simple de hacerlo con
1 |
$ gobuster s3 -w /path/to/bucket-dictionary.txt |
Cómo es posible protegerse
Bueno, como se ha visto a lo largo de la entrada, gobuster hace una enumeración en base a los códigos de respuesta HTTP obtenidos durante el proceso, y gracias a esto es capaz de predecir si por ejemplo, existiese un fichero o un directorio.
Visto esto, se comprende que si la aplicación devuelve un código 404 (Not Found) gobuster entenderá que no existe la misma, por lo que si hay páginas que no se desee el acceso, es posible configurar el servidor web para que devuelva dicho código de error si el acceso no se hace desde una IP previamente configurada.
Otra opción a tener en cuenta sería limitar el número de peticiones que se pueden realizar desde una IP en un intervalo de tiempo determinado, lo que podría ayudar a identificar un posible intento de ataque de enumeración.
Bueno, hasta aquí por ahora, espero que les ayude en sus tareas de auditoría y pentesting, y recordar que esto sólo se debe de realizar si el portal es de nuestra propiedad o, si tenemos el consentimiento explícito del propietario del mismo.
Espero que les haya servido de utilidad y cualquier duda, aporte o sugerencia pueden indicarla en la sección de comentarios.