Crea diccionario de fuerza bruta con awk

Viernes, 26 Febrero 2010
Aqui teneis un script en python que generara palabras de una longitud máxima a partir de un cadena que define un alfabeto. Gracias a Makiolo cuya web donde lo he obtenido es http://blogricardo.wordpress.com

LONGITUD = 6
ALFABETO = "abcdefghijklmnopqrstuvwxyz0123456789_-."

Generar todas las combinaciones posibles conlleva no solo considerar las de longitud 6, si no tambien las de longitud 5,4,3,2 e incluso 1. El alfabeto tiene 39 caracteres por tanto todas las combinaciones posibles son:
calculo de combinaciones

cálculo de combinaciones

Contraseñas de longitud mayor que 8 son muy costosas computacionalmente, por ello el script que he realizado me interesa que de mucha información de cuanto queda y cuanto lleva. En concreto 3 cosas:

* El porcentaje que lleva del total.
* Tiempo estimado restante (en horas, lo he puesto).
* Velocidad: en palabras generadas por segundo

Con el dual core de mi portatil a 2.2 Ghz y con el ejemplo que pongo de palabras de hasta 6 caracteres y un alfabeto de 39 caracteres, los tiempos son muy buenos (aunque queda pendiente el uso de paralelización por MPI o algo así):

* Velocidad media aprox: 610.000 palabras generadas / seg
* Tiempo total : 1 hora 50 min

A continuación os pasteo el script (abrir un gedit generarDiccionario ):

#!/usr/bin/python
#
# :: Invasion Tux
# :: Ultima modificacion : miercoles, 10 de diciembre de 2009
# :: Script realizado por makiolo (Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.) (Licencia Creative Commons con reconocimiento)
# :: Ultima version : http://blogricardo.wordpress.com/2008/12/28/script-para-generar-diccionarios-de-fuerza-bruta/
# :: Dependencias : python 2.5
#

import sys, math, hashlib
from time import time, localtime, strftime
from hashlib import md5, sha1, sha224, sha256, sha384

########################### CONFIGURACION BASICA #########################

LONGITUD = 5
ALFABETO = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789_-."

####################################################################

########################### CONFIGURACION EXTRA ####################

CALCULAR_TIEMPO_RESTANTE = True

LLAMAR_EVENTO = False

GENERAR_FICHERO = True
DESTINO_FICHERO = "diccionario.txt"

BUSCAR_HASH = True
HASH_ALGORITMO = md5 # Opciones: md5, sha1, sha224, sha256, sha384
HASH_BUSCADO = "6091ece73d7b32b63e2f7db82e3bfe9d"

####################################################################

########################## CALLBACK ###############################

# ES UN CALLBACK MODIFICABLE SEGUN LA FUNCIONALIDAD A IMPLEMENTAR
def eventoPalabraGenerada(palabra):
print palabra

####################################################################

########################## FUNCIONES ###############################

def getVariacionesConRepeticion(ALFABETO , LONGITUD):
sumatorio = 0
for i in range(LONGITUD):
producto = 1
for j in range(i+1):
producto = producto * len(ALFABETO)
sumatorio = sumatorio + producto
return sumatorio

####################################################################

##################### VARS AUXILIARES ##############################

variacionesConRepeticion = getVariacionesConRepeticion(ALFABETO , LONGITUD)
PERIODO_MOSTRAR_ESTADISTICAS = 600000
inicioReloj = time()
cont = 0
progreso = 0

####################################################################

if GENERAR_FICHERO:
f = open(DESTINO_FICHERO,"w")

LONGITUD_MAXIMA = LONGITUD
LONGITUD = 1
while LONGITUD <= LONGITUD_MAXIMA:
try:
contadores = []                                   # ponemos los contadores a 0
for i in range(LONGITUD):
contadores.append(0)

fin = False
while not fin:

palabra=[]                                      # Creas una lista vacia (y liberas de paso)
for i in range(LONGITUD):
palabra.append(ALFABETO[contadores[i]])       # Vas metiendo al final letra a letra
palabra_formada = "".join(palabra)

if GENERAR_FICHERO:
f.write("%s\n" % palabra_formada)

if LLAMAR_EVENTO:
eventoPalabraGenerada(palabra_formada)        # Envias a tu callback tada la lista unida

if BUSCAR_HASH:
# algorimos disponibles:
HASH = HASH_ALGORITMO(palabra_formada).hexdigest()
if HASH == HASH_BUSCADO:
print "\n\nDesencriptado el HASH %s !!!!\n" % HASH
print "Su valor desencriptado es \"%s\"\n\n" % palabra_formada
raise KeyboardInterrupt

if CALCULAR_TIEMPO_RESTANTE:
if (cont % PERIODO_MOSTRAR_ESTADISTICAS == 0) and (cont != 0):
try:
progreso = cont*100.0 / variacionesConRepeticion              # porcentaje hasta ahora
finReloj = time() - inicioReloj                               # finReloj es lo que esta tardando el calculo
velocidad = cont / finReloj                                   # palabras procesadas por segundo
estimado = finReloj * variacionesConRepeticion / cont         # es lo que se estima en realizar todo el proceso
restante = estimado - finReloj                                # es lo que se estima en realizar lo restante
if restante > 60:
restante = restante / 60                                    # lo pasamos a minutos
if restante > 60:
restante = restante / 60                                 # lo pasamos a horas
unidad = "horas"
else:
unidad = "mins"
else:
unidad = "segs"
sys.stderr.write("%.2f%% - Quedan %.2f %s. La velocidad es de %.2f palabras/seg\n" % (progreso, restante, unidad, velocidad))
except ZeroDivisionError:
pass

cont = cont + 1
actual = LONGITUD - 1                                             # Pongo actual a la derecha del todo
contadores[actual] = contadores[actual] + 1                       # Sumo 1 a las unidades

while(contadores[actual] == len(ALFABETO)) and not fin:           # Propago el carry
if(actual == 0):
fin = True                                                    # FIN
else:
contadores[actual] = 0                                        # reinicia el actual contador
actual = actual - 1                                           # avanza a la izquierda
contadores[actual] = contadores[actual] + 1                   # y le sumo 1

LONGITUD = LONGITUD + 1                                             # combinaciones para uno menos

except KeyboardInterrupt:
sys.stderr.write("Proceso interrumpido\n")
fin = True                                                          # Fuerzo las condiciones de salida
LONGITUD = LONGITUD_MAXIMA+1

if cont == variacionesConRepeticion:
sys.stderr.write("Terminado al 100%\n")
else:
if CALCULAR_TIEMPO_RESTANTE:
sys.stderr.write("Terminado al %.2f%%\n" % progreso)
sys.stderr.write("Realizadas %d combinaciones de %d\n" % (cont, variacionesConRepeticion))

if GENERAR_FICHERO:
f.close()

Compartir

One&One

SEMrush

Visitanos en: