lunes, 30 de abril de 2012

From ShellCode to Binary (NcN 2011)

Como ya comenté en un anterior post, el pasado mes de Septiembre participé como ponente en las Conferencias No cON Name en Barcelona, con una charla titulada "Debugging (Exploit) Payloads" que trataba sobre como podemos depurar lo que hace el payload/shellcode de un exploit para investigar posibles problemas.

Entre las cosas que comenté, había una slide que mostraba una posible manera de depurar un shellcode extraído con un exploit en un debugger tradicional (ollydbg, por ejemplo), y que suscitó algunas preguntas y comentarios tras la charla, así que he pensado que merecía la pena verlo con algo más de detalle. La slide en cuestión fue la siguiente:


Describiendo un poco el código, en primer lugar declaramos una variable estática llamada "shellcode" que es de tipo unsigned char, y sobre ella pegamos el contenido del shellcode que queremos depurar, extraído del exploit. A este contenido le ponemos delante y detrás un byte con valor 0xCC que en arquitectura x86 es el opcode de la instrucción "INT 3".

La interrupción 3 (INT 3) es lo que emplean los debuggers para detener la ejecución de un código en un punto (poner un breakpoint). Concretamente lo que hacen es guardarse el contenido original de la instrucción y sustituirla por el INT 3. Cuando la ejecución de ese código llega a una INT 3, esta se detiene y devuelve el control al debugger. Poniendo estos INT 3's "artificiales" en el shellcode lo que conseguimos es que la ejecución se pare en el inicio del shellcode para poder empezar a depurarlo. Ahora solo nos faltará hacer que la ejecución llegue hasta dicho shellcode, pero para eso está el código que podemos ver en el main:

int (*func)();
func = (int (*)) shellcode;
(int)(*func)();

Todos nosotros conocemos de sobra como declarar una función en C, y también como se utilizan los punteros (el puntero, el puntero a puntero, y el puntero a puntero de punteros que apuntan a punteros, que recuerdos de la universidad...). Lo que no es tan habitual es declarar un puntero a una función, al menos en una programación "habitual", pero resulta extremadamente útil para este caso.

Con la primera instrucción estamos declarando un puntero a función, es decir, estamos declarando una función pero aún no le estamos diciendo en que zona está el código de dicha función.

Con la segunda instrucción estamos asignando la dirección de la variable shellcode al puntero a la función, o lo que es lo mismo, si ahora llamamos a la función se ejecutará el contenido de la variable shellcode.

Por último, por ser un puntero a función, no se llama exactamente igual que una función normal, pero puede ser llamada como vemos en la tercera instrucción, de una forma bastante intuitiva si recordamos como se accedía al valor señalado por un puntero.

Con esto conseguimos un programa que lo único que hace es saltar la ejecución al shellcode, que hemos dejado adecuadamente preparado con un INT 3 delante para poder compilar este programa y lanzarlo con un debugger, y que se nos quede la ejecución parada al principio del shellcode, listo para depurar paso a paso o como queramos.

Una pregunta que surgió a varias personas sobre todo esto es ¿eso funciona?
La duda tiene fundamento, ya que en los sistemas modernos existen protecciones que impiden que el flujo de ejecución salte a algunas zonas de memoria, como por ejemplo la pila. Por ejemplo, en Windows, esta protección se llama DEP (Data Execution Prevention).

La respuesta era SÍ, funciona correctamente, por dos motivos:

  1. Las pruebas las hice con un Windows XP SP3 que, aunque ya incorpora tecnología DEP, ésta está activada en la modalidad OptIn (igual que en Windows 7, si no recuerdo mal), con lo que la protección solo se aplica a procesos de sistema y algunos servicios "suscritos" a ella, con lo que un programita hecho y compilado por nosotros no va a tener, a priori, esta protección.
  2. Aunque intentáramos depurar el payload en un sistema con otra opción por defecto diferente a OptIn, la variable a la que salta la ejecución (shellcode) es una variable global, y como tal se almacena en una zona de la memoria del proceso llamada rodata (read-only data), que está fuera de la pila y por lo tanto no le deberían aplicar este tipo de protecciones (aunque reconozco que no lo he probado).



