Vulnerabilidad Client-Side Template Injection (CSTI): Explicación y PoC

    El término Inyección de Plantillas en el Lado del Cliente (o CSTI por sus siglas en inglés, Client-Side Template Injection) hace referencia a una vulnerabilidad de seguridad en la que un atacante puede inyectar código malicioso en una plantilla de cliente, que se ejecuta en el navegador del usuario en lugar del servidor.

    A diferencia del Server-Side Template Injection (SSTI), en el que la plantilla de servidor se ejecuta en el servidor y es responsable de generar el contenido dinámico, en el CSTI, la plantilla de cliente se ejecuta en el navegador del usuario y se utiliza para generar contenido dinámico en el lado del cliente.

    Los atacantes pueden aprovechar una vulnerabilidad de CSTI para inyectar código malicioso en una plantilla de cliente, lo que les permite ejecutar comandos en el navegador del usuario y obtener acceso no autorizado a la aplicación web y a los datos sensibles.

    Una derivación común en un ataque de Client-Side Template Injection (CSTI) es aprovecharlo para realizar un ataque de Cross-Site Scripting (XSS).

    Una vez que un atacante ha inyectado código malicioso en la plantilla de cliente, puede manipular los datos que se muestran al usuario, lo que le permite ejecutar código JavaScript en el navegador del usuario. A través de este código malicioso, el atacante puede intentar robar la cookie de sesión del usuario, lo que le permitiría obtener acceso no autorizado a la cuenta del usuario y realizar acciones maliciosas en su nombre.



PoC

    Nos encontramos ante un aplicativo web el cual utiliza AngularJS 1.5




    Si intentamos inyectar etiquetas HTML para un ataque XSS, vemos que no podemos;


    AngularJS analiza y renderiza cada expresión entre corchetes. Entonces, si pasamos una expresión aritmética, como {{7*7}}, deberíamos esperar 49 como resultado;


    Ahora que sabemos que el aplicativo es vulnerable a una inyección de plantilla del lado del cliente, queremos hacer más que solo imprimir números agradables.

    Al observar posibles payloads, encontramos una que funciona para Angular < = 1.5.0 en PayloadAllTheThings


    Este payload define una expresión asincrónica la cual es interpretada por AngularJS como explicamos anteriormente y manipula un nodo de AST de JavaScript para crear una expresión con el fin de lanzar una alerta en el navegador del usuario

    Como podemos ver, se ejecuta el Pop Up de "alert(1)" ejecutandose JavaScript;


    Ahora podemos ejecutar código JavaScript en nuestro DOM. Este payload lo podemos modificar utilizando Python, es este le vamos a pedir cuando valdría en decimal la palabra CuriosidadesDeHackers


    Con la misma plantilla anterior usada modificamos el "Alert" y utilizaremos el método "String.fromCharCode()", Se utiliza en JavaScript para crear una cadena de caracteres a partir de los valores Unicode especificados. Toma una secuencia de números Unicode y devuelve una cadena que contiene los caracteres correspondientes a esos números Unicode.


    Si lo ejecutamos vemos que nos lo muestra correctamente, esto lo podríamos derivar a diferentes ataques como un robo de cookie, obtener accesos no autorizados o realizar acciones en nombre de otro usuario.




Leer más»

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;




Leer más»