VHostScan: herramienta para enumerar virtual hosts

Ya sabéis que los Virtual Hosts nos permiten servir diferentes sitios usando la misma IP. El servidor web identifica qué contenido debe servir en base a la cabecera Host que reciba del cliente y, por lo general, también tiene un contenido predeterminado por si la cabecera Host no coincide con ninguno de los hosts virtuales. Para sitios con HTTPS, se utiliza la indicación de nombre de servidor (SNI) porque el handshake del certificado se produce antes de que se envíen las cabeceras.

VHostScan es una herramienta de enumeración de virtual hosts que se puede utilizar con herramientas de pivoting, detectar escenarios de captura (catch-all), alias y páginas predeterminadas dinámicas. Su autor es el pentester autraliano codingo (autor de NoSQLMap entre otras) que la presentó por primera vez en la SecTalks BNE en septiembre de 2017 (slidedeck).

Entre sus características destaca:

- detecta rápidamente contenido único en escenarios catch-all
- localiza valores atípicos en escenarios catch-all donde los resultados tienen contenido dinámico en la página (como el tiempo)
- identifica aliases ajustando la profundidad única de los distintos matches
- admite listas de palabras estándar y una variable para introducir un nombre de host base (por ejemplo, el dev.%s de la lista de palabras se ejecutaría como dev.BASE_HOST)
- funciona sobre HTTP y HTTPS
- tiene capacidad para establecer el puerto real del servidor web para utilizar en los encabezados al pivotar a través de ssh/nc
- agrega cabeceras de respuesta simples para omitir algunos productos WAF


La siguiente tabla muestra una comparativa entre VHostScan y el intruder de Burp Suite y el script http-vhosts de Nmap:


Instalación

$ git clone https://github.com/codingo/VHostScan.git
$ cd VHostScan
$ pip install -r requirements.txt

Uso

$ python VHostScan.py 
+-+-+-+-+-+-+-+-+-+  v. 1.4
|V|H|o|s|t|S|c|a|n|  Developed by @codingo_ & @__timk
+-+-+-+-+-+-+-+-+-+  https://github.com/codingo/VHostScan

usage: VHostScan.py [-h] -t TARGET_HOSTS [-w WORDLISTS] [-b BASE_HOST]
                    [-p PORT] [-r REAL_PORT]
                    [--ignore-http-codes IGNORE_HTTP_CODES]
                    [--ignore-content-length IGNORE_CONTENT_LENGTH]
                    [--unique-depth UNIQUE_DEPTH] [--ssl] [--fuzzy-logic]
                    [--no-lookups] [--rate-limit RATE_LIMIT] [--random-agent]
                    [--user-agent USER_AGENT] [--waf] [-oN OUTPUT_NORMAL] [-]

$ python VHostScan.py -t bank.com


Reenvío de puertos

Si por ejemplo tenemos un port forward con SSH escuchando en el puerto 4444 y redirigiendo el tráfico hacia el puerto 80 en la máquina de desarrollo de example.com, podríamos utilizar lo siguiente para hacer que VHostScan se conecte a través del túnel SSH vía localhost:4444 pero a su vez formatee las cabeceras para adaptarse directamente al puerto 80:

$ VHostScan.py -t localhost -b example.com -p 4444 -r 80

STDIN

Podemos usar el pipe con VHostScan mediante el flag "-":

$ cat bank.htb | VHostScan.py -t 10.10.10.29 -

STDIN y wordlists

También podemos especificar una lista de palabras para usar junto con stdin. En estos casos, la información de lista se añadirá a stdin. Por ejemplo:

$ echo -e 'a.example.com\b.example.com' | VhostScan.py -t localhost -w ./wordlists/wordlist.txt -

Fuzzy Logic

Aquí hay un ejemplo con --fuzzy-logic activado. Se puede ver que la última comparación es mucho más parecida que las dos primeras (está comparando el contenido no los hashes reales):


Proyecto: https://github.com/codingo/VHostScan

Comentarios