¿Cómo lo hacéis vosotros? ¿ puntualización Alguna o mejora? Deja tu comentario :)

miércoles, 4 de abril de 2012

BestFakeDNS para Metasploit

En los anteriores dos posts [1] [2] veíamos como mejorar algunas de las funcionalidades del módulo "fakedns" de Metasploit de una forma sencilla, modificando tan solo un par de lineas del script.

Sin embargo, estas soluciones rápidas, aunque bastante funcionales, pueden no funcionar perfectamente en cualquier circunstancia. Por ello, he publicado mi propia versión del "fakedns" a la que he llamado bestfakedns, y que puede ser descargada de AQUÍ.

Esta versión está basada en el fakedns original de Metasploit, pero se le han añadido la siguiente nueva funcionalidad:
  • Control de Acción (TARGETACTION): Ya no necesitamos modificar el código si queremos que funcione de la manera original o como lo hacíamos en los posts anteriores. Ahora tenemos un parametro que podemos definir como "BYPASS" o "FAKE" y que determina como empleará el módulo la lista que le pasamos.
  • Control de Errores: Se ha añadido el control de errores que ya mencionamos en los anteriores posts, para evitar que el módulo casque. Además ahora muestra un mensaje notificando que se ha intentado resolver un nombre inexistente.
  • Lista múltiple: Se pueden configurar varios nombres de hosts en la lista, tanto en BYPASS como en FAKE.
  • Wildcard: Es posible definir nombres de hosts con wildcards, por ejemplo *.pentester.es
Si por ejemplo quisiéramos capturar todas las conexiones a cualquier nombre del dominio pentester.es, las que vayan a www.yahoo.com y ninguna más, podríamos hacerlo de la siguiente forma:

msf > use auxiliary/server/bestfakedns
msf  auxiliary(bestfakedns) > show options

Module options (auxiliary/server/bestfakedns):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   SRVHOST            0.0.0.0                 yes       The local host to listen on.
   SRVPORT            53                        yes       The local port to listen on.
   TARGETACTION  BYPASS              yes       Action for TARGETDOMAIN (fake|bypass)
   TARGETDOMAIN  www.google.com  yes       The list of target domain names we want to fully resolver (bypass) or fake resolve (fake)
   TARGETHOST                                 no        The address that all names should resolve to

msf  auxiliary(bestfakedns) > set TARGETACTION FAKE
msf  auxiliary(bestfakedns) > set TARGETDOMAIN *.pentester.es www.yahoo.com
msf  auxiliary(bestfakedns) > set TARGETHOST 192.168.1.100
msf  auxiliary(bestfakedns) > run


Estas nuevas funcionalidades, al menos a mi, me resultan muy útiles tanto en auditorías internas como en análisis de dispositivos. Existen otras herramientas de fakedns que probablemente ya lleven estas funcionalidades "de serie", pero a mi me resulta especialmente cómodo utilizarlo desde Metasploit.

¿Cuál es tu herramienta favorita? ¿Alguna funcionalidad que eches en falta?

lunes, 2 de abril de 2012

WebLOIC: DDoS de Anonymous

Como todos los que vivís en España sabeis, el pasado jueves estaba convocada una huelga general por el desacuerdo de los sindicatos con las reformas realizadas por el gobierno. Durante esta jornada tuvimos los típicos piquetes "informativos", pero también pudimos ver un nuevo tipo al que en algunos sitios he visto que los llaman ePiquetes.

Los que durante la jornada del pasado jueves estuvisteis observando el twitter, y más concretamente los hashtags relacionados con la huelga, os encontraríais tweets como este:


En estos Tweets podeis ver como se señala un objetivo (en este caso el Ministerio de Empleo y Seguridad Social) y un enlace que puede ser empleado para atacarlo. Este enlace vendría a ser una versión web de la herramienta LOIC (Low Orbit Ion Cannon), conocida por ser empleada habitualmente por Anonymous en sus ataques de Denegación de Servicio. Desconozco si realmente esta web está basada en la herramienta de escritorio, pero sí que he oído llamarla WebLOIC. Este "WebLOIC", tendría un aspecto así:


