Algoritmo de aleatorización de contraseñas impares

8

Estoy investigando una aplicación que tiene un algoritmo de cifrado de contraseñas que no había visto antes. Generé algunas contraseñas (la longitud máxima permitida es de 8 caracteres) y obtuve los siguientes resultados:

password:     0  0  0  0  0  0  0  3
scrambled:    W1 U6 W1 U6 W1 U6 W1 X2

password:     0  0  0  0  0  0  0  2
scrambled:    W1 U6 W1 U6 W1 U6 W1 M7

password:     0  0  0  0  0  0  0  1
scrambled:    W1 U6 W1 U6 W1 U6 W1 F2

password:     0  0  0  0  0  0  0  0
scrambled:    W1 U6 W1 U6 W1 U6 W1 U6

password:     1  2  3  4  5  6  7  8
scrambled:    H9 G6 B5 G3 F8 Q7 X8 O9

El cifrado es claramente reversible. Estoy pensando que lo peor empeora, podría generar un mapeo de diccionario, pero creo que habría una forma más inteligente de hacerlo.

¿Alguien ha encontrado algo como esto antes?

Actualización

Más valores y señalados:

  • 0 se comporta de manera muy diferente a otros personajes
  • @ también es digno de mención (constante en cada posición)
  • el algoritmo no puede o no procesará contraseñas de menos de 3 caracteres
4  4  4  4  4  4  4  4
A2 S5 K9 G3 Y6 U0 M4 E8

3  3  3  3  3  3  3  3
L4 Z5 B5 R1 R5 F7 H6 X2

2  2  2  2  2  2  2  2
W6 G6 S0 C0 K4 U3 C8 M7

1  1  1  1  1  1  1  1
H9 N6 F6 J8 D3 J0 B0 F2

1  0  0  0  0  0  0  3
H9 U6 W1 U6 W1 U6 W1 X2

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

A  B  C
N6 C0 L0

B  B  B  B  B  B  B  B
M7 Y1 I1 Q5 A5 I9 S8 E3

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

A  A  A  A  A
J8 D3 J0 B0 F2

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

@  @  @  @
M2 M2 M2 M2

#  #  #  #
P2 B9 F3 T4

*  *  *  *
A9 A1 U7 Q9

!  !  !  !
Z4 D7 X1 Z8

Regla general para un enfoque de fuerza bruta para desordenar estas contraseñas:

En una cadena de longitud L, un personaje dado en la posición N siempre tendrá el mismo valor.

IE: en contraseñas de 8 caracteres, si el primer carácter es A, siempre se codificará de la misma manera.

NB: he descubierto la forma de "fuerza bruta" de descifrar esto, pero me encantaría saber el algoritmo utilizado para codificar las contraseñas. Si alguien tiene experiencia en revertir este tipo de cosas, me encantaría recibir algunos consejos sobre cómo proceder desde aquí.

    
pregunta Juicy 21.06.2015 - 13:53
fuente

2 respuestas

3

Muchos de los consejos que estoy a punto de sugerir requieren un uso excesivo del aleatorizador. No son ataques de diccionario, pero sí incluyen una gran cantidad de codificaciones de contraseñas con el fin de recopilar datos. Si su objetivo es hacer esto sin demasiadas pruebas de prueba contra la función, o no puede hacerlo, realmente no tengo muchos consejos.

Enteros

Es fácil trabajar con los enteros, y cualquier persona que implemente una codificación propia probablemente esté operando en enteros, no en cadenas. Encontrar una correspondencia entre los dos símbolos ( J8 , D9 , etc.) y los enteros podría ser crucial. Dado que todos los números y las letras están representados, hay 26*20=260 tokens diferentes para trabajar. 260 está cómodamente cerca de 256 , lo que podría sugerir que los tokens son solo una codificación de bytes.

El enfoque intuitivo es interpretar Xn como 10*X+n , donde X es el índice de la letra X y n un número entero entre 0 y 9. Esto queda descartado por el token Z8 , que correspondería al entero 258 , que es demasiado grande para un byte. De manera similar, se pueden descartar varias otras codificaciones, al menos estas combinaciones lineales simples:

