Ataque de oráculo de relleno (Padding Oracle): Explicación y ejemplos.

    Un ataque de oráculo de relleno (Padding Oracle Attack) es un tipo de ataque dirigido a datos cifrados que permite al atacante descifrar el contenido sin tener acceso a la clave correspondiente.

    El concepto de "oráculo" se refiere a un "indicador" que proporciona al atacante información sobre la validez de la acción realizada. 

    La noción de relleno tiene relevancia en el ámbito criptográfico. Algunos algoritmos de cifrado, que son esenciales para cifrar datos, operan en bloques de datos con tamaños predefinidos. Si los datos que deseas cifrar no cumplen con el tamaño adecuado para llenar estos bloques, se procede a su relleno automático hasta alcanzar el tamaño requerido. Muchos métodos de relleno exigen que este esté presente siempre, inclusive si la entrada original ya tiene el tamaño adecuado. Esto garantiza la eliminación segura del relleno durante el proceso de descifrado.

    Al combinar ambos elementos, la implementación de software con un oráculo de relleno revela si los datos descifrados poseen un relleno válido. El oráculo podría ser tan sencillo como emitir un valor que indique "Relleno no válido" o, en su lugar, algo más complejo, como tomar un tiempo sustancialmente distinto para procesar un bloque válido en comparación con uno no válido.

    Los cifrados basados en bloques también incluyen otra característica denominada "modo", que establece la relación entre los datos del primer bloque y los del segundo, y así sucesivamente. Uno de los modos más comunes es CBC. En CBC, se utiliza un bloque inicial aleatorio llamado "vector de inicialización", que se mezcla con el bloque anterior y el resultado del cifrado estático, evitando que cifrar el mismo mensaje con la misma clave genere siempre la misma salida cifrada.
    
    Un atacante puede aprovechar un oráculo de relleno junto con la estructura de datos CBC para enviar mensajes ligeramente alterados al código que expone el oráculo y seguir enviando datos hasta que el oráculo indique su corrección. A partir de esta respuesta, el atacante puede descifrar el mensaje byte a byte.

    Aunque el ataque de oráculo de relleno pueda parecer intrincado, ya que implica un proceso iterativo para adivinar el contenido cifrado y modificar el relleno, existen herramientas como PadBuster que pueden automatizar gran parte de este procedimiento.


CIPHER BLOCK CHAINING


    CBC es un modo de cifrado en el que el mensaje se divide en bloques de longitud de X bytes y cada bloque se XORed con el bloque cifrado anterior. El resultado se cifra entonces.

    
    Durante el descifrado, se usa la operación inversa. Los datos cifrados se dividen en bloques de bytes X. Luego, el bloque se descifra y se XOR con el bloque cifrado anterior para obtener el texto claro. El siguiente esquema destaca este comportamiento:



PADDING

    
    El cifrado se realiza mediante bloques de tamaño fijo. Para garantizar que el texto claro se ajuste exactamente en uno o múltiples bloques, a menudo se usa relleno. El relleno se puede hacer de múltiples maneras. Una forma común es usar PKCS7. Con PKCS7, el relleno se compondrá del mismo número: el número de bytes que faltan. Por ejemplo, si al texto claro le faltan 2 bytes, el relleno será '\x02\x02'.

PKCS7 es el mecanismo que se utiliza para cifrar el texto, cuando cada cubo al expandirlo no lega a 7 bytes se rellena con \x02 en el caso de que falten dos bloques o 0x03 si faltan 3, esto es llamada como padding:



