Cómo crear Rainbow Tables con Python para descifrar hashes
En esta ocasión os vamos a enseñar cómo crear Rainbow Tables con Python para cualquier algoritmo de hashing que esté soportado por la librería hashlib. Pero, por si alguno aún no lo sabe… ¿Qué son las Rainbow Tables? Se conoce como Rainbow Tables a tablas de hashes donde podemos encontrar equivalencias de contraseñas hasheadas. Es […]

En esta ocasión os vamos a enseñar cómo crear Rainbow Tables con Python para cualquier algoritmo de hashing que esté soportado por la librería hashlib.
Pero, por si alguno aún no lo sabe…
¿Qué son las Rainbow Tables?
Se conoce como Rainbow Tables a tablas de hashes donde podemos encontrar equivalencias de contraseñas hasheadas.
Es decir, por poner un ejemplo, si usamos la función de hashing MD5 para cifrar la contraseña «password», obtendremos el hash «5f4dcc3b5aa765d61d8327deb882cf99».
Las funciones de hashing, como muchos sabréis, no son reversibles, por lo que no es como convertir una cadena a base64, que se puede deshacer con una simple función.
Para descubrir la equivalencia de un hash con una contraseña, hemos de comparar el hash que tenemos con el hash generado a partir de esa contraseña. Y ahí es donde entran las Rainbow Tables.
Además, en algunas funciones de hashing se puede añadir lo que se conoce como «salt», que no es otra cosa que una palabra de cifrado que ayuda a dificultar aún más la posibilidad de descifrar la contraseña.
En este caso nos centraremos en hashes sin salt, es decir, hashes que han sido creados a partir de la contraseña directamente, y con los que se ha creado una tabla para un diccionario de palabras concreto.
En nuestro ejemplo usaremos el algoritmo MD5 y el diccionario rockyou.txt, de sobras conocido por la gran mayoría de hackers. Cabe decir que se puede editar el código que encontraréis a continuación para elegir otro algoritmo, y el diccionario a utilizar puede ser cualquier archivo de texto plano «txt» con una lista de palabras.
Es momento de enseñaros cómo crear esas rainbow tables con python y desgranar el algoritmo de la herramienta en cuestión, creada por DamonCDB y la cual podéis encontrar en su GitHub.

Rainbow Tables con Python línea a línea
Lo primero que debemos hacer es importar la librería hashlib que es la que contiene las distintas funciones de hashing que utilizaremos para crear las rainbow tables con Python. Para ello, la primera línea del código debe ser la siguiente:
import hashlib
De esta forma tenemos disponibles las funciones incluidas en hashlib que nos ayudarán a crear las rainbow tables según la función de hashing que elijamos (MD5, SHA-256, etc.)
A continuación hacemos que el programa nos pida el hash que queremos buscar en la tabla:
hash = input("Introduce el hash a buscar en el diccionario: ").strip()
Con esta línea de código nos aseguramos de que se elimine cualquier espacio al final o al principio del hash, por si lo copiamos con algún espacio y no nos damos cuenta (algo que puede pasarnos si vamos demasiado deprisa).
Después hemos de indicarle a la herramienta la ruta del diccionario de contraseñas que queremos usar. Para ello usamos la siguiente línea de código:
dict_path = input("Introduce la ruta del archivo del diccionario de contrasenyas: ").strip()
La herramienta ya está preparada para pedirnos el hash y el diccionario que queremos usar, pero no es suficiente para que lea el contenido del diccionario. Para ello le decimos a la herramienta que lea la lista de palabras:
f = open(dict_path, "r", encoding='latin-1')
Una vez abierto al archivo del diccionario en modo lectura e introducido el hash, lo que queda es que la herramienta compruebe si dicho hash pertenece a alguna de las palabras del diccionario que le hemos indicado.
Para ello lo que haremos es, línea por línea, crear el hash de cada palabra con la función seleccionada (en nuestro caso MD5, pero como ya se ha dicho, se puede cambiar el código para que use otra función de hash incluida en hashlib).
Después de eso se comparará el hash creado con el introducido por el usuario, y si coinciden, nos devolverá la contraseña a la que pertenece dicho hash y la herramienta se cerrará. En caso de no coincidir, pasará a la siguiente línea, y así continuamente hasta llegar a la última. Si la herramienta no devuelve un resultado, significa que no ha encontrado ninguna palabra cuya conversión con esa función coincida con el hash introducido.
En el supuesto caso en que el archivo que le hemos introducido como ruta del diccionario no exista, nos avisará de que no puede abrir el archivo indicado.
Todo esto se hará mediante una sentencia try – except de Python:
try:
for line in f:
password = line.strip()
hash_md5 = hashlib.md5(password.encode('utf-8')).hexdigest()
if hash == hash_md5:
print("El hash " + hash + " pertenece al password " + password)
break
except FileNotFoundError:
print("No se pudo abrir el archivo. Verifica la ruta.")
Y eso es todo. Como veis es bastante sencillo crear una herramienta de este tipo para tener nuestras propias rainbow tables con Python.
Y si queréis aprender más sobre Python y ciberseguridad, no dudéis en visitar nuestro curso de Herramientas para Hacking y Pentesting integradas en Python