Subdomining - Subdominios sin bruteforcing

Iniciado por remiotore, Noviembre 19, 2017, 07:33:16 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 19, 2017, 07:33:16 PM Ultima modificación: Noviembre 19, 2017, 07:36:01 PM por remiotore
¡Buenos días a todxs! Hoy os traigo otro script que espero que os sea de utilidad :D
Este script nos permite averiguar los subdominios sin fuerza bruta. Por extensión, hay poca interacción con los servidores ya que los subdominios los obtiene directamente de los motores de búsqueda (Ask, Bing, Yahoo y Google) mediante Dorks. La única interacción se debe a la resolución de la IP con el método "gethostbyname" del módulo Socket.
Lógicamente, al no tratarse de un escaneo con fuerza bruta, no nos devuelve todos los subdominios, pero sí aquellos públicamente localizables a través de los ya mencionados motores de búsqueda.

PoC:
Introduzcamos una web al azar  ;) y el número de páginas que queremos recorrer en los motores de búsqueda.



Esperamos a los resultados:



Y finalmente nos muestra el esquema gráfico de los dominios y las direcciones de cada servicio web.




Código: python

# -*- coding: utf-8 -*-
import re
import socket
import urllib2
import networkx as nx
import matplotlib.pyplot as plt

print ' _______           ______   ______   _______         _______ _________ _       _________ _        _______ '
print '(  ____ \|\     /|(  ___ \ (  __  \ (  ___  )       (       )\__   __/( (    /|\__   __/( (    /|(  ____ \ '
print '| (    \/| )   ( || (   ) )| (  \  )| (   ) |       | () () |   ) (   |  \  ( |   ) (   |  \  ( || (    \/'
print '| (_____ | |   | || (__/ / | |   ) || |   | | _____ | || || |   | |   |   \ | |   | |   |   \ | || |      '
print '(_____  )| |   | ||  __ (  | |   | || |   | |(_____)| |(_)| |   | |   | (\ \) |   | |   | (\ \) || | ____ '
print '      ) || |   | || (  \ \ | |   ) || |   | |       | |   | |   | |   | | \   |   | |   | | \   || | \_  )'
print '/\____) || (___) || )___) )| (__/  )| (___) |       | )   ( |___) (___| )  \  |___) (___| )  \  || (___) |'
print '\_______)(_______)|/ \___/ (______/ (_______)       |/     \|\_______/|/    )_)\_______/|/    )_)(_______)'
                                                                                                         

print 'Introduce un dominio: '
domain =  raw_input('(ej: "cisco.com" y no "www.cisco.com") \n')
pages = int(raw_input('Número de páginas: '))
subdomains = []
finalSubDomains = []