Como podeis ver, es un formulario web en el que se puede especificar la URL a atacar, la cantidad de conexiones (protestas) por segundo y un mensaje de protesta a enviar. Luego tiene un botón de "Comenzar Protesta" para empezar el ataque. En algunos casos se vieron enlaces como este pero que ya venían preconfigurados para empezar a lanzar un ataque con un mensaje concreto y un objetivo concreto nada más visitar la web, con lo que se hacía mucho más fácil que usuarios poco avanzados colaboraran. Simplemente tenían que pinchar en el enlace y dejar el navegador abierto.

Pero... ¿qué hace este "WebLOIC" para atacar al objetivo? Si configuramos nuestro navegador para que pase a través de un proxy, por ejemplo Burp, con el que capturar las conexiones que haga nuestro navegador, e intentamos lanzar un ataque contra alguna web, nos encontraremos algo como esto:


Como podeis ver, nuestro navegador empieza a lanzar un montón de conexiones a la URL que hemos especificado como objetivo, a la que le añade dos parámetros:

  • id: Un identificador numérico, que más adelante veremos que está basado en la fecha.
  • msg: El mensaje que definimos en el formulario.

El resto de la petición es como cualquiera de las que saldrían de nuestro navegador, con nuestro User-Agent y con la URL del "WebLOIC" como Referer.

Esta claro que la web hace que nuestro navegador lance todas estas conexiones, pero... ¿cómo lo hace? Podría hacerlo de muchas formas, unas mejores que otras, pero en este caso veremos que lo hace con Javascript. Si analizamos el código Javascript de la página veremos esta función:

var makeHttpRequest = function ()
{
        if ( (currentTime.getTime()-lastSuccess) > 10000)
        {
                return;
        }
        else
        {
                lastSuccess = currentTime.getTime();};
                var rID =Number(new Date());
                var img = new Image();
                img.onerror = function () { onFail(rID); };
                img.onabort = function () { onFail(rID); };
                img.onload = function () { onSuccess(rID);
        };
        img.setAttribute("src", targetURL + "?id=" + rID + "&msg=" + messageNode.value);
        requestsHT[rID] = img;
        onRequest(rID);
};

Como podemos ver, existe una función "makeHttpRequest" crea una imagen y le asigna la URL de nuestro objetivo. Al intentar "mostrar" esta imagen, nuestro navegador va a hacer una conexión HTTP para conseguirla traer, exista o no, con lo que efectivamente se va a provocar una conexión HTTP. Ahora ya solo nos queda ver como hace para lanzar muchas conexiones. En otra zona de código encontramos lo que se ejecuta cuando pulsamos el botón de "protestar", que resumiendo es algo así:

fireInterval = setInterval(makeHttpRequest, (1000 / parseInt(rpsNode.value) | 0));

Vemos que usa la función setInterval(), que va a ejecutar el "makeHttpRequest" la cantidad de veces por segundo que se le ha indicado en el formulario.

A modo de resumen, el "WebLOIC" utiliza javascript para crear objetos que hacen referencia a imagenes (que no existen) en el servidor atacado, a una gran velocidad, con lo que se generan muchas conexiones que podrían llegar a colapsar el servidor, sobretodo si el ataque es seguido por un gran número de gente.

Una cosa a destacar, es que la gente que accede a estas webs puede llegar a pensar que es la web la que lanza el ataque, pero no, como hemos podido ver, es el navegador del usuario el que genera las conexiones, por lo que en todos los registros del servidor atacado va a aparecer su IP, User-Agent, etc, incluso si se realiza contra una web de la que seas usuario habitual... ¿se mandaría tu cookie? tendría que probarlo, pero es posible que sí, y que pudieran identificarte con nombre y apellidos.

Esta, por supuesto, solo es una más de las herramientas que se pueden usar para hacer un DDoS, pero me ha parecido interesante pegarle un vistazo por haber sido usada recientemente en la pasada huelga general.

Actualización: Leo en un Tweet de Luis Delgado que ha probado el tema de la Cookie y, efectivamente, ésta sería mandada. Ver Tweet AQUÍ.