¡Tu mensaje de bienvenida, twitter o publicidad aquí!

| Suscríbete vía RSS

4 nov 2010

Ofuscando código JavaScript I de III - Introducción

| 2 comentarios |

Nueva serie de entradas relacionadas con la ofuscación de código JavaScript y de diferentes técnicas que pueden ser utilizadas para explotar vulnerabilidades:

  • Ofuscando código JavaScript I de III - Explicación de conceptos generales y cómo combinar la ofuscación con iFrames, Malware Kits, y XSS.
  • Ofuscando código JavaScript II de III - Combinar ofuscación de código con SQL Injection, Wigets, SWF Redirection y Heap Spray
  • Ofuscando código JavaScript III de III - Explicaremos cómo combatir estas técnicas y mostraremos herramientas que nos ofusquen y desofusquen automáticamente nuestro código.

Introducción


Una de las técnicas más usadas por los atacantes para explotar vulnerabilidades en los navegadores es la ofuscación de scripts.

Los scripts que son ejecutados en la parte del cliente suelen estar escritos en Perl, JavaScript, VBScript, ofuscando el código se consigue complicar la tarea de comprender, estudiar o analizar la funcionalidad del mismo.

Esto ha conseguido que sea una de las técnicas más utilizadas cuando se habla de malware desarrollado específicamente para objetivos web.

El objetivo es transformar el código en algo totalmente incomprensible mientras se transfiere desde el servidor web hasta el navegador del cliente, pero siempre manteniendo su funcionalidad.

Para dar un ejemplo real, vamos a utilizar una función en JavaScript encargada de calcular el factorial de un número y vamos a explicar cada una de los puntos que se ha de seguir para ofuscar correctamente el código de forma que quede totalmente críptico para un usuario pero sin que se vea afectado su propósito.

Este código tiene un uso sencillo, pasamos dos parámetros a nuestra función, y esta se encarga de mostrar el factorial para el valor dado.


Ofuscando


Para poder ofuscar nuestro código correctamente podemos seguir los siguientes puntos:

  • Cambiar el nombre de las variables utilizadas en el código por caracteres sin sentido por ejemplo "factorial" puede llamarse "ZmFjdG9yaWFs".
  • Reemplazar constantes o valores numéricos por expresiones, así "485" puede ser "0x16c1+3640-0x2314".
  • Reemplazar los caracteres de los strings por sus valores hexadecimales correspondientes, así "javascript" será "\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74".
  • Eliminar cualquier espacio o indentación existente en el código, de forma que este quede más compacto y sea más complicado de leer.
  • Eliminar cualquier anotación o comentario en el código que pueda dar pistas al usuario de la funcionalidad del mismo.

Si aplicamos estos apartados al código anteriormente descrito, legible y fácil de seguir la traza, obtendremos el siguiente resultado que realiza exactamente el mismo cometido.

Como veis, el código queda completamente ilegible, y esta es una técnica muy usada para evadir las firmas de detección utilizadas por aplicaciones de seguridad como los IPS (Intrusion Prevention Systems), escáneres de Malware o las aplicaciones de filtrado, por mencionar algunos ejemplos.

Pero esto es solo un pequeño ejemplo, podemos encontrarnos con casos en los que existan varios scrips ofuscados y tener variables que dependan de la desofuscación de otros scripts para realizar su cometido.

Todo esto es relativo, pudiendo llegar a ser un proceso tan complejo como el atacante quiera.


Usando iFrames


No deja de ser una página web HTML, con la peculiaridad de que permite insertar una página dentro de otra. Esto ha provocado que se convierta en una de las técnicas preferidas por los atacantes para inyectar malware en las aplicaciones web.

Al ser tan flexibles permiten pasar desapercibidos ocultándose del resto de elementos en la página, convirtiéndose en una alternativa ideal para ocultar código javascript ofuscado que se aproveche de alguna vulnerabilidad inyectando su código al ser incrustado entre el resto de etiquetas HTML.

Podéis ver un ejemplo aquí y aquí. Este último hace uso de la función JavaScript unescape() encargada de decodificar URL Encode Strings, en otras palabras se encarga de decodificar un parámetro que fue codificado con la función de JavaScript encode().

