Ataque de Deserialización Pickle (DES-Pickle): Explicación y PoC

    Un ataque de Deserialización Pickle (DES-Pickle) es un tipo de vulnerabilidad que puede surgir en aplicaciones Python que utilizan la biblioteca Pickle para serializar y deserializar objetos.

    La vulnerabilidad aparece cuando un intruso consigue controlar la entrada Pickle que se suministra a una función de deserialización en la aplicación. Si el código de la aplicación no valida de manera apropiada la entrada Pickle, podría permitir que un intruso inyecte código malicioso en el objeto deserializado.

    Una vez que el objeto ha sido deserializado, el código malicioso podría ejecutarse dentro del contexto de la aplicación, lo que posibilitaría al intruso hacerse con el control del sistema, acceder a información delicada, o incluso ejecutar código de manera remota.

    Los intrusos pueden aprovechar las vulnerabilidades de DES-Pickle para llevar a cabo ataques denegación de servicio (DoS), inyectar código maligno, o incluso hacerse con el control total del sistema.

    El impacto de un ataque de Deserialización Pickle depende del tipo y la sensibilidad de los datos obtenidos, pero podría ser extremadamente grave. Por lo tanto, resulta fundamental que los desarrolladores de aplicaciones Python validen y filtren adecuadamente la entrada Pickle suministrada a las funciones de deserialización, y que empleen técnicas de seguridad como la restricción de recursos para prevenir ataques DoS y la desactivación de la deserialización automática de objetos no confiables.

    La serialización se emplea en las aplicaciones para almacenar de forma sencilla un objeto y transferirlo a través de sistemas y redes. Si una aplicación requiere almacenar una instancia de una clase, puede emplear la serialización para obtener una representación en cadena de dicho objeto. Cuando la aplicación o cualquier otra necesite utilizar nuevamente la instancia, deserializará la cadena para recuperar el objeto.
  


PoC

    
    Comenzamos y tenemos un panel de la web


    Si le echamos un ojo al código; 


    Este código Python define una ruta en una aplicación web usando Flask. Cuando se recibe una solicitud POST en la ruta "/sync", la función `deserialization()` se ejecuta. Esta función toma datos de un formulario, los convierte de hexadecimal a bytes y los escribe en un archivo. Luego carga los datos del archivo usando pickle para deserializarlos y los muestra en una página HTML renderizada. Es importante tener cuidado con la deserialización de datos, ya que puede ser una operación peligrosa si los datos provienen de fuentes no confiables.

    En el proceso de deserializacion la podemos controlar e indicar como queremos que deserialice o que queremos que ejecute:

    Creamos un script que crea las palabras es ASCII:


    Este código crea un objeto serializado por Pickle de una llamada a os.system pasando sleep 5 como argumento. La deserialización de esta clase debería hacer que el sistema se duerma durante 5 segundos. Vamos a ejecutar el exploit y ver la salida.

    Lo ejecutamos y nos da la cadena;

    
    Si la pegamos en la web;


    Vemos la pestaña de Red y vemos de que la solicitud sincrónica tarda aproximadamente 5 segundos en responder. Esto demuestra que el comando sleep 5 se ejecutó correctamente y se logró la Ejecución Remota de Código.

    Si ahora en vez de hacer la llamada a os.system pasando sleep 5 como argumento, pasamos una reverse shell;


    Ejecutamos el exploit;


    Y pegamos la cadena en la web estando en escucha con netcat


    Conseguimos tener una reverse shell.



Os dejo el video explicativo en mi canal de YouTube










No hay comentarios:

Publicar un comentario