script para sacar emails de paginas webs [python] [v3.0]

Iniciado por Kase, 27 Abril 2013, 18:35 PM

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

The_Mushrr00m

Que buen aporte bro.
Se mira bien.... le daré una leida a ver si se me ocurre alguna idea para expandirlo

Saludos..!  :P
«No hay camino para la verdad, la verdad es el camino»


Eleкtro

La condicional donde detectas si es Win o Linux da error de sintaxis (al menos en py 2.7), mira a ver si lo puedes arreglar...

De paso te la extiendo por si quieres añadir más OS:
Código (python) [Seleccionar]
import sys,os

if sys.platform.startswith('win'):
   # Windows
   os.system('cls')
elif sys.platform.startswith('linux'):
   # Linux
   os.system('clear')
elif sys.platform.startswith('cygwin'):
   # Windows (Cygwin)
   os.system('cmd /c cls')
elif sys.platform.startswith('darwin'):
   # MacOSX
   os.system('clear')
elif sys.platform.startswith('freebsd'):
   # FreeBSD
   os.system('clear')


PD: No estoy seguro si el comando de MACOS es el correcto, lo he googleado un poco.

Saludos








Eleкtro

#12
Tal y como tienes ahora mismo el regex del email, no acepta este tipo de emails (debería):
"elektro69#@maniac.com"

Pero estos si los acepta (no debería):

"..elektro..@maniac.com"
"""""""elektro@maniac.com"


Lo mismo con el resto de caracteres especiales válidos para un email, no los acepta según el orden en el que estén.

He optimizado bastante el regex del email, mira a ver si puedes usarlo en python:

"^(?=.{1,254}$)[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"

La parte local cumple todos estos requisitos:
CitarThe local-part of the e-mail address may use any of these ASCII characters:

       Uppercase and lowercase English letters (a-z, A-Z)
       Digits 0 to 9
       Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
       Character . (dot, period, full stop) provided that it is not the first or last character, and provided also that it does not appear two or more times consecutively.

PD: también la detección de 2 puntos en la parte local: "a.b.c@hotmail.com"

Lo de sólo letras inglesas me lo he saltado porque juraría haber visto emails con la C trencada "Ç" y digo yo que los chinos, egipcios, etc... no usarán letras inglesas para sus emails.

La parte del dominio no la he exprimido del todo, aún tengo que informarme sobre los detalles, pero acepta por ejemplo "user@blabla.com.edu" y "user@blabla.museum", así que por el momento funciona genial el regex.

También falta limitar el regex a cadenas de menos de 254 caracteres según el límite válido para la longitud de un email.
He actualizado el RegEx para que solo encuentre cadenas de menos de hasta 254 caracteres.

Un saludo!








Kase

sorprendente! me estas enctuciasmando a llebar esto mas alla del simple script y convertirlo en un sistema... en unas horas actualizo con calma :D

#!drvy

#14
Hola,

Vengo a trollear un poco xD

Sabiais que

asdasd@64.233.161.83

Es un correo valido ? xD Lo propongo como idea nada mas.. lo mismo pasa con las direcciones IPv6 pero esas no las admite ni gmail xD

Saludos

Eleкtro

pues yo no lo sabia xD y para nada me parece trolleamiento que nos aclares esas cosas.

estaría bien que aportases más datos al tema si ves que nos hemos saltado algún otro detalle como el que has comentado, para hacer el regex perfecto.

..como por ejemplo saber el límite de "Second-level and lower level domains" de un email, si es que hubiera algún límite (sin tener en cuenta el límite de caracteres de un email).

Bueno, un saludo!








#!drvy

#16
Técnicamente puede haber hasta 127 sub niveles de dominio. Osease, w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.........com xD

En ningún caso, el dominio (completo) puede exceder los 253 caracteres y los nombres de los "sub-dominios" no pueden exceder de los 63. Esto significa básicamente que en: parte3.parte2.com, parte3 o parte2 no pueden exceder de los 63 caracteres.

Mas info aquí:

2.3.4. Size limits
http://tools.ietf.org/html/rfc1035

PD: El dominio mas largo del mundo xD
http://www.thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com/
http://www.thelongestlistofthelongeststuffatthelongestdomainnameatlonglast.com

Son iguales de longitud (63 caracteres) pasa que este tipo de fuente... no es monospace xD



Básicamente (según mis cálculos) lo que quiere decir esto es que en un correo (nombre@dominio.com) el nombre no debería de exceder los 63~64 caracteres para que se adapte a cualquier dominio.

Y si queréis una cuenta email con un dominio largo..
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com ofrece cuentas gratuitas xD

Saludos

Kase

Citar"^(?=.{1,254}$)[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"

