martes, 31 de diciembre de 2013

Buscar subdominios con Google - Script en python


No se cuantas veces durante el año me decía mentalmente voy a programar un script que haga esto porque me aburre hacerlo manualmente y al final lo dejaba para después, me olvidaba y nunca lo hacía. Pero hoy es el último día del año y pa' que me queden menos cosas pendientes aquí está:

#!/bin/python

import sys
import httplib
import re
import urlparse
import time


CONFIG = {
        "google": "www.google.com",
        "port": 443,
        "paginas": 10,
        "delay": 3,
        "agent": "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0",
        "verbose": 3
    }
NORM = "\033[1;92m"
INFO = "\033[1;93m"
ERRO = "\033[1;91m"
ENDM = "\033[0m"


def mensaje(mensaje="Hola Mundo!", verb=1, color=NORM):
    if verb <= CONFIG["verbose"]:
        print color + mensaje + ENDM


def uso():
    print "Uso:\n\t%s <DOMINIO BASE>" % sys.argv[0]
    print "Ej:\n\t%s example.com" % sys.argv[0]
    exit(1)


def buscar(dork="site:example.com", start=0):
    uri = "/search?q=%s&start=%s&filter=0" % (dork, start)

    time.sleep(CONFIG["delay"])
    conn = httplib.HTTPSConnection(CONFIG["google"], CONFIG["port"])
    conn.connect()
    conn.putrequest("GET", uri)
    conn.putheader("User-Agent", CONFIG["agent"])
    conn.putheader("Accept", "*/*")
    conn.endheaders()

    resp = conn.getresponse()
    html = resp.read()
    conn.close()

    patron = re.compile('<h3 class="r"><a href="([^"]*)"')
    urls = patron.findall(html)

    return urls


def gendork(base="example.com", dominios=[]):
    dork = "site:%s" % base
    for dominio in dominios:
        dork += "+-site:%s" % dominio
    return dork


def main():
    if len(sys.argv) != 2:
        uso()

    dominios = []
    base = sys.argv[1]

    ok = True
    while ok:
        dork = gendork(base, dominios)
        mensaje("[*] Dork: %s" % dork, 3, INFO)

        ok = False
        for start in range(0, CONFIG["paginas"]):
            mensaje("[*] Buscando pag. #%d" % (start + 1), 3, INFO)
            urls = buscar(dork, 0 + start * 10)

            if len(urls) == 0:
                mensaje("[-] No se obtubieron resultados.", 2, ERRO)
                break

            for url in urls:
                parseado = urlparse.urlparse(url)
                dominio = parseado.hostname
                if dominio not in dominios and dominio != base:
                    dominios.append(dominio)
                    mensaje("[+] %s" % dominio, 1, NORM)
                    ok = True
    mensaje("[+] No encuentro mas, esto se acabo.", 1, NORM)
    mensaje("[+] Resultados: \n", 1, NORM)

    dominios.sort()
    for dominio in dominios:
        mensaje(dominio, 0, NORM)
    return 0


if __name__ == "__main__":
    main()

Este script lo único que hace es buscar subdominios de un dominio base usando Google dorks. La idea es esta:

Primero buscamos todo lo que tenga indexado Google del dominio en cuestion con el dork:

site:example.com

(suponiendo que el dominio base es "example.com")

Luego revisamos unas cuantas páginas de resultados y digamos que encontramos los subdominios:

  • www.example.com
  • mail.example.com
  • ftp.example.com

Ahora buscamos nuevamente por el dominio base ("example.com") pero filtrando los subdominios previamente encontrados. Así:

site:example.com -site:www.example.com -site:mail.example.com -site:ftp.example.com

Y volvemos a revisar unos cuantos resultados a ver si aparecieron nuevos subdominios. Así iterativamente hasta que ya no encontremos nada nuevo o ya no se produzcan resultados.

Es todo por este año.

Un saludo y feliz 2014.

* Actualización: Puedes encontrar este script actualizado y otro que emplea Bing en lugar de Google en mi repositorio de GitHub: https://github.com/alguien-gh/scripts/tree/master/infogathe




2 comentarios:

  1. la linea dork += "+-site:%s" % dominio no debería ser dork += "-site:%s" % dominio

    ResponderEliminar
  2. Hola lobobinario

    En realidad el signo + no forma parte del dork sino que es el espacio en blanco codificado para que vaya en la URL y quede de esta forma:

    /search?q=site:example.com+-site:www.example.com+-site:mail.example.com+-site:ftp.example.com

    También se podría reemplazar el + por un %20 que al final es lo mismo.

    dork += "%%20-site:%s" % dominio

    Un saludo y feliz año!

    ResponderEliminar