str0ke (Crypto 200)

By @drummer7212

Descripcion:


Debiste haber obtenido una base de datos encriptada con nombre: Datos_Bancarios
tu tarea es desencriptarla para obtener informacion sensible de los  
tarjetahabientes!!!

Hemos encontrado el codigo fuente de la aplicacion (DB_Protector.py) que  
protege dicho archivo, encuentra la falla criptografica, obten la llave de 
encripcion (que es la flag del reto) y con esta haz un XOR con el archivo  
encriptado.

El servicio  corre en 70.37.x.x  - Puerto: 1563

P.D. Guarda bien ese archivo porque utilizaras su informacion mas adelante.



El reto nos da 2 archivos, la base de datos cifrada (Datos_Bancarios), y el código que se usa para cifrar cadenas dentro del banco (DB_Protector.py).

Al abrir el archivo Datos_Bancarios, observamos que el texto está cifrado, por lo que se procede a observar el código:






Al observar el código se usa una llave dentro del programa (a la cual no se tiene acceso), y se usa la variable ll como key.



 
Analizando más el código de DB_Protector.py, se puede observar que se tiene 2 opciones, Cifrar mensaje y Descifrar mensaje.





Si escogemos cifrar mensaje podemos observar que en la creación del objeto algortimoc se usa AES en modo CBC, pero lo más interesante es que se usa el mismo valor de key como vector de inicializacion (IV), esto es una implementación incorrecta. También se observa que la longitud de los bloques es de 32 bytes, pero se agregan bytes si hace falta para que se a complete el modulo 16.  La variable padd es donde se agregan los caracteres chr(14) múltiplicado por el resultado de longitud, esto para acompletar la cadena. Posteriormente se cifra.

En la opción de descifrado se crea el objeto para cifrar, y luego se valida que el mensaje que se ingrese sea módulo 16, esto nos da a entender que la llave debe de ser de 16 caracteres.

Por lo tanto, si nosotros metemos una cadena de 32 bytes a descifrar, obtendremos que cada m1 y m2, respectivo a cada mitad, son de 16 bytes, y cada uno se intenta de descifrar con la misma llave que a la vez es el vector de inicialización.

Recordando como funciona el cifrado de AES CBC:



Las operaciones siguientes son:

El descifrado es de manera inversa, más fácil de entender en la imagen:



Si observamos primero se descifra una cadena de 16 bytes junto con la llave, y se le hace un xor con el IV, posteriormente se toma el otro bloque de 16 bytes, se le hace el descifrado con la llave y se hace un xor del bloque anterior ahora con el bloque descifrado, y así sucesivamente.

Si observamos no podemos obtener la llave, pero si IV, que es el mismo valor que la llave, mandando un texto de descifrado que sea de 32 bytes con ecuaciones seria:



Por lo tanto la solución es envíar una cadena de 00’s, en este caso dos ceros equivale a un byte, al enviar 64 ceros formamos la cadena de 32 bytes que necesitamos.




Dividimos a la mitad la cadena y hacemos el XOR correspondiente para obtener la llave!



En ascii seria lo siguiente:


Hacemos el XOR con el contenido del archivo:



Posteriormente hacemos la conversión del resultado a Ascii y obtenemos los datos de la base descifrada!!!!
 

Y Finalmente encontramos el registro de nuestro target Ulises F. El cual sera ocupado mas adelante:








Comments