no me a servido xD  no se por que, pero marca error... y por mas que le busco y le busco, no lo logro..

pero esta otra si funciono

Código (python) [Seleccionar]
mailsrch = re.compile(r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum|mx|com\.mx|xxx|tv|tk)\b")






y en otras noticias, estuve trasteando  el codigo html de google ala par que la api de custom search...
la api es una basura diseñada para no explotarse conestos fines u__u

pero el codigo html no... el chiste es desactiva el javascript, pero al pedir la web mediante python automaticamente la sirve preparada para no usar javascript

entonces nos encontramos con que la url victima viene en formato

Citar<a href="/url?q=http://www.elhacker.net/&amp;sa=U&amp;ei=JQeCUdz3DoK49QSYvoDAAQ&amp;ved=0CCEQFjAA&amp;usg=AFQjCNE8PCIInwOQ84p63ylCDShXtjtiAA">


quisas una expresion regular pueda identificar los links /url?   y extraer de los parametros get la web a la que se quiera atacar...
nuevamente mi conocimiento es bajo en expresiones regulares u__u


aun asi espero hacer un script alterno al cual se le puedan pasar parametros de busqueda de google...

asiendo este script, me lanzo a hacer el sistema mas completo xD

Kase

porcierto aqui esta el que hace busquedas en google  :3

no esta terminado, por que google te banea aveces.. xD pero igual a alguien le interesa.


Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
## by kase: kase@boredsoft.com 
import requests,re,os,time,sys
from argparse import ArgumentParser, RawTextHelpFormatter


parser = ArgumentParser(description="google dorks email spider ", version="1.0", formatter_class=RawTextHelpFormatter)
## -url
parser.add_argument("-b",  dest="busqueda", help='Cadena a buscar en google entre comillas')
## -max_links links
parser.add_argument("-p",  dest="paginas", help='Maximo de paginas a analizar en google (cada pagina contiene 10 enlaces) por defecto 10')
argumento = parser.parse_args()

dominio = 'http://google.com.mx'
mailsrch = re.compile(r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum|mx|com\.mx|xxx|tv|tk)\b")
urlssrch = re.compile(r'href=[\'"]?([^\'" >]+)')
googlesrch = re.compile(r'href=[\'"]?/url\?q=([^\'" &]+)')
contador = 0
links_internos = []
links_visitados = []
emails_capturados = []
if not argumento.paginas:
paginas = 10
else:
paginas = argumento.paginas

## recorre las paginas de google (de 10 en 10)
for x in range(0,paginas):
r=requests.get(dominio+''+'/search?q=%s&start=%s&num=100' % (argumento.busqueda,contador))
contador +=100

links_google = googlesrch.findall( r.text)
##recorre los links que arroje los resultados de google
for link in links_google:
time.sleep(15)
r2=requests.get(link)
emails = mailsrch.findall(r2.text)
##detecta los emails encontrados en la web de resultado
for email in  emails:
if email not in emails_capturados:
emails_capturados.append(email)
## recorre un nivel en los enlaces de la web resultado bajo la teoria de que deben ser de tematica similar
links = urlssrch.findall( r2.text)

########## informe de pantalla
if sys.platform.startswith('win'):
    # Windows
    os.system('cls')
elif sys.platform.startswith('linux'):
    # Linux
    os.system('clear')
elif sys.platform.startswith('cygwin'):
    # Windows (Cygwin)
    os.system('cmd /c cls')
elif sys.platform.startswith('darwin'):
    # MacOSX
    os.system('clear')
elif sys.platform.startswith('freebsd'):
    # FreeBSD
    os.system('clear')
print 'parametro de busqueda: ' , argumento.busqueda
print 'pagina checada: ', contador/10
print 'paginas por checar: ', paginas - (contador/10)
print 'emails capturados: ', len(emails_capturados)
print 'url victima actual: ', r2.url
##fin de informe de pantalla

while links:
try:
link = links.pop()
if not link[0] == '/':
r3=requests.get(link)
##else:  falta codigo para detectar el dominio :(
except:
ci = os.system('ping -c 1 google.com') ## checa si hay conexion de internet
if ci == 0:  #si existe conexion elimina el enlace muerto
link = links.pop()

#guarda emails de el nivel 2.
emails = mailsrch.findall(r3.text)
for email in  emails:
if email not in emails_capturados:
emails_capturados.append(email)

f = open('google_%s.txt' % argumento_busqueda.replace('.','_'),'w+')
f.write("\n".join(emails_capturados))
f.close()

binario010101

hola amigo

estoy interesado en el tema pero no se como usar el codigo me puedes explicar?

gracias
binario010101@hotmail.com
no soy ing estudio sicologia