lunes, 24 de octubre de 2011

Jugando con VirtualHosts (III): Necromant

Como ya sabéis, los servicios webs tienen la opción de configurar varios hosts virtuales, que contienen diferentes sitios webs en base al nombre de hosts que se utilizó en la URL.

Para que el servicio web sepa que nombre de hosts usamos en la URL, nuestro navegador inserta una cabecera HTTP llamada "Host". Esta cabecera no aparecerá si accedemos directamente a una URL por su IP, pero sí aparecerá si accedemos por ejemplo a http:/www.alcampo.es:

Host: www.alcampo.es

Si un servicio web no tiene configurado ningún host virtual, en ese caso cualquier cabecera host o la ausencia de ella hará que nos devuelva el host por defecto, con lo que en todos los casos devolverá el mismo contenido.

Necromant es una nueva herramienta desarrollada en Pentester.Es para el descubrimiento de hosts virtuales "muertos", de ahí su nombre [Wikipedia], es decir, aquellos hosts virtuales que responden a un nombre de host concreto, pero cuyo nombre DNS no existe o no apunta a su dirección IP, con lo que resultan a priori inaccesibles.

Hay varias situaciones en las que podemos encontrarnos estos hosts virtuales "muertos", como por ejemplo:
  • Servicios web de desarrollo, donde los desarrolladores resuelven manualmente en su ficheros "hosts" local.
  • Servicios web que se encuentran balanceados por algún tipo de dispositivos.
  • Servicios web donde antes se alojaba una web y que se trasladó a otro host, cambiando la resolución DNS, pero sin eliminar el host virtual antiguo.
Encontrar este tipo de hosts virtuales "difuntos" puede ser de mucha utilidad, ya que muchas veces vamos a poder encontrar aplicaciones web antiguas o en desarrollo, saltarnos filtrados por IP utilizando los balanceadores, y mucho más.

Veamos que opciones tiene Necromant:

$ ./Necromant.py 
# Necromant v0.1 - 04/May/2011
# Dead Virtual Host Searcher
# Jose Selvi - jselvi (4.t) pentester (d0.t) es
# http://www.pentester.es
# http://tools.pentester.es/necromant


Usage: ./Necromant.py hostname.list url.list

Como podemos ver, Necromant acepta dos parámetros, una lista de hostnames y otra lista de urls. La información necesaria para completar estos ficheros podemos obtenerla mediante otros métodos, como vimos en anteriores posts [1][2]. La mejor manera de aprender el formato de ambos ficheros es ver un sencillo ejemplo, para ello vamos a elegir un objetivo, por ejemplo la red de hipermercados Alcampo, y vamos a buscar servicios web en sus IPs. La búsqueda real sería mucho más extensa que esta, pero para el ejemplo buscaríamos solo ofrecidos en puertos 80.

# nmap -PN -T4 -open -sS -p 80 -oG alcampo_nmap80.grep 217.140.24.0/24

Tras este escaneo ya podemos crear el fichero alcampo_urls.txt, que tendrá el siguiente contenido:

http://217.140.24.10
http://217.140.24.19
http://217.140.24.23

La herramienta acepta http y https, y acepta también la definición de puertos no estándar, para que podamos incluir los servicios webs en otro tipo de puertos. Ahora solo nos queda crear el fichero alcampo_hosts.txt con los nombres de host que queremos comprobar contra las URLs anteriores:

www.alcampo.com
www.alcampo.es

Ahora que ya tenemos los dos ficheros, solo tenemos que lanzar Necromant y dejarle actuar:

$ ./Necromant.py alcampo_hosts.txt alcampo_urls.txt 
Looking for this HostNames:
- www.alcampo.es
- www.alcampo.com


Looking at this Servers:
- http://217.140.24.10
- http://217.140.24.19
- http://217.140.24.23


Searching hostnames for: http://217.140.24.10
Searching hostnames for: http://217.140.24.19
- www.alcampo.es
- www.alcampo.com
Searching hostnames for: http://217.140.24.23
- www.alcampo.es
- www.alcampo.com


Virtual Hosts Found:
www.alcampo.es:http://217.140.24.19
www.alcampo.com:http://217.140.24.19
www.alcampo.es:http://217.140.24.23
www.alcampo.com:http://217.140.24.23

Como podemos ver, hay dos IPs que responden a los mismos nombres de hosts, a pesar de que el registro DNS solo nos resuelve a uno de ellos:

$ host www.alcampo.es
www.alcampo.es has address 217.140.24.23
$ host www.alcampo.com
www.alcampo.com has address 217.140.24.23

