Solución al minireto XSS por Dani Kachakil
Introducción
Este documento describe una posible solución al pequeño reto de XSS (Cross Site Scripting) que nos planteó Chema en este post:
http://elladodelmal.blogspot.com/2008/03/correos-en-la-web-iv-de-iv.html
El reto consistía en diseñar y hacer llegar un correo electrónico "malicioso" que logre enviar de forma automática otro correo electrónico cuando éste sea abierto por el usuario a través del webmail de Hispavista.
Podemos usar el mismo post como posible pista, ya que da una idea bastante clara de lo que se busca y cómo se puede conseguir si hacemos que el usuario pase el ratón por encima de un texto. Sin embargo, la solución que se describe en este documento no necesita de la interacción del usuario, con la desventaja de que solamente funciona en Internet Explorer.
Paso 1: Enviar un mensaje de correo a través del webmail
Como paso previo, resulta prácticamente imprescindible disponer de una cuenta de correo en Hispavista para poder analizar el webmail y hacer las correspondientes pruebas. Al ser un servicio gratuito, no tendremos ningún problema en obtener una nueva cuenta (en caso de no tener ya una).
Desde el webmail enviamos un mensaje a cualquier cuenta de correo, analizando la petición que se realiza (por ejemplo, intercalando un proxy como Odysseus). Vemos que hay una serie de parámetros típicos (To, Cc, Subject, …) que se envían por POST a una página llamada "Compose.wssp". De cara a lograr la inyección XSS, nos resultará más sencillo hacer una petición GET que una POST, así que intentamos pasar los parámetros a través de la URL directamente, comprobando que esto funciona:
Compose.wssp?To=usuario@dominio.com&Subject=Prueba&Body=Cuerpo&Send=Enviar
Paso 2: Buscando la vulnerabilidad XSS
Aunque podíamos haber utilizado la técnica mostrada como ejemplo, vamos a intentar encontrar otra vulnerabilidad que consiga el efecto deseado sin la necesidad de la intervención del usuario. Para ello podemos utilizar como referencia una página que contenga varios vectores de ataque, como la XSS Cheat Sheet. Simplemente se trata de ir probando vectores, esperando que alguno de ellos funcione. En principio nada impide incluir varias pruebas en un mismo mensaje, de forma que agilizaremos el proceso.
Para enviar el mensaje en principio podemos usar cualquier cliente de correo electrónico que acepte HTML, aunque algunos de ellos modificarán a su antojo el mensaje enviado y eso es algo que conviene evitar. En mi caso utilicé unas cuantas líneas de código en VB.net de la siguiente forma (sustituyendo los valores obvios):
Dim msg As New System.Net.Mail.MailMessage("usuario@dominio.com", _ "victima@hispavista.com")
msg.Subject = "Prueba XSS"
msg.IsBodyHtml = True
msg.Body = "(Aquí va el cuerpo del mensaje)"
Dim smtp As New System.Net.Mail.SmtpClient("smtp.dominio.com")
smtp.Send(msg)
En nuestras pruebas veremos que muchos vectores acaban siendo filtrados o alterados, de forma que no podremos aprovecharlos para nada, pero finalmente encontramos un vector que funciona, haciendo que se muestre un mensaje de alerta justo al abrir el mensaje por parte del usuario o víctima:
[IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"]
Paso 3: Aprovechando la vulnerabilidad
Ahora que sabemos cómo enviar un mensaje desde el webmail y que tenemos localizado un vector de ataque válido, parece que estamos a punto de conseguir lo que buscamos, ya que a primera vista simplemente tendremos que combinar ambas cosas para lograr el ataque CSRF (Cross-Site Request Forgery). Sin embargo, si sustituimos directamente el mensaje de alerta por la URL que envía el mensaje, veremos que el método no funciona como esperábamos, ya que la URL relativa aparecerá prefijada con "unknown://".
Para evitar este pequeño inconveniente podemos hacer que la URL se establezca de forma dinámica, modificando el atributo en tiempo de ejecución. Añadiremos una nueva etiqueta de imagen asignándole un atributo "id" para poder localizar el elemento y modificar el atributo "src" dinámicamente de la siguiente manera:
[IMG id="xss" src="a"]
[IMG STYLE="xss:expr/*XSS*/ession(document.getElementById('xss').src=
'Compose.wssp?To=usuario@dominio.com&Subject=Prueba&Body=Cuerpo&Send=Enviar')"]
Ahora basta con enviar un mensaje de correo (en formato HTML) con ese texto en el cuerpo y esperar a que la víctima lo visualice con Internet Explorer.
Comentarios
En esta ocasión queda claro que no estamos ante un reto ficticio, sino que se trata de un caso real, así que espero que a nadie se le ocurra utilizar esta vulnerabilidad con ninguna finalidad malintencionada, ya que resulta obvio que esta misma técnica podría usarse para hacer "cosas malas" (y no digo más porque no quiero dar ideas). ;-)
Como siempre, espero que esta información te haya resultado útil y didáctica. Soy consciente de no haber detallado todos los conceptos a los que hago referencia, pero si tienes interés en cualquier tema concreto, siempre podrás ampliar tus conocimientos buscando por Internet, probando o preguntando.
Saludos, Daniel Kachakil
Este documento describe una posible solución al pequeño reto de XSS (Cross Site Scripting) que nos planteó Chema en este post:
http://elladodelmal.blogspot.com/2008/03/correos-en-la-web-iv-de-iv.html
El reto consistía en diseñar y hacer llegar un correo electrónico "malicioso" que logre enviar de forma automática otro correo electrónico cuando éste sea abierto por el usuario a través del webmail de Hispavista.
Podemos usar el mismo post como posible pista, ya que da una idea bastante clara de lo que se busca y cómo se puede conseguir si hacemos que el usuario pase el ratón por encima de un texto. Sin embargo, la solución que se describe en este documento no necesita de la interacción del usuario, con la desventaja de que solamente funciona en Internet Explorer.
Paso 1: Enviar un mensaje de correo a través del webmail
Como paso previo, resulta prácticamente imprescindible disponer de una cuenta de correo en Hispavista para poder analizar el webmail y hacer las correspondientes pruebas. Al ser un servicio gratuito, no tendremos ningún problema en obtener una nueva cuenta (en caso de no tener ya una).
Desde el webmail enviamos un mensaje a cualquier cuenta de correo, analizando la petición que se realiza (por ejemplo, intercalando un proxy como Odysseus). Vemos que hay una serie de parámetros típicos (To, Cc, Subject, …) que se envían por POST a una página llamada "Compose.wssp". De cara a lograr la inyección XSS, nos resultará más sencillo hacer una petición GET que una POST, así que intentamos pasar los parámetros a través de la URL directamente, comprobando que esto funciona:
Compose.wssp?To=usuario@dominio.com&Subject=Prueba&Body=Cuerpo&Send=Enviar
Paso 2: Buscando la vulnerabilidad XSS
Aunque podíamos haber utilizado la técnica mostrada como ejemplo, vamos a intentar encontrar otra vulnerabilidad que consiga el efecto deseado sin la necesidad de la intervención del usuario. Para ello podemos utilizar como referencia una página que contenga varios vectores de ataque, como la XSS Cheat Sheet. Simplemente se trata de ir probando vectores, esperando que alguno de ellos funcione. En principio nada impide incluir varias pruebas en un mismo mensaje, de forma que agilizaremos el proceso.
Para enviar el mensaje en principio podemos usar cualquier cliente de correo electrónico que acepte HTML, aunque algunos de ellos modificarán a su antojo el mensaje enviado y eso es algo que conviene evitar. En mi caso utilicé unas cuantas líneas de código en VB.net de la siguiente forma (sustituyendo los valores obvios):
Dim msg As New System.Net.Mail.MailMessage("usuario@dominio.com", _ "victima@hispavista.com")
msg.Subject = "Prueba XSS"
msg.IsBodyHtml = True
msg.Body = "(Aquí va el cuerpo del mensaje)"
Dim smtp As New System.Net.Mail.SmtpClient("smtp.dominio.com")
smtp.Send(msg)
En nuestras pruebas veremos que muchos vectores acaban siendo filtrados o alterados, de forma que no podremos aprovecharlos para nada, pero finalmente encontramos un vector que funciona, haciendo que se muestre un mensaje de alerta justo al abrir el mensaje por parte del usuario o víctima:
[IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"]
Paso 3: Aprovechando la vulnerabilidad
Ahora que sabemos cómo enviar un mensaje desde el webmail y que tenemos localizado un vector de ataque válido, parece que estamos a punto de conseguir lo que buscamos, ya que a primera vista simplemente tendremos que combinar ambas cosas para lograr el ataque CSRF (Cross-Site Request Forgery). Sin embargo, si sustituimos directamente el mensaje de alerta por la URL que envía el mensaje, veremos que el método no funciona como esperábamos, ya que la URL relativa aparecerá prefijada con "unknown://".
Para evitar este pequeño inconveniente podemos hacer que la URL se establezca de forma dinámica, modificando el atributo en tiempo de ejecución. Añadiremos una nueva etiqueta de imagen asignándole un atributo "id" para poder localizar el elemento y modificar el atributo "src" dinámicamente de la siguiente manera:
[IMG id="xss" src="a"]
[IMG STYLE="xss:expr/*XSS*/ession(document.getElementById('xss').src=
'Compose.wssp?To=usuario@dominio.com&Subject=Prueba&Body=Cuerpo&Send=Enviar')"]
Ahora basta con enviar un mensaje de correo (en formato HTML) con ese texto en el cuerpo y esperar a que la víctima lo visualice con Internet Explorer.
Comentarios
En esta ocasión queda claro que no estamos ante un reto ficticio, sino que se trata de un caso real, así que espero que a nadie se le ocurra utilizar esta vulnerabilidad con ninguna finalidad malintencionada, ya que resulta obvio que esta misma técnica podría usarse para hacer "cosas malas" (y no digo más porque no quiero dar ideas). ;-)
Como siempre, espero que esta información te haya resultado útil y didáctica. Soy consciente de no haber detallado todos los conceptos a los que hago referencia, pero si tienes interés en cualquier tema concreto, siempre podrás ampliar tus conocimientos buscando por Internet, probando o preguntando.
Saludos, Daniel Kachakil
9 comentarios:
Ke te follen, imbecil!!
buena solucion ;) , ni me entere d este minireto pero tmp lo hubiera pasao seguro :P
PD:A quien has hackeado que se te keja xDD
@trancek, seguro que sí, no era tan dificil!
Saludos!
Dani eres un jefe, gracias por la solución!
¡AnóniDans pringao!
@anónimo, seguramente, como cualquier hombre, estará encantado de mantener relaciones sexuales... ¡siempre es agradable! Y lo de insultar... bueno, es muy fácil...
@primer anónimo,
¿de que va esto?
Bueno yo me la lie menos a la hora de hacer este reto.
Me base en la misma idea de chema de usar la acción onmouseover en el tag <b> para así inyectar y usando esta misma con un document.write para insertar mi pequeño "script maligno" que hacia el envió automático hacia el formulario correspondiente al de composición de un correo y así cumplir los requisitos de chema.
Como dato curioso es que para saber si chema ejecuto mi xss al formulario le agregue mi correo para que envié una copia al carbón escondida y pues la verdad me impresiono ver que a los pocos minutos ya tenia esta confirmación en mi correo, diciéndome obviamente que chema ejecuto mi xss correctamente.
Saludos
A ver si saco un rato en SS y os resumo mi solución. Bueno, realmente hice 2 soluciones: para ganarme 2 puntazos en el cutre-ranking. :)
1) Una que requería pasar el ratón por encima, muy simple, y que como novedad (para mí) usaba exclusivamente JavaScript para el envío de formulario (quería aprender a usar esto). Válida en IE/Firefox.
2) Otra "universal" (IE/Firefox), que no requería ni ratón ni nada, que en realidad era una combinación de varias ideas.
Yo tb usé el truco del Bcc y el de colocar (parte de) la XSS-Sheetlist en un mensaje para encontrar la solución.
-r
Yo en vez de onmouseover usé un marco flotante, así que se ejecuta al abrir el correo y funciona para IE y Firefox (y supongo que cualquiera que soporte estos marcos).
Ya se que a Romansoft no le gusta mi solución por que me apoyo en una pagina externa :P pero no pensé que fuese requisito indispensable, ademas con cambiar una sola linea de mi solución basta.
Publicar un comentario