By @drummer7212
Descripcion:
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 ascii seria lo siguiente:
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!
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
Post a Comment