GoBuster
es un buscador de recursos rápido y versátil ya que nos permite identificar ficheros, directorios, entradas DNS, vhosts o buckets de almacenamiento.
El manual se compone de los siguientes apartados:
- Instalación
- DIR mode
- DNS mode
- VHOST mode
- FUZZ mode
- Amazon S3 buckets
- Google Cloud buckets
- TFTP servers
- STDIN
- Notas finales
Instalación:
El primer paso será instalar el software, podemos hacerlo mediante binarios, go install
o compilando manualmente:
pkg install gobuster
go install github.com/OJ/gobuster/v3@latest
git clone https://github.com/OJ/gobuster.git
cd gobuster
make
Nos bajamos algunas listas de directorios, dominios y nombres de buckets:
wget https://raw.githubusercontent.com/rbsec/dnscan/master/subdomains-10000.txt
wget https://raw.githubusercontent.com/koaj/aws-s3-bucket-wordlist/master/list.txt
DIR mode:
Lanzamos GoBuster con el parámetro dir
:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://nonexistentdomain.com
[+] Method: GET
[+] Threads: 10
[+] Wordlist: directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index (Status: 200) [Size: 55680]
/rss (Status: 200) [Size: 16783]
/img (Status: 403) [Size: 162]
/default (Status: 200) [Size: 55678]
/sitemap (Status: 200) [Size: 40197]
/media (Status: 403) [Size: 162]
/0 (Status: 200) [Size: 55678]
/assets (Status: 403) [Size: 162]
/css (Status: 403) [Size: 162]
/Index (Status: 200) [Size: 55447]
/lib (Status: 403) [Size: 162]
/js (Status: 403) [Size: 162]
/RSS (Status: 200) [Size: 16783]
/api (Status: 200) [Size: 55678]
/SiteMap (Status: 500) [Size: 30565]
/dist (Status: 403) [Size: 162]
/mapa (Status: 403) [Size: 162]
/noticias (Status: 200) [Size: 50580]
/siteMap (Status: 500) [Size: 30565]
/fotos (Status: 200) [Size: 40348]
/Sitemap (Status: 200) [Size: 40197]
/captcha (Status: 500) [Size: 30565]
/Rss (Status: 200) [Size: 16783]
/INDEX (Status: 200) [Size: 55447]
/contacto (Status: 200) [Size: 31773]
/API (Status: 200) [Size: 55680]
Progress: 1273833 / 1273834 (100.00%)
===============================================================
Finished
===============================================================
Hay ocasiones en las que el servidor web responde con códigos que GoBuster considera non-existent:
Error: the server returns a status code that matches the provided options for non existing urls. http://nonexistentdomain.com/5237066a-2070-4858-ab06-c8eac059389f => 500 (Length: 184). To continue please exclude the status code or the length
En estos casos podemos blacklistear el código 500 o las respuestas con longitud 184:
GoBuster también nos permite tunelizar el tráfico por proxys HTTTP o SOCKS5(solo en modo dir
/vhost
):
gobuster dir --help
--proxy string Proxy to use for requests [http(s)://host:port] or [socks5://host:port]
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://nonexistentdomain.com
[+] Method: GET
[+] Threads: 10
[+] Wordlist: directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] Proxy: socks5://127.0.0.1:7783
[+] User Agent: gobuster/3.6
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index (Status: 200) [Size: 55680]
/rss (Status: 200) [Size: 16783]
/img (Status: 403) [Size: 162]
/default (Status: 200) [Size: 55678]
/sitemap (Status: 200) [Size: 40197]
/media (Status: 403) [Size: 162]
/0 (Status: 200) [Size: 55678]
/assets (Status: 403) [Size: 162]
/css (Status: 403) [Size: 162]
/Index (Status: 200) [Size: 55447]
/lib (Status: 403) [Size: 162]
/js (Status: 403) [Size: 162]
/RSS (Status: 200) [Size: 16783]
/api (Status: 200) [Size: 55678]
/SiteMap (Status: 500) [Size: 30565]
/dist (Status: 403) [Size: 162]
/mapa (Status: 403) [Size: 162]
/noticias (Status: 200) [Size: 50580]
/siteMap (Status: 500) [Size: 30565]
/fotos (Status: 200) [Size: 40348]
/Sitemap (Status: 200) [Size: 40197]
/captcha (Status: 500) [Size: 30565]
/Rss (Status: 200) [Size: 16783]
/INDEX (Status: 200) [Size: 55447]
/contacto (Status: 200) [Size: 31773]
/API (Status: 200) [Size: 55680]
Progress: 1273833 / 1273834 (100.00%)
===============================================================
Finished
===============================================================
DNS mode:
Para bruteforcear los posibles subdominios DNS ejecutaremos GoBuster con el parámetro dns
:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Domain: nonexistentdomain.com
[+] Threads: 10
[+] Show IPs: true
[+] Timeout: 1s
[+] Wordlist: subdomains-10000.txt
===============================================================
Starting gobuster in DNS enumeration mode
===============================================================
Found: mail.nonexistentdomain.com [A.B.C.D,a02:1234:4444:700::2031]
Found: www.nonexistentdomain.com [A.B.C.D]
Found: webmail.nonexistentdomain.com [A.B.C.D,a02:1234:4444:700::2031]
Found: ftp.nonexistentdomain.com [A.B.C.D]
Found: admin.nonexistentdomain.com [A.B.C.D]
Found: api.nonexistentdomain.com [A.B.C.D]
Progress: 9985 / 9986 (99.99%)
===============================================================
Finished
===============================================================
Podemos utilizar un servidor DNS en concreto indicando el parámetro -r
:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Domain: nonexistentdomain.com
[+] Threads: 10
[+] Resolver: 1.1.1.1
[+] Show IPs: true
[+] Timeout: 1s
[+] Wordlist: subdomains-10000.txt
===============================================================
Starting gobuster in DNS enumeration mode
===============================================================
Found: mail.nonexistentdomain.com [A.B.C.D,a02:1234:4444:700::2031]
Found: www.nonexistentdomain.com [A.B.C.D]
Found: webmail.nonexistentdomain.com [A.B.C.D,a02:1234:4444:700::2031]
Found: ftp.nonexistentdomain.com [A.B.C.D]
Found: admin.nonexistentdomain.com [A.B.C.D]
Found: api.nonexistentdomain.com [A.B.C.D]
Progress: 9985 / 9986 (99.99%)
===============================================================
Finished
===============================================================
VHOST mode:
En este modo conectará contra la IP del dominio pero irá cambiando el campo Host
de la petición HTTP.
Generamos la lista de subdominios con dominio principal el que nos interesa:
sed “s/$/.$MAINDOMAIN/g” subdomains-10000.txt > vhostlist.txt
Lanzamos GoBuster:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://nonexistentdomain.com
[+] Method: GET
[+] Threads: 10
[+] Wordlist: vhostlist.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
[+] Append Domain: false
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: api.nonexistentdomain.com Status: 200 [Size: 2147]
Progress: 9985 / 9986 (99.99%)
===============================================================
Finished
===============================================================
Mediante ngrep podemos ver el vhost que está enviado Host: domaincontrolpanel.nonexistentdomain.com
T 192.168.69.4:21259 -> A.B.C.D:80 [AP]
GET / HTTP/1.1.
Host: domaincontrolpanel.nonexistentdomain.com.
User-Agent: gobuster/3.6.
Accept-Encoding: gzip.
.
NOTA: Este modo también permite el uso de proxys tal como se explicó en el modo dir.
FUZZ mode:
Mediante fuzzing descubriremos ficheros o directorios mediante peticiones mas complejas, tan solo debemos indicar con la palabra FUZZ la parte de la URL a sustituir.
Lanzamos GoBuster:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://nonexistentdomain.com/index.php?p=source&file=FUZZ
[+] Method: GET
[+] Threads: 10
[+] Wordlist: directory-list-2.3-big.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in fuzzing mode
===============================================================
Found: [Status=301] [Length=178] [Word=12] http://nonexistentdomain.com/index.php?p=source&file=12
Found: [Status=301] [Length=178] [Word=warez] http://nonexistentdomain.com/index.php?p=source&file=warez
Found: [Status=301] [Length=178] [Word=full] http://nonexistentdomain.com/index.php?p=source&file=full
Found: [Status=301] [Length=178] [Word=2006] http://nonexistentdomain.com/index.php?p=source&file=2006
Progress: 6 / 7 (85.71%)
===============================================================
Finished
===============================================================
Las peticiones serán similares a esta:
T 192.168.69.4:39851 -> A.B.C.D:80 [AP]
GET /index.php?p=source&file=warez HTTP/1.1.
Host: nonexistentdomain.com.
User-Agent: gobuster/3.6.
Accept-Encoding: gzip.
.
NOTA: Este modo también permite el uso de proxys tal como se explicó en el modo dir.
Amazon S3 buckets:
Los buckets de almacenamiento S3 están hospedados en los servidores de Amazon por lo tanto este tipo de reconocimiento se realiza directamente sobre sus servidores lo que puede llegar a ser problemático.
La idea es añadir al principio y al final de cada una de las palabras de la lista, el nombre del dominio con la esperanza de encontrar un bucket con dicho nombre.
sed "s/$/-$MAINDOMAIN/g" list.txt > s3.txt
sed "s/^/$MAINDOMAIN-/g" list.txt >> s3.txt
Lanzamos GoBuster:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Threads: 10
[+] Wordlist: s3.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
[+] Maximum files to list: 5
===============================================================
Starting gobuster in S3 bucket enumeration mode
===============================================================
Progress: 4754 / 4755 (99.98%)
===============================================================
Finished
===============================================================
En este caso no ha encontrado ningún bucket que coincida con la lista suministrada.
NOTA: Este modo también permite el uso de proxys tal como se explicó en el modo dir.
Google Cloud buckets:
Con los buckets de Google ocurre exactamente lo mismo que con los de Amazon.
La idea es añadir al principio y al final de cada una de las palabras de la lista, el nombre del dominio con la esperanza de encontrar un bucket con dicho nombre.
sed "s/$/-$MAINDOMAIN/g" list.txt > gcs.txt
sed "s/^/$MAINDOMAIN-/g" list.txt >> gcs.txt
Lanzamos GoBuster:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Threads: 10
[+] Wordlist: gcs.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
[+] Maximum files to list: 5
===============================================================
Starting gobuster in GCS bucket enumeration mode
===============================================================
Progress: 4754 / 4755 (99.98%)
===============================================================
Finished
===============================================================
En este caso no ha encontrado ningún bucket que coincida con la lista suministrada.
NOTA: Este modo también permite el uso de proxys tal como se explicó en el modo dir.
TFTP servers:
GoBuster además permite enumerar los ficheros alojados en servidores TFTP:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Server: nonexistentdomain.com:69
[+] Threads: 10
[+] Timeout: 1s
[+] Wordlist: directory-list-2.3-big.txt
===============================================================
Starting gobuster in TFTP enumeration mode
===============================================================
Found: 1
Found: 2
Found: 3
Found: 3
Progress: 1273833 / 1273834 (100.00%)
===============================================================
Finished
===============================================================
STDIN:
Otra funcionalidad muy interesante sobretodo si andamos cortos de espacio es generar las palabras a comprobar mediante alguna herramienta y empiparlas directamente a GoBuster:
Crunch will now generate the following amount of data: 72384 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 18278
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://nonexistentdomain.com
[+] Method: GET
[+] Threads: 10
[+] Wordlist: stdin (pipe)
[+] Negative Status codes: 302
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
Progress: 18278
===============================================================
Finished
===============================================================
Notas finales:
GoBuster es altamente configurable, este nos permite modificar cabeceras HTTP, autenticación HTTP básica, cambiar el user-agent, añadir cabeceras HTTP, modo resume en las wordlists o búsqueda de ficheros de backup entre muchas otras, podemos consultar los parámetros soportados por cada modo del siguiente modo:
gobuster dir --help
gobuster dns --help
gobuster vhost --help
gobuster fuzz --help
gobuster s3 --help
gobuster gcs --help
gobuster tftp --help