b = 10*X + n
b = 10*(26-X) + n
b = (26-X) + 26*n
b = 10*(26-X) + (9-n)
b = (26-X) + 26*(9-n)

Para descartar las conjeturas para la codificación que hacemos, saber qué tokes aparecen en los scrambles es muy útil. Si los tokens son una codificación para bytes, entonces debería haber 260-256=4 tokens que nunca aparecen. Encontrar estas fichas podría dar pistas valiosas. Si todos los tokens ocurren en algún momento, también sería una pista valiosa.

Cajas

Las codificaciones para las contraseñas ('AAA', 'AAAA', 'AAAAA' ...) nos dan información útil. Podemos deducir que la función de aleatorización para un solo símbolo es una función f(symbol, integer) -> token donde el entero i es la suma de la longitud de la contraseña y el índice del símbolo. P.ej. %código%. En general, f(A, 4+1) = f(A, 3+2) = J8 es constante para todas las longitudes e índices.

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

Como la contraseña está limitada a 8 símbolos, tenemos f(symbol, length + index) diferentes funciones de aleatorización 8+8 = 16 para encontrar. Es difícil establecer a partir de los datos disponibles si estas funciones dependen del entero 'n' (es decir, g_n(symbol) -> token ). Las funciones length + index podrían implementarse como tablas de búsqueda y no seguir ningún patrón en absoluto.

@

El carácter g_n me ha dejado perplejo, pero tal vez sea para reconocer direcciones de correo electrónico codificadas. Las direcciones de correo electrónico tienen más de 8 símbolos y podrían implicar que la codificación funciona también con una entrada más larga, lo que a su vez sugiere que las funciones @ son dependientes de g_n (teorema de la pereza, nadie hace más de 16 tablas de búsqueda aleatoria)

Construyendo las tablas de búsqueda

Esto se podría hacer simplemente mezclando todas las contraseñas n , aa...a ... bb...b , y usando la relación de longitud y posición para decidir a qué función ^^...^ pertenece el resultado codificado. Estos datos también ayudarán a descubrir qué y cómo los tokens codifican los datos.

Mirando las tablas

Si construimos tablas para todas las contraseñas alfabéticas de repetición de longitud 8, es decir. g_n , aaaaaaaa , etc. podríamos visualizar los resultados codificados como una imagen de 8x26. Los humanos son buenos para mirar imágenes, por lo que las cosas más simples (como la linealidad) se ven fácilmente desde la imagen. La búsqueda de artefactos horizontales, verticales, cuadrados o diagonales en una imagen puede decir mucho sobre el algoritmo utilizado para codificar las contraseñas. Este enfoque es muy orgánico y requiere algunas habilidades de programación / scripting.

Mi enfoque de visualización sería el siguiente:

  • generar codificaciones para todas las contraseñas de 8 caracteres ASCII repetidos (o bytes, si es posible)
  • convierta los tokens en bytes usando un esquema simple (por ejemplo, una combinación lineal)
  • guarde los bytes como un archivo binario bbbbbbb
  • utilice el ImageMagick bytes.gray utilidad: convert
  • mira la imagen y trata de encontrar patrones
respondido por el Juha Kivekäs 22.06.2015 - 18:40
fuente
6

Esta secuencia:

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

dice que se está utilizando una clave para codificar la contraseña de entrada, al igual que XOR, excepto que la mayoría de los usos de XOR saldrían en hexadecimal mientras que esta salida es base36?

Esta secuencia

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

me hace pensar que hay diferentes claves para diferentes cadenas de longitud.

Entonces, supongo que el algoritmo toma el texto en claro 'a', toma el valor ascii de 'a' (97) lo convierte a base36 (2P), XORs con el valor respectivo en la clave y le da la base36 valor de H1.

EDITAR: no parece ser base36. Sea cual sea el esquema de codificación en uso, todavía estoy adivinando que usa XOR. Ayudaría a explicar el comportamiento de cero, ya que cero XORed con X es siempre X.

Si eso es cierto, el proceso es reversible y se pueden encontrar las claves, eliminando la necesidad de fuerza bruta o la creación de tablas de búsqueda.

    
respondido por el mcgyver5 22.06.2015 - 19:20
fuente

Lea otras preguntas en las etiquetas