Si configuramos en nuestro fichero de hosts local la resolución de nombres estática apropiada, vamos a poder acceder a estos hosts virtuales en esta IP diferente a la que accederíamos de la forma habitual. A veces puede no aportar ningún tipo de relevancia, y otras veces puede resultarnos MUY útil.

Antes de terminar, me gustaría destacar que la herramienta lo que realiza es un fingerprint del sitio web accedido en base a algunos parámetros, entre ellos el contenido, comparando el resultado del fingerprint entre los nombres de host que buscamos y un hombre de host ficticio. Esto quiere decir que si el único sitio web está configurado como host por defecto, no nos va a detectar ningún nombre de hosts, aunque uno de los que hayamos probado esté ahí, ya que no está "oculto". Quizá en una siguiente versión le añada la posibilidad de que realice un fingerprint accediendo por nombre de host y luego compare, para detectar también donde está cada nombre de host por IP.

Por último, deciros que la herramienta está en estado beta, es decir, puede que os encontréis con algún tipo de falsos positivos. Si os encontráis alguno escribidme un correo, pero antes comprobad verdaderamente que se trata de un falso positivo, porque yo me he encontrado con algunos sitios web que los han configurado por separado y han copiado el contenido del html, pero que han añadido alguna tontería y la web, parece idéntica, pero no lo es.

Como os comentaba, podeis descargar la herramienta de AQUÍ.
Sed buenos.

miércoles, 19 de octubre de 2011

Jugando con VirtualHosts (II): WebSearch

En el post anterior nos quedábamos con una serie rangos de IPs que habíamos sacado de la herramienta theHarvester, pero nos quedábamos con las ganas de sacar todos y cada unos de los hosts virtuales de todo el rango.

Hay muchas herramientas en el mercado que sacan los hosts virtuales a partir de una IP empleando la cache de Bing y su fantástica opción "ip:", pero al menos cuando desarrollé la herramienta WebSearch (que ya presenté hace tiempo) no encontré ninguna a la que le pudiera pasar de forma cómoda un rango completo de IPs y que esta me buscara absolutamente todos los hosts virtuales, así que por ese motivo la desarrolle, y puedo decir que hasta el momento no he encontrado otra herramienta que me guste más para hacer este tipo de descubrimiento.

No entraré en detalles sobre la instalación y manejo porque eso ya lo hice en el anterior post en el que se presentó la herramienta, pero vamos a aplicarlo directamente a los rangos de renfe.es obtenidos de nuestro anterior post:

$ ./WebSearch.py 213.144.32.0-213.144.63.255
Searching hostnames for: 213.144.32.0 (0)
Searching hostnames for: 213.144.32.1 (0)
Searching hostnames for: 213.144.32.2 (0)
Searching hostnames for: 213.144.32.3 (0)
[...]
Searching hostnames for: 213.144.32.153 (0)
Searching hostnames for: 213.144.32.154 (1)
mail.adif.es
Searching hostnames for: 213.144.32.155 (0)
Searching hostnames for: 213.144.32.156 (0)
[...]
Searching hostnames for: 213.144.33.126 (0)
Searching hostnames for: 213.144.33.127 (10100)
www.adif.es
www.estacionesverdes.com
www.videoadif.org
www.videosferrocarril.net
www.abrimoscaminos.org
www.adifvideos.net
www.videosferrocarril.com
www.videosferroviarios.com
www.adif.org.es
www.videosferroviarios.net
[...]

Como podemos ver, después de unos cuantos minutos buscando por todo el rango, encontramos bastantes hosts que no habíamos encontrado en los pasos anteriores (enseño solo unos pocos de ellos), y algunos de ellos de dominios que desconocíamos hasta ahora, pero que evidentemente pertenecen a la misma empresa. Podemos usar estos dominios para volver a usar theHarvester con ellos y volver a empezar el proceso, y así ir enriqueciendo nuestra lista de dominios y nombres de host.

Ahora ya tenemos un montón de nombres de hosts y unos cuantos rangos de IPs donde hay bastantes servicios webs a la escucha y... queda un post más para acabar la serie.

En el próximo post presentamos Necromant.

lunes, 17 de octubre de 2011

Jugando con VirtualHosts (I): theHarvester

Este es el primero de una serie de posts sobre como manejarse con los virtual hosts de un servicio webs, que acabará con la presentación de un pequeño script de cosecha propia, pero que me ha parecido que merecía la pena tomar este tema desde el principio.