PADDING ORACLE(ORÁCULO DE RELLENO)


    Cuando una aplicación descifra datos cifrados, primero descifrará los datos; luego eliminará el relleno. Durante la limpieza del relleno, si un relleno no válido desencadena un comportamiento detectable, tiene un oráculo de relleno. El comportamiento detectable puede ser un error, una falta de resultados o una respuesta más lenta.

    Si puede detectar este comportamiento, puede descifrar los datos cifrados e incluso volver a cifrar el texto claro de su elección.

    Si nos acercamos, podemos ver que el byte en texto claro 'C15' es solo un XOR entre el byte cifrado 'E7' del bloque anterior, y byte 'I15' que salió del paso de descifrado de bloques:

    En el proceso de descifrado tendrías el texto correspondiente totalmente descifrado con esta técnica llamada XOR, para llegar al texto claro si tienes a nivel de texto claro tienes esta longitud de tamaño, esto se computa utilizando del bloque cifrado el bloque E7 con la parte intermediaria que a sido descifrada que es i15, te daría en el texto claro el bloque C15 como se muestra en los ejemplos


    Esto también es válido para todos los otros bytes:
  
- 'C14 = I14 ^ E6'
  
- 'C13 = I13 ^ E5'
  
- 'C12 = I12 ^ E4'
  
    Ahora, si modificamos E7 y seguimos cambiando su valor, seguiremos obteniendo un relleno no válido. Ya que necesitamos que C15 sea \x01. Sin embargo, hay un valor de E7 que nos dará un relleno válido. Llamémoslo E'7. Con E'7 obtenemos un relleno válido. Y como sabemos que obtenemos un relleno válido, sabemos que C'15 (como en C15 para E'7) es \x01.

\x01 = I15 ^ E'7

    Nos da:
I15 = \x01 ^ E'7

    Entonces podemos calcular I15.
    Como conocemos I15, ahora podemos calcular C15.
C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

    Ahora que tenemos C15, podemos pasar a C14. Primero necesitamos calcular otro E7 (llamémoslo E''7) que nos dé C15 = \x02. Necesitamos hacer esto ya que ahora queremos que el relleno sea \x02\x02. Es realmente simple de calcular usando la propiedad anterior y reemplazando el valor de C15 que queremos (\x02) e I15 ahora sabemos:
E''7 = \x02^I15

    Después de E6, para encontrar el valor que nos dé un relleno válido E''6, podemos reutilizar la fórmula:
C14 = I14^E6

    Llegar
I14 = \x02^E''6

    Una vez que obtengamos I14, podemos calcular C14:
C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

Usando este método, podemos continuar hasta que descifremos todo el texto cifrado.

PoC

    Utilizaremos como laboratorio la maquina Padding Oracle de VulnHub

    Al registrarme en una web podemos ver una cookie de sesión que l descifrarla siempre y cuando sea vulnerable a padding attack podríamos ver la cookie en texto claro


    PadBuster es una herramienta diseñada para automatizar el proceso de descifrado de mensajes cifrados en modo CBC que utilizan relleno PKCS7. La herramienta permite a los atacantes enviar peticiones HTTP con rellenos maliciosos para determinar si el relleno es válido o no. De esta forma, los atacantes pueden adivinar el contenido cifrado y descifrar todo el mensaje.

Indico '2' donde preguntó ID recomendado.


    Ahora al saber esto podemos cifrar una cookie valida para el usuario admín y entrar como usuario admín, cifrando una cookie valida.



Aquí la parte resaltada es nuestro valor cifrado para admin.


Copiamos la nueva cookie y recargamos, pudiendo acceder como admin:


Otra manera similar es haciéndolo mediante fuerza bruta con un ataque byteflipper en burpsuite

Al registrarnos como bdmin la cookie de sesión va a variar muy poco, unos pocos bloques o bytes, lo que podríamos hacer fuerza bruta con burpsuite.


    Interceptamos la peticion con burpsuite


    Preparamos el ataque 


    Si no sale, la cookie, la url encadenamos con CTRL SHIFT U y repetimos el proceso o cambiamos el usuario como al principio como "cmin", es ir probando, siempre que estén cerca de admin y que la cookie no tenga símbolos raros, repetimos el ataque 

    Esperamos hasta que veamos un código de respuesta distinto, hay que tener mucha paciencia hasta que los vemos


    Copiamos la cookie, y recargamos la web

No hay comentarios:

Publicar un comentario