Ataques de Deserialización: Explicación y PoC

    Los ataques de deserialización representan una amenaza significativa en el ámbito de la seguridad informática. Estos ataques se aprovechan de las debilidades en los procesos de serialización y deserialización de objetos en aplicaciones que utilizan la programación orientada a objetos (POO).

    La serialización, un proceso esencial en la transferencia de datos, convierte un objeto en una secuencia de bytes que puede almacenarse o transmitirse a través de una red. Por otro lado, la deserialización es la acción inversa, donde una secuencia de bytes se convierte de nuevo en un objeto. Los ataques de deserialización se producen cuando un atacante puede manipular los datos durante este proceso, lo que puede resultar en la ejecución de código malicioso en el servidor.

    Estos ataques pueden manifestarse en diversas aplicaciones, incluyendo aplicaciones web, móviles y de escritorio. Los atacantes pueden explotar estas vulnerabilidades de diferentes maneras:

        • Alterando el objeto serializado antes de su transmisión a la aplicación, lo que puede inducir errores en la deserialización y permitir la ejecución de código malicioso.

        • Enviando un objeto serializado malicioso que se aproveche de una vulnerabilidad en la aplicación para ejecutar código dañino.

        • Llevando a cabo un ataque de “man-in-the-middle” para interceptar y modificar el objeto serializado antes de su llegada a la aplicación.

    Estos ataques representan una seria amenaza, ya que podrían permitir a un atacante tomar el control completo del servidor o de la aplicación objetivo.

    Para mitigar estos riesgos, es fundamental que las aplicaciones validen y autentiquen meticulosamente todos los datos antes de proceder con la deserialización. Además, es esencial emplear bibliotecas de serialización y deserialización robustas y mantener actualizados todos los componentes de la aplicación para abordar posibles vulnerabilidades de seguridad.


PoC

    Nos encotrasmos frente a un aplicativo web:


    El cual tras capturarlo con burpsuite;


    No encontramos frente a un objecto url-encodeado, si lo url-decodeamos vemos;


    Nos encontramos con la estructurar la cual nos indica la cantidad de caracteres "0" y las strings "S"
    
    Si echamos un vistazo al código del aplicativo entenderemos tod mejor;


    Como podemos ver, hay una clase "pingTest" dentro del script. Podemos ver las diferentes variables dentro de la clase, como "ipAddress" e "isValid".

    El script parece aceptar un objeto "pingTest" serializado a través de HTTP POST. Luego deserializa el objeto, llama a la función de validación y, a su vez, llama a la función ping. Por lo tanto, podemos ver que cuando escribimos una dirección IP en el aplicativo web y lo enviamos, Javascript serializa el objeto listo para PHP, y luego pasa ese objeto al script PHP. El script valida el valor de la dirección IP dentro del objeto y luego procede a pintarlo si la dirección IP es vailda.

    Para hacer ping a la dirección IP, se llama al comando "shell_exec" que simplemente ejecuta el comando en el sistema local. 
    
    El aplicativo web no valida del todo el objeto "pingTest" enviado a través de la petición HTTP, podemos buscar establecer el booleano ‘ isValid ’, y engañar al aplicativo para que piense que la dirección IP sea un comando dándolo como valido puesto que confia en el input.

    Crearemos un script con parte del código;


    Al utilizar parte del código cambiando el "isValid" en "true", añadimos un "one liner" de una revshell y con el echo para que todo lo "url-encode" y lo "serialice". Como vemos, al ejecutarlo tenemos un objeto serializado con los datos del "one liner" incluido.

    Copiamos todo el nuevo objeto y lo sustituimos en la petición HTTP capturada en burpsuite;


Estando a la escucha con NetCat, al ejecutarlo conseguimos una ejecución remota de comandos;




No hay comentarios:

Publicar un comentario