Hace algo más de dos años publiqué una herramienta (o pequeño script) en Perl llamado TargetSearch, al que se le pasaba como entrada un dominio y éste buscaba en Google nombres de host cacheados que acabaran en este dominio, con lo que éramos capaces de descubrir nuevos nombres de hosts y rangos de IPs en los que la empresa auditada tiene recursos, aunque las IPs no sean realmente de su propiedad, sino del ISP, o similar.

Hace ya bastante tiempo tuve el impulso de reescribirlo entero en python y cambiar algunas cosas para mejorarlo, ya que con su uso diario me había dado cuenta de bastantes limitaciones, pero tras valorarlo decidí no continuar el desarrollo del script, ya que hay otros desarrollador por otras personas que ofrecen una funcionalidad mayor que este y... ¿para que reinventar la rueda?

De entre las opciones que hay por ahí, a mi la que más me gusta es theHarvester, desarrollada por mi amigo Christian Martorella, y que podéis encontrar tanto en su blog como en distribuciones de seguridad bien conocidas como pueda ser BackTrack.

theHarvester ofrece la posibilidad de buscar subdominios dentro de un dominio a través de Google, al igual que hacía TargetSearch, pero también encuentra otro tipo de información como correos electrónicos, y utiliza más fuentes de datos, como Bing, LinkedIn, y algunos otros. Veamos la ayuda de la herramienta (le quito la cabecera donde pone autor y esas cosas, por claridad):


