17 de febrero de 2012

Bash Script: Automatizando el escaneo de dominios

Como comentaba en uno de los últmos post, o si me siges en Twitter lo puedes comprobar, últimamente ando leyendo todo lo que encuentro sobre programación y sobre todo en Python. En esta ocasión les traigo un pequeño script Bash que realicé como práctica del curso Introduction to Pentest Scripting y que con el permiso de mi querido amigo Roberto Martinez paso a comentar.

Manos a la masa

Introducción

El script básicamente toma un nombre de dominio y lo utiliza para obtener un listado de nombres relacionados con nuestro objetivo para realizar un escaneo con la herramienta Nmap. Sencillo no? En la siguiente imagen teneis un pequeño esquema del funcionamiento.


Como se puede apreciar, tenemos varias opciones a la hora de recopilar los nombres relacionados con nuestro dominio objetivo. El script utiliza el comando wget, Bing con el operador IP y el buscador Shodan utilizando hostname como parámetro de búsqueda. Comentar en este punto que la búsqueda de Bing es una modificación del script bing-ip2host que se licencia bajo GPL versión 3.

Una vez tenemos el listado de nombres de dominio, utilizamos la herramienta dig para resolver la dirección IP de éstos y pasarlos a Nmap para que nos realice el escaneo. El script no contempla todas las opciones que Nmap nos permite, pero sí las más básicas e importantes. Podemos realizar varios tipos de escaneo: SYN (-sS), ACK (-sA), UDP (-sU) y por Ping (-sn) y la salida generada la podremos guardar en formato normal (-oN), grepeable (-oG) o XML (-oX).


Como se puede ver en la ayuda del script, en caso de lanzarse el comando sin opciónes utilizará los valores por defecto para cada una. Utilizará todos los métodos para obtener los nombres de dominios relacionados, realizará un escaneo de pines y guardará la salida en formato XML.


Si lanzamos el script sin argumentos nos saca un error por pantalla indicando que es necesario un nombre de dominio válido y nos muestra la aydua del mismo.


El script generará dos archivos de texto uno para los nombres de dominio obtenidos, domains.lst, y otro con las IPs que los resuelven, ipaddress.lst.


Comprobaciones

Para esta primera prueba voy a explayarme un poco y utilizaremos todos los métodos de búsqueda para comprobar que obtenemos un listado único de nombres de dominio así como de las IPs que los resuelven. El resto de opciones las mantendremos por defecto.

* Opción wget: Básicamente descargamos y recorreremos el index del dominio objetivo en búsca de enlaces que apunten a otros subdominios.
./domain2nmap.sh -r wget www.cnn.com

* Opción bing: En este caso utilizamos el buscador Bing con el operador hostname para obtener un listado de dominios asociados a la IP que buscamos.
./domain2nmap.sh -r bing www.cnn.com

* Opción shodan: Vamos a lanzar una consulta por hostname al buscador Shodan y nuevamente a generar un listado con los dominios obtenidos.
./domain2nmap.sh -r shodan www.cnn.com

* Opción all: Esta es la opción por defecto y utiliza los métodos anteriores para generar la lista de dominios.
./domain2nmap.sh [-r all] www.cnn.com

Como podeis observar en las siguientes capturas, si juntamos los archivos obtenidos anteriormente, ordenamos y quitamos los repetidos. Obtenemos el mismo número de elementos que utilizando la búsqueda por defecto. Parece que no funciona mal al fin y al cabo : )



Pruebas varias

* Dominio: www.abc.com
* Busqueda: Bing
* Escaneo: Syn
* Salida: Grepeable

Vamos a generar un reporte en formato grepeable (filtrable) de un escaneo SYN realizado a las IPs que resolvamos de los dominios relacionados utilizando el buscador Bing.
./domain2nmap.sh -r bing -s S -o grep www.abc.com

* Dominio: www.hoy.es
* Busqueda: All (Default)
* Escaneo: Ping (Default)
* Salida: XML (Default)

En este caso vamos a lanzar el script sin opciones para que utilice los valores por defecto. Va a guardarnos un archivo XML de un escaneo de pines a todas las IPs de los nombres de dominios obtenidos a partir de todos los métodos de búsqueda: wget, Bing y Shodan.
./domain2nmap.sh www.hoy.es

Conclusiones

Éste script es un ejemplo de cómo obtener información acerca de un dominio tanto pasiva como activa dentro de la fase de information gathering, en la que descubrir la máxima información posible sobre el objetivo. Las consultas al buscador Bing se basan en el trabajo de Andrew Horton con su script bing-ip2host que se licencia bajo GPLv3 al igual que los contenidos del blog, salvo sea contrario a lo dicho en el artículo.

El código completo del script lo puedes encontrar en el siguiente enlace (domain2nmap.sh), sientete libre de reutilizarlo o mejorarlo, añadirle más opciones, nuevas funciones, etc.

Algunas [posibles/futuras] mejoras serían:

- Buscar también los nombres que utilicen otro TLD (Top Level Domain).
- Pasar a Bing todas las IPs de resolveip.
- Shodan logeado para obtener todas las funciones?
- Wget: búsquedas relacionadas con el dominio (sin TLD).

En algunas pruebas realizadas no ha generado correctamente los archivos de dominios e IPs y falla al realizar el escaneo a objetivos inexitentes. Habría que depurarlo más a fondo y comprobar debidamente el fichero que utiliza Nmap para realizar las pruebas, ipaddress.lst.

No quiero despedirme sin dedicar el post y el script a mi buen maestro Roberto dado que éste se basa en las prácticas de su curso, solo que ampliado y corregido levemente ; ). Muchas gracias Master!

Un saludo, Brixton Cat.

2 comentarios:

  1. Hola.. Brixton_Cat

    Antes que nada felicitarte por tu blog,muy bueno..!!

    He tratado de usar el script, pero me devuelve un error en la línea 72, concretamente este:

    ./domain2nmap.sh: línea 72: resolveip: no se encontró la orden

    No tengo ni idea de programación, asi que te lo comento para ver si puedes arreglarlo, este error lo da con cualquier parámetro que le indique.

    Muchas gracias y saludos !!

    ResponderEliminar
    Respuestas
    1. Buenas Anonimo:

      El problema está en que no encuentra el comando resolveip[1] y es el que utiliza para comprobar que existe ese nombre de dominio. Hay varias alternativas para traducir un nombre de dominio en una IP pero yo ultimamente utilizo dig[2].

      Perdon por no haber contestado antes, pero hace tiempo que no entro ni escribo nada en el blog y no es por falta de temática, pues cada día me surgen más curiosidades para comentar pero los días solo tiene 24 horas : )

      Si encuentro un rato modifico el script para que compruebe si existe el dominio con algúin otro comando o si te parece, corrigelo tu con algún comando que compruebe la existencia de un nombre de dominio ; )

      1-http://linux.die.net/man/1/resolveip
      2-http://linux.die.net/man/1/dig

      Saludos!

      Eliminar

Bienvenid= si quieres dejar un comentario