def google(domain, pages):
print "SEARCHING WITH GOOGLE"
counter = 0
for page_no in range(0, pages*10, 10):
google = "https://www.google.es/search?q=site:" + domain + "+-site:www." + domain + "&start=" + str(page_no)
try:
#print google
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(google).read()
urls = re.findall('<cite.*?>(.*?)<\/cite>', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (url.replace('http://','')).replace('https://','')
url = url.split('/')[0]
subdomains.append(url) #).replace('/','')
except:
pass
print "\t\t" + str(counter) + " resultados."

def yahoo(domain, pages):
print "SEARCHING WITH YAHOO"
counter = 0
for page_no in range(1, pages*10, 10):
yahoo = "https://search.yahoo.com/search?p=site:" + domain + "+-site:www." + domain + "&b=" + str(page_no)
try:
#print yahoo
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(yahoo).read()
urls = re.findall('<span class=" fz-ms fw-m fc-12th wr-bw lh-17">(.*?)/', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (url.replace('http://','')).replace('https://','')
url = (url.split('/')[0]).replace('/','')
subdomains.append((((url.replace('<b>','')).replace('<','')).replace('http://','')).replace('https://',''))
except:
pass
print "\t\t" + str(counter) + " resultados."

def ask(domain, pages):
print "SEARCHING WITH ASK"
counter = 0
for page_no in range(1, pages+1, 1):
ask = "http://www.ask.com/web?q=site:" + domain + "+-site:www." + domain + "&page=" + str(page_no) + "&o=0&l=dir&qsrc=998&qo=pagination"
try:
#print ask
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(ask).read()
urls = re.findall('"domain":(.*?),"contentDesignation"', source)

for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
subdomains.append((((url.replace('http://','')).replace('https://','')).replace('"','')).replace('/',''))
except:
pass
print "\t\t" + str(counter) + " resultados."

def bing(domain, pages):
print "SEARCHING WITH BING"
counter = 0
for page_no in range(1, pages+1, 1):
bing = "https://www.bing.com/search?q=site:" + domain + "+-site:www." + domain + "&go=Submit&first=" + str(page_no)
try:
#print bing
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(bing).read()
urls = re.findall('<div class="b_title"><h2><a href="(.*?)" h="ID=SERP', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (((url.replace('http://','')).replace('https://','')).replace('"',''))
url = url.split('/')[0]
subdomains.append(url)
except:
pass
print "\t\t" + str(counter) + " resultados."

def netcraft(domain):
print "SEARCHING WITH NETCRAFT"
netcraft = "https://searchdns.netcraft.com/?restriction=site+ends+with&host=" + domain
try:
#print netcraft
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(netcraft).read()
except:
pass

def shodan(domain):
print "SEARCHING WITH SHODAN"
shodan = "https://www.shodan.io/search?query=" + domain
try:
#print shodan
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(shodan).read()

except:
pass




google(domain, pages)
yahoo(domain,pages)
ask(domain,pages)
bing(domain,pages)
#netcraft(domain) #PENDIENTE
#shodan(domain) #PENDIENTE

print "Eliminando duplicados..."

for element in subdomains:
if element not in finalSubDomains:
finalSubDomains.append(element)

print "\nDOMINIO BUSCADO:\t" + domain.upper() + "\n"


g = nx.Graph()
color_map = []
g.add_node(domain)

for i in sorted(finalSubDomains):
try:
ip = socket.gethostbyname(i)
except:
ip = "Connection Error"
print i + ' | --------------------- | ' + ip
nodo = str(i) + "\n" + str(ip)
g.add_node(nodo)
g.add_edge(domain, nodo)

print "Configuring node's color..."
for node in g:
        if node == domain:
                color_map.append('red')
        else:
                color_map.append('white')

print "Dibujando el gráfico..."
nx.draw(g, node_color = color_map, with_labels=True, font_size=10)
nx.spring_layout(g,k=0.1,iterations=50)
plt.show()


Espero que, a pesar de ser un neófito, esto pueda ser de alguna utilidad para alguien  ;D
Muchas gracias por vuestra atención :)


Hola No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¡Está genial!, la verdad me parece una pasada que la comunidad comparta herramientas, eso me encanta. Yo creería que se podría crear un estilo de reposito a estilo de GitHub pero para Underc0de, donde el hecho es centralizar este tipo de tools que para alguien han de ser útiles en algún momento :).

Aparte de eso, lo que andabas buscando de Tweepy, yo tengo la solución, trabajé con ello ya hace varios años pero funciona perfectamente :). Déjame si hoy posteo en el foro y así también aporto.

Un saludo.
Become the change you seek in the world. -Gandhi.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hola No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¡Está genial!, la verdad me parece una pasada que la comunidad comparta herramientas, eso me encanta. Yo creería que se podría crear un estilo de reposito a estilo de GitHub pero para Underc0de, donde el hecho es centralizar este tipo de tools que para alguien han de ser útiles en algún momento :).

Aparte de eso, lo que andabas buscando de Tweepy, yo tengo la solución, trabajé con ello ya hace varios años pero funciona perfectamente :). Déjame si hoy posteo en el foro y así también aporto.

Un saludo.


Gracias :D Y sí, sería una buena idea ^_^
Te lo agradecería mucho si pudieras compartir la solución!

Esta buena la idea aunque el codigo podria ser un poco mas limpio