$ ./theHarvester.py -h
Usage: theharvester options 


       -d: Domain to search or company name
       -b: Data source (google,bing,bingapi,pgp,linkedin,google-profiles,exalead,all)
       -s: Start in result number X (default 0)
       -v: Verify host name via dns resolution and search for vhosts(basic)
       -l: Limit the number of results to work with(bing goes from 50 to 50 results,
            google 100 to 100, and pgp does'nt use this option)
       -f: Save the results into an XML file


Podemos elegir alguna de las fuentes o simplemente elegir "all" para que nos busque en todas las fuentes disponibles. La opción -l nos deja ajustar cuantos resultados va a leer la herramienta antes de parsear los resultados, así que cuanto más alto sea este número más fácil será encontrar la información que buscamos, pero eso se traducirá también en un mayor número de conexiones contra los buscadores, y por lo tanto una mayor lentitud y una mayor probabilidad de ser detectado y/o bloqueado por ellos.

Veamos un ejemplo sencillo de como intentaríamos sacar toda la información posible de, por ejemplo, renfe.es:


$ ./theHarvester.py -d renfe.es -l 200 -b all
Full harvest..
[-] Searching in Google..
Searching 100 results...
Searching 200 results...
Searching 300 results...
[-] Searching in PGP Key server..
[-] Searching in Bing..
Searching 100 results...
Searching 200 results...
[-] Searching in Exalead..
Searching 100 results...
Searching 200 results...
Searching 300 results...


[+] Emails found:
 -------------
SIR@renfe.es
ozramos@renfe.es
antonio.sierra@renfe.es
slozano@renfe.es
Jsagues@renfe.es
internet@renfe.es
grupos@renfe.es
comercial.ext.sir@renfe.es
mdelgadoa@renfe.es
comprasave@renfe.es
jacorral@renfe.es
crodriguez@renfe.es
rgcamus@renfe.es
ciapu17@cosme.renfe.es
cijoua7@cosme.renfe.es
ismiguel@renfe.es
ciapu66@cosme.renfe.es
fgarcia@renfe.es
cigou24@renfe.es
fdelmoral@renfe.es
alorenzo@renfe.es
jvillen@renfe.es
ihorcajo@renfe.es
arocha@renfe.es
didgu01@cosme.renfe.es
vrdid08@renfe.es
@renfe.es


[+] Hosts found
 -----------
80.239.224.25:www.renfe.es
213.144.33.20:w1.renfe.es
213.144.33.35:clubave.renfe.es
213.144.49.9:mail.renfe.es
80.239.224.25:horarios.renfe.es
213.144.49.136:infocer.renfe.es
213.144.33.206:web02.renfe.es
213.144.49.43:dns2.renfe.es
213.144.33.254:ns1.renfe.es
213.144.32.153:ns2.renfe.es
213.144.33.39:w4.renfe.es
213.144.33.20:W1.renfe.es
213.144.34.30:rnessl.renfe.es
213.41.75.72:boletines.renfe.es
213.144.49.35:dns1.renfe.es
213.144.49.59:interesaportal.renfe.es
213.144.33.35:w5.renfe.es
213.144.49.59:tuclubave.renfe.es
213.144.49.59:Tuclubave.renfe.es
80.239.224.25:Www.renfe.es
213.144.50.64:mercancias.renfe.es
213.144.49.9:mail.renfe.es
80.239.224.25:Www.renfe.es
213.144.33.206:web02.renfe.es
213.144.33.35:clubave.renfe.es
80.239.224.25:www.renfe.es
213.144.33.35:w5.renfe.es
213.144.33.206:asista.renfe.es
213.41.75.72:boletines.renfe.es
213.144.33.20:w1.renfe.es
80.239.224.25:Horarios.renfe.es
80.239.224.25:horarios.renfe.es
213.144.49.59:interesaportal.renfe.es


[+] Virtual hosts:
----------------
213.144.33.20:w1.renfe.es
213.144.33.35:clubave.renfe.es
213.144.33.35:w5.renfe.es
213.144.49.9:mail.renfe.es
213.144.49.136:infocer.renfe.es
213.144.33.206:asista.renfe.es
213.144.33.206:web02.renfe.es
213.41.75.72:boletines.renfe.es
213.41.75.72:t.cab09.net
213.41.75.72:grupoplaneta.cab09.net
213.41.75.72:www.help.icrc.org
213.41.75.72:www.tracabilite.org
213.41.75.72:www.initialservices.fr
213.41.75.72:lalettre.promotelec.com
213.41.75.72:dons.lesvillagesdenfants.com
213.41.75.72:info.geoportail.fr
213.41.75.72:gazdefrancedolcevita3.gdfsuez.com
213.41.75.72:don.lesvillagesdenfants.com
213.41.75.72:news.cegid.fr
213.41.75.72:soutenons.fondation-autisme.org
213.41.75.72:info.ign.fr
213.144.49.59:www.enpuntorenfe.es
213.144.49.59:www.enpuntorenfe.com
213.144.49.59:revistaenpunto.com
213.144.49.59:revistaenpunto.es
213.144.50.64:mercancias.renfe.es


De esta salida sacamos diferentes tipos de información:

  1. Listado de cuentas de correo, que nos puede servir tanto para obtener un listado de usuarios válido para posteriormente hacer ataques de diccionario a contraseñas, como para descubrir nuevos dominios desconocidos (un @cosme.renfe.es nos muestra la existencia de este dominio).
  2. Subdominios del dominio que hemos buscado, y algunos otros que estén alojados en los mismos servidores donde se han encontrado. Puede que sean nuevos dominios pertenecientes a la empresa que estamos auditando, o puede que se trate de un hosting compartido y no tengan nada que ver.
  3. Listado de IPs que alojan los nombres de hosts encontrados. A partir de ellos vamos a poder sacar, mediante whois, los rangos completos.

Yo os recomiendo un poco de grepping y awk para separar la información y hacerla más sencilla de manejar:

$ ./theHarvester.py -d renfe.es -l 200 -b all > renfe_theharvester.txt
$ cat renfe_theharvester.txt | grep "@" | grep -v edge-security | awk -F"@" '{print $1}' | sort | uniq > renfe_theharvester_users.txt
$ cat renfe_theharvester.txt | grep "@" | grep -v edge-security | awk -F"@" '{print $2}' | sort | uniq > renfe_theharvester_maildomains.txt
$ cat renfe_theharvester.txt | grep "renfe.es" | grep ":" | awk -F":" '{print $1}' | sort -n | uniq > renfe_theharvester_ips.txt
$ cat renfe_theharvester.txt | grep "renfe.es" | grep ":" | awk -F":" '{print $2}' | sort | uniq > renfe_theharvester_hosts.txt
$ cat renfe_theharvester.txt | grep -v "renfe.es" | grep ":" | grep -v "+" > renfe_theharvester_alternatehosts.txt

Si nos centramos en los rangos de IPs y hacemos whois a alguna de ellas, vemos que podemos reducir la información obtenida a la siguiente:

  • 80.239.224.25 -> 80.239.224.0 - 127 (Akamai)
  • 213.144.32.0 - 213.144.63.255 (Renfe)
  • 213.41.75.72 -> 213.41.75.0 - 255 (Colt)

A pesar de que theHarvester ya nos ha hecho una obtención de hosts virtuales de las IPs encontradas... ¿qué pasa con las IPs de las que no ha encontrado nada pero que están en el mismo rango? Si por ejemplo tuvieramos el dominio renfe.es en una serie de IPs y el dominio renfo.com (inventándomelo) en otra serie de IPs, no encontraríamos nada sobre este dominio.

En el siguiente post veremos como lo haremos.