AnuncioLas tablas Rainbow se utilizan en recuperación de contraseñas, análisis forense de TI, pruebas de penetración y descifrado de contraseñas. Rainbow Table es una estructura de datos que permite una búsqueda rápida y eficiente en memoria de la cadena original (generalmente una contraseña) para un valor hash determinado. La búsqueda a través de una tabla de arcoíris es considerablemente más rápida que utilizar el método de fuerza bruta, pero el requisito de memoria es mayor. Esta compensación se denomina compensación de tiempo-memoria. Esto supone una función hash (como MD5) sin sal, como es el caso de las contraseñas de versiones anteriores de Windows y de muchos enrutadores. Se han calculado tablas comparativamente extensas para hashes LM y MD5 y están disponibles en varias fuentes. La fuerza bruta es simplemente adivinar la contraseña correcta. Es fácil utilizar este método a menos que el sitio se bloquee después del siguiente intento. El siguiente método es un ataque de diccionario, que utiliza una tabla de arcoíris para descubrir su contraseña, del cual estamos hablando. En los viejos tiempos, las contraseñas se guardaban en algunos archivos como /etc/passwd, en este tipo de formato:nombre de usuario:contraseña con hash MD5Es fácil usar la herramienta MD5 para codificar cualquier cadena:Como la herramienta es la misma, y ​​el número El número de caracteres es limitado si dos usuarios usan la misma contraseña, ¡la cadena hash será la misma! Ese es un ejemplo básico de «colisión». Hoy en día, agregamos sal antes de aplicar hash a la contraseña. Además, ya no utilizamos MD5 como algoritmo hash para contraseñas. Los valores hash modernos son mucho más largos que con la salida MD5. Conceptos básicos de una tabla Rainbow Una tabla Rainbow es una representación compacta de secuencias de contraseñas conectadas, las llamadas cadenas. Cada una de estas cadenas comienza con una contraseña inicial, que se pasa a través de una función hash. El hash resultante, a su vez, pasa a través de una función de reducción con el resultado de tener otra posible contraseña de texto sin formato. Este proceso se repite para un número predeterminado, y finalmente, la primera contraseña de la cadena se almacena junto con el último valor hash. Al crear la tabla, asegúrese de que, por un lado, ninguna contraseña que se produzca en una cadena se utilice como una contraseña inicial (colisión), pero por otro lado, todas las contraseñas posibles aparecen en la tabla. Las tablas se crean solo una vez y luego sirven como tabla de búsqueda. Averiguar una contraseña requiere un proceso de dos pasos. Primero, el hash de la contraseña buscada se pasa a través de la secuencia de funciones de reducción y hash hasta que el valor hash resultante aparece en la columna de los últimos eslabones de alguna cadena (el «lado derecho» de la tabla). Esto ha encontrado la cadena que contiene el hash dado. A partir de la contraseña inicial de esta cadena, ahora aplica la secuencia de reducción de hash hasta que obtenga el valor hash dado. La contraseña que precede al valor hash es la contraseña que estás buscando. La longitud de la cadena, es decir, el número de iteraciones para crear las tablas, afecta el tamaño de la tabla: cuanto más largas sean las iteraciones elegidas, más pequeña será la tabla resultante. . En el caso más simple, el número de iteraciones es igual a 1, por lo que la tabla contiene todos los pares de hash de contraseñas. Este es un ejemplo de generador de tablas de arcoíris: https://github.com/jtesta/rainbowcrackalackhttps://github.com/ jtesta/rainbowcrackalack Cómo funciona Rainbow Table Una función hash asigna una secuencia binaria de longitud fija a una secuencia binaria de longitud arbitraria. En el caso de la función hash MD5, esta longitud de salida es de 128 bits o 32 caracteres de 4 bits. Para obtener una cadena aleatoria con una longitud de na, se calcula un valor hash. Este resultado de la función hash (con longitud 32) se convierte en una nueva cadena mediante una función de reducción R, que nuevamente devuelve la longitud que posee n. Debido a que la ejecución secuencial de la función hash y la función de reducción no cambian la longitud de la cadena, estos dos pasos se pueden repetir alternativamente tantas veces como se desee. Al final, la secuencia de resultados intermedios forma una cadena. Se almacenan los valores inicial y final de esta cadena. Esta secuencia de pasos también se repetirá x veces y formará una tabla arcoíris universal. La función de reducción acorta un valor hash a n signo. Cada una de estas reducciones produce una nueva cadena «única» de 128 bits, o una colisión, por ejemplo mediante MD5. Una colisión es un valor hash que pueden generar diferentes cadenas de salida. Para evitar colisiones, se utilizan varias funciones de reducción, que periódicamente permiten una asignación única de la cadena de entrada y el hash de salida. Este método es más eficiente para cadenas de n caracteres que, por ejemplo, un ataque de fuerza bruta con una búsqueda de clave de [a-//////]porque este último convierte muchas cadenas en hashes que probablemente nunca se eliminen ni se elijan. En el caso de funciones de reducción triviales o mal programadas, se producen colisiones después de algunas ejecuciones, lo que conduce a repeticiones de los textos reducidos y, por tanto, también de los hashes. Estos bucles internos hacen que el algoritmo falle: se calculan laboriosamente miles de elementos y sólo unos pocos son distinguibles. En este ejemplo, buscamos la cadena cuyo valor hash MD5 corresponde a 97fae39bfd56c35b6c860aa468c258e0 en representación hexadecimal (Domino). . La forma tradicional de calcular todos los hashes MD5 para todas las variaciones posibles y compararlas requiere mucha computación y debe repetirse en nuevas búsquedas. Ahora tendría sentido almacenar todos los hashes que ya se han calculado en una base de datos y solo hay que compararlos. si el hash que está buscando ya se conoce cuando se vuelve a buscar. Una búsqueda de más de 64 caracteres posibles [A-Za-z0-9./]que podría tener cada dígito del texto introductorio, produce 64^6 variaciones. Si se almacenan texto y hash en una base de datos, se necesitan 16 bytes por par para el hash y 6 bytes para el texto sin formato, es decir, aproximadamente 1,4 terabytes para los datos completos. En la mayoría de los casos, estos volúmenes de datos no se pueden procesar y deben reducirse. En lugar de almacenar todos los valores y claves, solo la cadena inicial y la última cadena de una cadena de n elementos. De esta manera es posible representar n-1 hashes mediante un valor inicial y final y recalcularlos en un tiempo relativamente corto y así encontrar nuevamente el texto de entrada. Si se forma un valor final a partir de un hash reducido (= texto sin formato), esta cadena se recalcula desde el valor inicial hasta que se obtiene el hash dado; el texto que lo precede es el texto fuente que está buscando. Con una longitud de cadena de n=10.000. Esto significa que solo se necesitan 9999 cálculos de hash para encontrar el texto fuente de un hash. La probabilidad de obtener exactamente el texto de entrada deseado a partir de los hash reducidos depende de la calidad de las funciones de reducción y de los parámetros al crear la tabla del arco iris. , ya que sólo los hashes reducidos (= textos sin formato) se pueden encontrar más adelante. Por ejemplo, si las funciones de reducción se reducen únicamente a números, no se podrá encontrar el texto sin formato «Domino». Si la(s) función(es) de reducción a siete dígitos (de 32), entonces los textos planos de 6 dígitos no se calculan y aquí tampoco se pueden encontrar «fichas de dominó».