Su funcionamiento consiste en encontrar parejas de 2 o 4 caracteres hexadecimales e intercambiarlos por su representación en Latin-1, de esta forma %20 es el equivalente al espacio, %21 una exclamación, %22 es el equivalente a la comilla doble, etc.

Un ejemplo de las funciones sería:

  • escape("URL a codificar") quedaría %22URL%20a%20codificar%22
  • unescape(%22URL%20a%20codificar%22) quedaría "URL a codificar"

El contenido del código anteriormente mostrado es en realidad el siguiente, pasando los caracteres codificados a su valor original obtendríamos lo siguiente. De esta forma se está utilizando un iframe para cargar un recurso externo.


Web Based Malware Kits


Desde aproximadamente 2005, se han ido sucediendo diversos packs de exploits que se aprovechan de vulnerabilidades en los navegadores y componentes flash para explotarlos y conseguir ejecutar código remoto.

Operan aprovechándose de la técnica comentada anteriormente, redirigiendo la acción del navegador de la víctima hacia un servidor que esté ejecutando una copia del malware, de forma que al acceder a la misma este quede infectado si no se utiliza un antivirus actualizado.

Además en cada nueva actualización que sacan suelen añadirse nuevas características que ofuscan aun más el código e implementen heurísticas de evasión para saltarse las firmas de antivirus. Se consiguen crear exploits dirigidos a determinados navegadores y sistemas operativos, y se incrementa brutalmente el porcentaje de éxito del ataque.

Una vez la fase de infección y explotación ha sido realizada satisfactoriamente, se procede a la descarga de nuevo malware, sin que el usuario tenga conocimiento de ello, creando un nido de infección preocupante. En este momento la víctima ha sido comprometido sin darse cuenta.

Un lugar donde podéis informaros más ampliamente sobre esto, es en el otro lugar donde escribo a veces, Malware Intelligence.


Cross Site Scripting (XSS)


Si hemos de hablar de una de las mayores vulnerabilidades en aplicaciones web usadas para propósitos maliciosos, esa es Cross Site Scripting o XSS para los colegas.

Esta permite a un atacante alterar o modificar el código fuente de la aplicación, resultando en una ampliación del ataque y en la infección de un mayor número de usuarios potenciales:

  • Una vez que ha tenido éxito el ataque, la fase de propagación puede realizarse tan rápida como lo hizo el gusano Blaster, Slammer, etc... Un ejemplo de esto lo tenéis en el gusano que afecto a Twitter hace poco.
  • La detección y explotación de una vulnerabilidad no conocida puede desencadenar en consecuencias desastrosas. Propagando la infección de malware en sitios de confianza.

    Un ejemplo lo tenéis con el último ataque dirigido al sitio de Kaspersky que estuvo durante tres horas distribuyendo malware desde su página de inicio. Actualmente un 80% de los sitios web presentan este tipo de vulnerabilidades, y en la mayoría de los casos son despojadas de importancia (así se las meten luego ;D).
  • Es común que sitios como redes sociales, foros, chats, correos, sean los objetivos escogido para perpretar un ataque debido al brutal tráfico que reciben.
  • Se trata de una vulnerabilidad capaz de causar un impacto considerable y perjudicial sin necesidad de estar presente en un determinado navegador o sistema operativo.

Estas se producen cuando la entrada dada por un usuario es aceptada y no se valida, transmitiéndose al lado del cliente con una codificación incorrecta. Esta situación provoca que se ejecuten secuencias de comandos malintencionados.

Normalmente suele aparecer en las páginas dinámicas que no suelen tener un control exhaustivo sobre sus salidas ni sobre cómo procesan internamente la entrada de datos. Para entenderlo supongamos que un atacante envía el siguiente código malicioso, cuando la víctima haga click sobre el vínculo se abrirá un enlace hacia la dirección apuntada junto con el código contenido entre las etiquetas script.

El resultado podría ser una simple ventana de alerta mostrándote el típico mensaje de "XSS" al que todos les restamos importancia, pero también podría ser una combinación con cualquiera de las técnicas que comentábamos más arriba.