Me lo contaron y lo olvidé, lo leí y lo entendí, lo hice y lo aprendí.





jueves, 2 de agosto de 2012

Generador de Contraseñas [Diccionario] en Python

En el ámbito del Hacking los diccionarios de contraseñas son muy útiles a la hora de crackear contraseñas mediante la fuerza bruta, ya que el tener las posibles contraseñas es un archivo del cual se van obteniendo una por una y es analizada es más rápido que generar en tiempo real la "palabra candidata" para después ser probada.
El método que es más usado es tener una base de datos con palabras comunes y/o palabras claves que pueden ser usadas como contraseñas (Contraseñas comunes como "perro", "amor", "123456", "drácula", "thehungergames", etc); pero éste método no da un alto porcentaje de acierto a la hora de usar fuerza bruta, por lo cual es más conveniente usar la mayor cantidad de posibles combinaciones de letras, números y signos posibles para las contraseñas. Éste método requiere de más tiempo, más tiempo de procesamiento y, obviamente, más espacio de almacenado, pero entre más combinaciones se tengan mayor es el porcentaje de acierto a la hora de buscar una contraseña en específico.

En esta ocasión realicé un pequeño Script en Python que genera un archivo con todas las posibles contraseñas que contengan una longitud entre 1 y 20 que se puedan generar con las combinaciones de letras mayúsculas, minúsculas, números y los signos '-' (guión medio) y '_' (guión bajo).

Primero el código Pythoneano:

# -*- coding: cp1252 -*-
letras = ['','a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','-','_']
indices=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
#67 elementos en la lista
i=0
diccionario=open("diccionario.lis","w")
while(indices[20]==0):
cadena=""
while( j < 20  )  :
if(indices[j] > = 6 7 ) :
indices[j]=0
indices[j+1]=indices[j+1]+1
cadena=cadena+letras[indices[j]]
j=j+1
#print cadena+"\n"
diccionario.write(cadena+"\n")
indices[0]=indices[0]+1
if(indices[0]>=67):
indices[0]=0
indices[1]=indices[1]+1
diccionario.close()
print "terminado"

Como podrán notar, el código esta poco optimizado y es muy bizarro, pero cumple con su función; la explico:

Primero se crea una lista (letras) con los caracteres que quiero incluir en las combinaciones de contraseñas, tomando en cuenta la posición vacía (""). Noten que cuento que tengo 67 caracteres.

Después creo otra lista (indices) que me guardará la posición de los índices por cada posición posible y le agrego una posición más a la lista, lo cual no es del todo necesario pero no quise complicarme con validaciones.
con open('diccionario.lis','w') abro/creo un archivo con permisos de escritura en donde iré guardando las contraseñas generadas. Hago ésto antes de empezar con las iteraciones para no gastar recursos del procesador al estar abriendo y cerrando el archivo, además de que en python se sobre-escribiría el archivo si se abre de ésta manera.

Empiezo con las iteraciones, el "while(indices[20]==0)" me asegura el el último índice (el 21) de la lísta de índices será 0, ya que al vale 1 quiere decir que los demás índices ya habrán dado toda la vuelta y por consiguiente se habrán realizado las combinaciones posibles.

cadena="" crea una variable cadena que inicia vacía, esta cadena es la que contendrá la contraseña generada; poco a poco se le irán concatenando los caracteres.

while( j < 20  )  :
if(indices[j] > = 6 7 ) :
indices[j]=0
indices[j+1]=indices[j+1]+1
cadena=cadena+letras[indices[j]]
j=j+1

Esta parte de código lo que hace es concatenar el carácter que apunta cada índice a la variable cadena; el "if(indices[j] >=67)..." lo que hace es comprobar si el índice ya superó la cantidad de caracteres con los que manejo (en éste caso 67) para reiniciar a 0 la cuenta y aumentar en 1 el índice que le sigue.
Después se concatena el valor del índice a la variable "cadena".
y aumento en 1 el índice J para seguir con el siguiente, valga la redundancia, índice.

con diccionario.write(cadena+"\n") simplemente escribo la contraseña en el archivo, concatenando el salto de línea "\n".

El "if(indices[0]=..." solo comprueba que si el primer índice ya superó los 67 caracteres, para así aumentarse en 1 o bien para reiniciar a 0 y aumentar en 1 al siguiente índice.

Finalmente, cuando terminan todas las combinaciones posibles, cierro la conexión con el archivo y termino el programa.



Ésto sería todo.
Tengo pensado hacer programas que, usando el diccionario generado por este Script se puedan "desencriptar" contraseñas digeridas en MD5 y SHA1.

Por ahora nos seguiremos leyendo.


Apaga la TV
Y enciende tu cerebro

1 comentario:

  1. Me da el siguiente error...
    Traceback (most recent call last):
    File "C:\Python33\diccionario.py", line 8, in
    while( j < 20 ) :
    NameError: name 'j' is not defined

    Supuse que había que cambiar la i=0 por j=0 pero me crea una lista infinita de parrafos en blanco...

    Un saludo.

    ResponderEliminar