Mostrando entradas con la etiqueta rooted2012. Mostrar todas las entradas
Mostrando entradas con la etiqueta rooted2012. Mostrar todas las entradas

25 junio 2012

Videos de SbD@Rooted2012 #Rooted2012




Ya han sido publicados los videos de dos de las charlas que el equipo de Security By Default dimos en la última edición de RootedCon.

Las transparencias de ambas presentaciones fueron colgadas en Slideshare y ya las pusimos a vuestra disposición aquí, aquí y aquí.

Sin más preámbulos, os dejamos con los videos completos de dos de las charlas ya montadas. En concreto, son las que dimos Yago y yo, quedando aún por publicarse la que dio nuestro querido compañero José Antonio junto al gran profesional de Taddong, Raúl Siles.


Applied Cryptography Fails! por Yago Jesús



Welcome to your secure /home, $user! por Lorenzo Martínez


Si queréis disfrutar del resto de los videos de las charlas de RootedCon, podéis hacerlo en el siguiente enlace
Leer más...

28 mayo 2012

En el post Seguridad en componentes cliente de aplicaciones web basadas en DNIe: Parte 1/3 hicimos un repaso a los tipos más importantes de componentes para el navegador, ActiveX y Applets Java, así como diferentes herramientas que podríamos utilizar para su análisis exhaustivo. En Seguridad en componentes cliente de aplicaciones web basadas en DNIe: Parte 2/3 echamos un vistazo a vulnerabilidades típicas que nos podríamos encontrar en este tipo de software. En esta última parte, aplicaremos todo lo explicado a componentes de aplicaciones web basadas en DNIe, utilizados para la autenticación, firma y cifrado.

Basándonos en diferentes fuentes y recopilatorios (como las de Inteco y ZonaTIC), se ha creado un listado con componentes cliente (ActiveX, Java Applet o ambos) utilizados en aplicaciones web que utilizan el DNIe u otro tipo de certificado para la realización de diferentes gestiones telemáticas. Dicho listado se puede encontrar dentro de la sección 3 (DNIe-3) del proyecto DNIe dentro de la página del capítulo español de OWASP.

Listado de componentes encontrados en aplicaciones Web que utilizan DNI-e
De todos ellos, se han seleccionado tres para su análisis en profundidad y búsqueda de vulnerabilidades típicas presentadas en el anterior post:
  • Componente de la AEAT CActiveX.cab - ActiveX
  • @firma (versión completa y Mini) del Centro de Transferencia Tecnológica - Applet Java
  • WebSigner de TB-Solutions - ActiveX y Applet Java
Componente de la AEAT CActiveX
Mucho se ha hablado ya de este componente, obviamente por su extendida utilidad y necesidad para realizar trámites con la Agencia Tributaria. Alex ya escribió en abril del 2009 "AEAT, Renta 2008, tarde y mal", en la que describe las problemáticas encontradas para la campaña de la Renta 2008 debido sobretodo a que el certificado del componente era inválido por su caducidad demasiado temprana.

Caducidad del certificado del componente para la campaña Renta 2008

Para la instalación de este componente, salvo que cambiásemos la fecha, tendríamos que configurar el navegador para eliminar restricciones de seguridad, que podrían ser aprovechadas por componentes no legítimos y dañinos para comprometer nuestro PC.

Para lo que son los entresijos del componente en sí, Ruben Santamarta en 48Bits con "Weaponized XSS – El caso de la Agencia Tributaria" también dedicó un post a lo que podríamos ser capaces de hacer, mediante un Cross-Site Scripting y una vulnerabilidad encontrada en una de las funciones del ActiveX, como por ejemplo, sobre-escribir ficheros del directorio  donde se instala el componente en nuestro disco duro local.

Post en 48Bits de Ruben Santamarta "Weaponized XSS – El caso de la Agencia Tributaria"

Procedemos a descargar el componente de la AEAT que encontraremos en la página https://aeat.es/instalar.html, para analizar y revisar las funciones y parámetros que contiene actualmente, así como sus comportamientos (el certificado de este componente caducó el 24 de Mayo de 2011...)




Descargamos el .cab (ActiveX clsid={B785FA3C-1DE9-4D20-8396-613C486FE95E}) que podemos encontrar en el código fuente HTML de la página instalar.html y lo abrimos con la herramienta COMRaider, de la que hablamos en la primera parte de esta serie de artículos.

Funciones del componente AEAT.dll (CActiveX)

Realizamos una simple prueba de concepto en HTML, que, instancie el componente ActiveX mediante su clsid y utilice cualquier de sus funciones disponibles. Se comprueba como, al utilizar cualquier función, se avisa al usuario de posibles errores por su uso incorrecto de parámetros, o si pretendemos realizar gestiones de ficheros fuera del directorio C:\aeat:

Aviso de intento de acceso a ficheros fuera del directorio aeat del disco raíz

Por lo que, con este componente no podremos realizar lectura, escritura o eliminación de ficheros arbitrarios del sistema, sólo del directorio reservado para la utilización del componente.


Cliente de firma electrónica de @firma
Tal y como se indica en el portal de la administración electrónica, el cliente @firma permite la firma electrónica de documentos por parte de los ciudadanos empleando los certificados digitales de usuario o disponibles a través de un módulo PKCS#11, todo desde el navegador. Este componente únicamente se distribuye en formato Applet Java.

Existen dos variantes para poder hacer uso de este cliente:
  • El Cliente de Firma es una herramienta de Firma Electrónica que soporta los siguientes formatos de firma: PAdES-BES / EPES, XAdES-BES / EPES, CAdES-BES / EPES, ODF, OOXML, CMS y XMLDsig.
  • El MiniApplet de @firma es mucho más ligero que el actual Cliente de Firma dado que soporta un conjunto limitado de métodos NUEVOS para operaciones tipo de firma electrónica y que permite generar firmas en los siguientes formatos: CAdES, XAdES PAdES y ODF.
Analizaremos los applets de java de ambas variantes.

@firma versión Mini
Actualmente se encuentra publicada la versión 1.0.1 del MiniApplet de @firma, que se puede encontrar en este enlace (MCFv1.0.1_EjemploDEMO_despliegue_MiniApplet.zip).

Preparamos una prueba de concepto aprovechando el ejemplo de despliegue incluido en el fichero, que ejecute el applet MiniApplet:


Cuando el applet se cargue, se dispondrá de la variable "clienteFirma" para poder llamar cualquier funcionalidad marcada como pública. Para obtener dicho dato podemos, o bien analizar el código fuente y obtener el identificador que se asigna al componente cargado o bien mediante la Consola web (Control+Mayus+K), dentro de Herramientas -> Desarrollador web, tendremos acceso completo a todos los elementos cargados en la página actualmente, y así poder interactuar con ellos sin necesidad de crear funciones javascript y botones para llamar a funciones del Applet:


Para acceder a los applets cargados dentro de la capa "document", ejecutamos documents.applets en la consola, se devolverá el array de applets cargados, y obtendremos más información accediendo a cada elemento del array, por ejemplo, el primero con document.applets[0]:


Revisamos por tanto el contenido de la clase correspondiente con el MiniApplet que se cargará en el navegador, que se encuentra en miniapplet-full\es\gob\afirma\miniapplet\MiniAfirmaApplet.class:


Conjunto de funciones y procedimientos disponibles en el applet, con parámetros permitidos y código fuente decompilado mediante JD-GUI.


Probamos, mediante la consola Web, a obtener la versión del entorno Java que estamos ejecutando, aprovechando la función getEcoJava(), y lo mostramos mediante un pop-up (alert):


Por tanto, si la página en la que se encuentra cargado el applet, resultase vulnerable a Cross-Site Scripting, podríamos realizar otro tipo de peticiones diferentes a los típicos document.cookie o mostrar mensajes "prueba xss", dependiendo de las funciones que el applet nos deje disponibles.

Probemos las funciones que gestionan ficheros, como son por ejemplo loadFilePath, saveDataToFile, y getFileNameContentText, cuyos nombres lo dicen todo:
  • loadFilePath (3 parámetros de entrada, devuelve cadena de texto) de MiniApplet @firma
Al ejecutar la función mediante loadFilePath("param1","param2","param3"), se abre un cuadro de diálogo (con título param1) para la selección de un fichero con extensión "param3", por lo que esta funcionalidad avisa al usuario de la acción. No nos permitiría la obtención de información sin que un posible usuario víctima se enterase de que está recibiendo un ataque de Cross-Site Scripting.

Resultado de ejecución de loadFilePath de MiniApplet

La función devuelve la ruta completa de un fichero seleccionado mediante el cuadro de diálogo.
  • getFileNameContentText (3 parámetros de entrada, devuelve cadena de texto) de MiniApplet @firma
Ídem que en el caso anterior, utilizando los mismos parámetros de prueba para comprobar el funcionamiento, se ejecuta un cuadro de diálogo para que el usuario introduzca el fichero del que obtener el contenido. Tampoco nos vale y no es posible abusar de esta funcionalidad sin que un usuario se percate.
  • saveDataToFile (5 parámetros de entrada, devuelve cadena de texto) de MiniApplet @firma
Mismo comportamiento, la ejecución completa de la funcionalidad de guardar datos en un fichero, requiere interacción con el usuario.

Resultado de ejecución de funcionalidad saveDataToFile de MiniApplet

Para las funciones más importantes de gestión de ficheros, este applet requiere siempre de interacción con el usuario cuyo navegador ejecuta el applet.

@firma versión Completa
La última versión, correspondiente con la 3.3 de este cliente, fue publicada el 20 de Abril de 2012, más de un mes después de la charla en Rooted CON 2012. El análisis presentado se realizó de versiones anteriores.

Para este componente, se realizarán las mismas pruebas que se realizaron sobre la versión Mini, y como podréis observar a continuación, los resultados son completamente opuestos. Para el ejemplo, se realizará el análisis sobre una web que contiene instalada la versión completa del componente Cliente @firma. A la web a llamaremos "SedeChachi", y podremos acceder mediante la URL https://sedechachi.gob.es. Ejecutamos documents.applets en la consola para comprobar la carga correcta del applet de @firma y utilizaremos el identificador clienteFirma por comodidad para evitar el uso de documents.applets[0] cada vez que queramos llamar a cualquier de sus funciones:

Acceso al applet mediante el identificador clienteFirma

Revisamos el contenido de la clase correspondiente con el applet cargado en el navegador, que se encuentra en es/gob/afirma/cliente/SignApplet.class:

Funciones disponibles de la clase SignApplet.class del applet Cliente @firma
Probemos de nuevo aquellas funciones cuyo nombre indican que pudieran ser necesarias para gestión de ficheros, como por ejemplo loadFilePath, getTextFileContent y savePlainDataToFile:
  • loadFilePath (3 parámetros de entrada, devuelve cadena de texto) del Cliente @firma
Carga de loadFilePath del cliente @firma

El comportamiento es el mismo que el de la misma función en la versión Mini del applet.

  • getTextFileContent (1 parámetro de entrada, devuelve cadena de texto) del Cliente @firma

Probemos a ejecutar getTextFileContent del fichero C:\boot.ini típico de sistemas Microsoft Windows y mostremos la cadena de texto que devuelve la función mediante un popup (alert):

Obtenemos el contenido del fichero boot.ini del sistema
¡Bingo! Podríamos obtener cualquier fichero del sistema de un usuario víctima, si le proporcionásemos un enlace especialmente modificado como payload de un ataque Cross-Site Scripting, lejos del típico document.cookie o "prueba XSS" como se comentó anteriormente. Y todo ello sin que el usuario se percate de la petición. En linux obviamente, también funciona, y ¿qué fichero vamos a probar para su lectura, pudiendo obtener su contenido sin que el usuario se entere?

Leyendo el fichero /etc/passwd mediante la función de lectura del applet

  • savePlainDataToFile (1 parámetro de entrada, devuelve booleano) de MiniApplet @firma
Teniendo en cuenta que es un parámetro, y en una función de guardar debería haber una para los datos y otra para el fichero destino, comprobamos como hay otra función llamada setPlainData que recibe un parámetro, que será la que guarde en el objeto el texto, y después utilizaremos savePlainDataToFile para guardar en un fichero dichos datos. Ejecutaremos setPlainData("contenido del fichero") y savePlainDataToFile("C:\\pruebafichero.txt"):

Ejecución de la función de guardar fichero con contenido establecido previamente
Al igual que en el caso anterior, hemos conseguido escribir un fichero sin que el usuario tenga constancia de ello, en la raíz del disco duro local. También sería posible añadir nuevo contenido a un fichero (sobreescritura) sin aviso previo. En este caso, se ha almacenado información en texto, pero también es posible mediante otro par de funciones, el almacenar contenido binario en ficheros.

Tras hacerse públicas estas vulnerabilidades en el congreso, se lanzó la versión 3.3 del applet, en la cual se incluyeron avisos al usuario por parte del applet de la utilización de determinadas funciones, como son la carga o guardado de ficheros, evitando poder abusar de estas funciones sin contar con autorización previa:

Aviso de la nueva versión del applet para la utilización de la función de carga
 
Aviso de la nueva versión del applet para la utilización de la función de guardar fichero

WebSigner2 (suite ASF-Firma) de TB-Solutions

La suite ASF-Firma de la compañía TB-Solutions se utiliza en la amplia mayoría de empresas para la realización tareas de firma y certificación. Dicha suite fue certificada CC EAL3+ en el 2007, y entre el inventario de componentes de la solución, se encuentra WebSigner2, que corresponde con un ActiveX para realizar tareas de firma y autenticación en el lado cliente desde navegadores Internet Explorer. También cuenta con una versión applet Java del mismo.

El componente analizado es el ActiveX WebSigner2.cab (versión 6.2.0.2). Podréis saber dónde se utiliza buscando dicho archivo en Google, dónde saldrán manuales de como configurar el navegador para su uso correcto y sin problemas. Para el análisis se creará una prueba de concepto en HTML con Javascript que ejecute el ActiveX, y mediante una serie de botones se intentará la ejecución de sus funciones con parámetros de ejemplo. El contenido del fichero .cab es el siguiente:

Contenido del ActiveX WebSigner2

Abrimos la librería WebSigner2.dll para la obtención de las funciones disponibles con COMRaider:

Obtención de funciones disponibles en el componente WebSigner2

Al igual que en anteriores ocasiones, los nombres de las funciones hablan por si solas. Probemos la función loadFileWithPath, que acepta un parámetro de tipo String, realizando la petición loadFileWithPath("C:\\boot.ini"). El contenido del fichero se queda en la variable ContentString del objeto, la cual mostraremos mediante un popup (alert):

Código JavaScript para llamar a la función loadFileWithPath del componente WebSigner2

Obtención del fichero boot.ini mediante la función loadFileWithPath

También se incluyen funciones de guardar ficheros, que además de contenido en texto plano, también es posible crear binarios (al aceptar contenido en base64) y dejarlos en cualquier localización del sistema.

Se permite sobreescribir por ejemplo, ficheros como el hosts. Recordemos que el ActiveX debe ejecutarse con usuario con privilegios máximos, como bien dice la documentación de cualquier sede que haga uso del componente...

Código para sobreescribir el fichero hosts del sistema, añadiendo una nueva ruta
Fichero hosts del sistema sobre escrito con una nueva ruta para la cual al introducir phishing se redirigirá la conexión a 000.000.000.000
Para el siguiente ejemplo, y tras obtener el base64 del fichero binario del cmd.exe, guardaremos otro cmd.exe con otro nombre (secret1.exe), en el raíz del disco.

En la variable cmd se encuentra el base64 del binario cmd.exe de Windows
Hemos "plantado" un binario como el cmd.exe dentro del raíz del disco
Todas las acciones realizadas anteriormente se ejecutan sin requerir interacción por parte del usuario ni avisos previos.

Ídem que para el caso de @firma, tras contactar con TB-Solutions, se encuentra disponible la versión WebSignerPlus 6.2.0.3 en la que, para cada una de las funcionalidades de gestión de ficheros, se avisa al usuario del posible acceso a recursos del disco duro:
Aviso de WebSignerPlus al intentar consultar el fichero boot.ini
Aviso de WebSignerPlus al intentar obtener el fichero hosts del sistema
Se asignado el CVE CVE-2012-1267 para las vulnerabilidades encontradas en WebSigner2, por el uso inseguro de los métodos de lectura y escritura de ficheros sin aviso previo al usuario, afectando a las versiones 6.2.0.2 y anteriores del componente.

------------------------------

En los próximos días, se incluirá la información de esta serie de posts en la página OWASP del proyecto DNI-e que podréis encontrar en la URL https://www.owasp.org/index.php/Spain/Projects/DNIe. Esperamos poder concienciar tanto a fabricantes como usuarios de la importancia de proteger este tipo de componentes y desarrollos asociados.

[Referencias]
- Seguridad en componentes cliente de aplicaciones web basadas en DNIe [Parte 1][Parte 2][Parte 3]

Leer más...

24 abril 2012

Welcome to your secure /home, $user [RootedCON 2012] #rooted2012


Al igual que han hecho mis compañeros Jose Antonio Guasch y Yago Jesús, quiero publicar en Security By Default, el contenido de la presentación que hice en el congreso de seguridad Rooted CON 2012 que titulé: "Welcome to your secure /home, $user".

Uno de las secciones de seguridad que se quería motivar este año en RootedCON era el "hardware hacking", así como la interacción con diversos elementos que pueden llegar a estar en casas modernas.

Así que he conjugado el hobby/vicio que tengo con hacerme la vida más cómoda, con saciar la paranoia de poder implementar mecanismos de seguridad para mi casa.

En la parte domótica, integraba varios sistemas: una aspiradora Roomba, una alarma gestionable vía IP, un sistema de aire acondicionado en diferentes habitaciones, una estación meteorológica, monitorización con cámaras y una centralita VoIP, entre otras cosas… formando mi pequeño Skynet.

Presenté además un sistema low cost de detección de movimiento, así como reconocimiento facial y tratamiento personalizado de habitantes de una casa. Incluí también un PoC en el que simulaba una "lista negra" de personas clasificadas como "peligrosas", en la que, mediante una centralita VoIP, efectuaba una llamada a un número pre-configurado, indicando quién ha sido el "fichado" que se ha detectado en mi casa.

Todo este entramado, se gestiona mediante un bot Gtalk, que también desarrollé.

Bajo estas líneas os dejo la presentación colgada en Slideshare por la organización RootedCON


Como prometí en twitter después del evento, y ya que los videos embebidos en la presentación de Slideshare no se ve, he querido publicar en SbD el montaje que hice con la canción "El Internet" de Los Alguiens en el que aparecía mi aspiradora Roomba marcándose unos bailes por el salón de casa.

Imprescindible que encendáis los altavoces o que os pongáis unos auriculares. ¡Que os aproveche!





Leer más...

23 abril 2012


En el post Seguridad en componentes cliente de aplicaciones web basadas en DNIe: Parte 1/3 hicimos un repaso a los tipos más importantes de componentes para el navegador, ActiveX y Applets Java, así como diferentes herramientas que podríamos utilizar para su análisis exhaustivo. Pero, ¿qué tipo de vulnerabilidades nos podríamos encontrar en estas piezas de software que se ejecutan sobre el navegador del usuario?



Vulnerabilidades en componentes

A lo largo de los años, se han visto diferentes vulnerabilidades que pueden afectar a componentes ActiveX. Los tipos de vulnerabilidades son los que podrían afectar a cualquier otro tipo de software:
  • Ejecución de comandos y código
  • Desbordamientos de búfer, desbordamientos de pila, de heap...
  • Lectura, escritura, sobrescritura y eliminación de ficheros
  • Denegación de servicio
  • Evasión de restricciones
  • Acceso a información sensible
  • ...
Tomando como fuente la lista de la Common Vulnerabilities and Exposed (identificadores CVE) de la entidad Mitre, en la que se recopilan la amplia mayoría de las vulnerabilidades existentes, realizamos la búsqueda de vulnerabilidades que afectan a componentes ActiveX:

Búsqueda de vulnerabilidades de ActiveX con código CVE asignado
Se obtienen unas 854 entradas CVE, casi un 2% del total de vulnerabilidades registradas desde 1999. Cogemos el total, y vamos a clasificarlas según la vulnerabilidad que suponen, obteniendo los siguientes datos:

  • Buffer Overflows - 46.02%
  • Gestión de ficheros - 17.45%
  • Ejecución de código - 15.22%
  • Denegación de servicio - 9.84%
  • Ejecución de comandos - 5.74%
  • Descarga remota - 2.34%
  • Acceso a información sensible - 0.94%
  • Evasión de restricciones - 0.94%
  • Acceso a registro - 0.70%
  • Instalación arbitraria - 0.23%
  • Vulnerabilidad desconocida - 1.17%




Tras estas estadísticas, vamos a centrarnos en las vulnerabilidades del segundo puesto del ranking: las referentes a gestión de ficheros. Dentro de este grupo nos encontramos vulnerabilidades en componentes ActiveX las cuales al ser explotadas, permiten la lectura, sobrescritura, creación y eliminación de ficheros. 

Para el caso de la lectura, escritura y eliminación, como es obvio, es necesario conocer la ruta exacta del fichero en el equipo local del usuario en cuyo navegador se ejecuta el componente, pero como todos sabemos, existen multitud de ficheros en Windows de los que conocemos su ruta completa. Además, recordemos que estos componentes suelen requerir privilegios elevados para ser ejecutados, por lo que si no se establecen unos limites acotados, podremos acceder y modificar cualquier fichero del sistema:

  • %WINDIR%\System32\drivers\etc\hosts -> Fichero hosts de Windows
  • %USERPROFILE%\ntuser.dat -> Con información del usuario
  • %WINDIR%\system32\config\AppEvent.Evt -> registro de eventos de Aplicación
  • %WINDIR%\system32\config\SecEvent.Evt -> registro de eventos de Seguridad
  • %WINDIR%\repair\sam -> Almacena hashes de contraseñas de usuarios
  • %SYSTEMDRIVE%\boot.ini -> información del proceso de inicio de Windows
  • ...

Veamos algunos ejemplos de vulnerabilidades en componentes, que permitan aprovechar alguna funcionalidad para la gestión posterior de ficheros en un equipo víctima dónde se esté ejecutando:

ADOBE CVE-2005-0035


Vulnerabilidad del componente web de Adobe Acrobat que permitía determinar la existencia de ficheros en el sistema aprovechando una de las funciones, únicamente conociendo su ruta exacta.

ORACLE CVE-2010-3595




Vulnerabilidad del componente Oracle Document Capture de Oracle que permitía leer ficheros sabiendo su ruta completa.

IBM CVE-2004-2663




Vulnerabilidad del control ActiveX Access Support eGatherer de IBM con la que era posible la creación de ficheros con contenido arbitrario.

ChillKat CVE-2008-5002



Método inseguro en el control ChillKatCrypt2 del ActiveX Chillkat Crypt que permite la creación y sobrescritura de ficheros.

SonicWall CVE-2007-5815


En el componente WebCacheCleaner de la VPN-SSL de SonicWall existía una función que permitía la eliminación de ficheros conociendo su ruta completa.

En la siguiente y última parte de este post, entraremos de lleno en el análisis de los componentes utilizados por aplicaciones web basadas en DNIe y certificados digitales, una vez ya tenemos las herramientas suficientes para su revisión y conocemos otros tipos de vulnerabilidades que pueden darse en controles ActiveX, además de echar un vistazo a problemas similares pero para Applets Java.

Leer más...

17 abril 2012

Applied Cryptography FAILs [RootedCON 2012]

En la pasada RootedCon, tuve el placer de impartir la charla 'Applied Cryptography FAILs' en la que estuve hablando sobre ataques a criptografía aplicada.

Frente a las típicas charlas sobre crypto que, tal vez, suelen ser demasiado 'crudas', basadas en la parte mas teórica, con algoritmos y fórmulas matemáticas, mi aproximación fue mucho mas práctica.

La frase que podría resumir la charla es de Adi Shamir (la S de RSA): 'Cryptography is typically bypassed, not penetrated'

La charla versaba sobre:

  • Ataques a comunicaciones seguras (explicando el caso de WhatsApp y su proceso de registro bajo SSL)
  • Entidades de certificación (donde presenté SSLCop)
  • Certificados digitales (Y los mitos asociados)
  • Certificados digitales basados en software (Ataque a los certs de la FNMT)
  • SmartCards (donde presenté un prototipo de troyano para el DNI-E)
Os dejo con la presentación:


Leer más...

10 abril 2012

En la pasada Rooted CON 2012 tuve el enorme placer de compartir escenario con Raúl Siles, en una charla programada para el sábado a última hora, en la que hablamos sobre Seguridad de aplicaciones web basadas en el DNIe. En ella se darían a conocer una serie de vulnerabilidades que se encontraban en las aplicaciones web que hacen uso del DNIe, tanto para autenticación e identificación, como para firma. Además del caso de las aplicaciones, se expuso la problemática en ciertos componentes que también son utilizados para realizar operaciones con el DNIe (como si de otro certificado se tratase...), los cuales se solicita al usuario su instalación o utilización desde su navegador.

La presentación ya se encuentra alojada en la cuenta de Slideshare de RootedCON, y la incluímos a continuación. Raúl ha publicado información acerca de la primera parte de la charla en el blog de taddong.com, en la cual además de presentar los resultados de su investigación, pone a disposición de todos un módulo para que OWASP ZAProxy reconozca el certificado del DNIe y así permitir utilizar esta herramienta de interceptación de peticiones web en aplicaciones que hagan uso de él en su negociación SSL. A partir de la diapositiva 53 accederéis a la sección de la charla en la que se exponen las vulnerabilidades en los componentes cliente:


Raúl Siles y José A. Guasch - Seguridad Web de aplicaciones
basadas en DNI-e [RootedCON 2012]




En este primer post realizaremos una introducción a los tipos de componentes que existen (en general), y con qué herramientas poder analizarlos.

Tipos de componentes cliente

Realizaremos el estudio sobre dos tipos de tecnologías utilizadas para la programación de componentes cuyas operaciones deban realizarse en el lado del cliente/navegador del usuario: ActiveX de Microsoft y Java Applets.
  • ActiveX = Software en forma de componente que funciona únicamente en navegadores Internet Explorer, y sobre plataformas Microsoft Windows (el sistema operativo puede utilizar ActiveX para otras funciones, pero en este caso nos centraremos en los utilizados mediante el navegador). Su programación se realiza en la mayoría de los casos sobre Visual Basic y C++. Los ficheros suelen tener la extensión .CAB o .EXE y se instancian mediante  una etiqueta OBJECT de HTML, con los siguientes atributos necesarios:
    • CLSSID - identificador único del componente, mediante el cual se determina si el componente existe en el sistema para su reutilización, en caso negativo, se descarga del servidor.
    • ID - identificador con el que se identificará posteriormente en el código, para la llamada a sus funciones y procedimientos.
    • CODEBASE - Ruta remota dónde se encuentra alojado el componente si se requiere su descarga.

    Los siguientes diálogos identifican la existencia de ActiveX, su solicitud de instalación, aviso al usuario por requerir su carga, etc:
Aviso en el navegador sobre la instalación de un componente ActiveX por parte de una aplicación web

  • Java Applets = A diferencia de los ActiveX, los applets de Java son multiplataforma y multinavegador, requiriendo la máquina virtual de Java para su ejecución. Estos applets avisan al usuario sobre sus requisitos a nivel de permisos antes de su ejecución, depende de si se encuentran firmados, no firmados o firmados mediante una entidad propia. Para los controles firmados se delega en el desarrollador los requisitos y accesos necesarios para el correcto funcionamiento de la aplicación, para el resto, al usuario se le muestra un aviso informando sobre la necesidad del applet. Los applets tienen extensión .JAR, y se pueden instanciar tanto por la etiqueta OBJECT de HTML como por APPLET, con los siguientes atributos:
    • CODEBASE - Dirección base desde la cual descargar el applet
    • CODE - Clase concreta del applet (en .class) que se necesita cargar, y que ofrecerá una serie de procedimientos y funciones con la que realizar operaciones.
    • ARCHIVE - Dependencias previas de clases necesarias para la carga del applet
    • NAME - identificador con el cual el applet podrá posteriormente ser utilizado mediante código Javascript.
    Se puede identificar la carga de applets cuando aparezcan los siguientes diálogos en el navegador Uno de los primeros indicadores viene cuando vemos aparecer la consola de Java, siempre que ésta se encuentre activada, en el systray de nuestro sistema:
Ejemplo de Applet de Java, cuya firma ha sido verificada correctamente, y en el que se avisa de su ejecución sin restricciones
Aviso de necesidad de ejecución de un Applet de Java cuya firma no puede ser verificada
    Otra forma de desplegar applets, de una forma mucho más sencilla, es utilizando el protocolo JNLP (Java Network Launching Protocol) mediante el cual, con un simple fichero en formato XML, es posible instanciar por completo un applet, con todas sus dependencias y parámetros iniciales.
Seleccionemos por tanto un componente de cada tecnología sobre los cuales aplicar lo que vayamos mostrando: para el ActiveX utilizaremos el .cab del CAPICOM, librería utilizada para facilitar la interactuación con la CryptoAPI Windows. Para los ejemplos con el Applet Java, utilizaremos este HelloWorld que se encuentra en este enlace de la web de Oracle sobre la introducción a la programación de applets.

En primer lugar resaltar que ambos contenedores base (el .cab para ActiveX y el .jar en Applets de Java) pueden ser desempaquetados con un simple descompresor de ficheros, como si de un .zip se tratase. Para el caso de los ActiveX (.cab) veremos un conjunto de librerías DLL u OCX, así como otros recursos.

Fichero .cab correspondiente con el componente ActiveX

Descompresión del archivo mediante descompresor

Contenido del fichero .cab

Dentro de los applets Java (.jar), obtendremos todos los recursos (iconos, imágenes, propiedades...) incluyendo los ficheros .class, dónde se encuentra la lógica y programación de la aplicación.


Fichero de Applet en .jar

Descomprimir como si se tratase de cualquier fichero comprimido en ZIP

Contenido del fichero .jar

Una vez tenemos los ficheros que conforman los componentes, podremos realizar las típicas tareas de análisis de aplicaciones, como si de cualquier otra pieza de software se tratase. A continuación recopilamos herramientas que nos servirán para poder realizar un análisis más en profundidad, como son visores de funciones, debuggers/depuradores y fuzzers.

Herramientas para analizar componentes ActiveX

Visores de funciones disponibles en ActiveX

OLE/COM Object Viewer - Aplicación perteneciente al Windows Resource Kit de Microsoft tanto de Windows Server 2000 como de Windows Server 2003. Con ella podremos acceder a información acerca de los controles presentes en el sistema, información de sus interfaces, etc. Para poder ver información más detallada, como por ejemplo parámetros y tipos aceptados por las funciones disponibles, necesitaremos incluir la librería iViewers.dll para obtener toda la información del componente, y no sólo sus propiedades.


COMRaider - Si bien esta aplicación de iDefense está ideada principalmente para el fuzzing de componentes ActiveX, podemos aprovecharla también para tener una visión completa de las funciones  con sus correspondientes parámetros aceptados. Todas las herramientas muestran los entresijos de los componentes, pero personalmente es la que más me gusta, y eso que se ha quedado un poco anticuada en cuanto a interfaz...Podréis descargarla del siguiente repositorio, ya que su enlace a los labs de iDefense ya no se encuentra disponible.

Abriendo la .dll del CAPICOM con COMRaider, obteniendo funciones y parámetros permitidos por el componente

Debuggers de componentes ActiveX

En esta ocasión, como si de cualquier otra librería se tratase, las DLL principales de los ActiveX pueden ser procesadas mediante un debugger como puede ser OllyDBG, IDA de Hex-Rays o el Immunity Debugger. Estas herramientas nos permitirán realizar ingeniería inversa sobre las librerías y poder buscar vulnerabilidades asociadas a estos componentes que se incluyen en la ejecución de Internet Explorer cuando son instanciados.

Fuzzers para ActiveX

Para el que no lo sepa, diremos que los fuzzers son programas encargados de probar la integridad de aplicaciones y componentes, realizando llamadas a los procedimientos que contienen, en base a multitud de casuísticas y diferentes tipos de valores para los parámetros. Una vez se identifican las funciones disponibles (y que obviamente acepten parámetros) se obtiene el tipo asociado a dichos parámetros y se crea un banco de pruebas instanciando el componente y controlando su comportamiento durante el flujo de ejecución.

Para realizar fuzzing sobre ActiveX, tenemos varias herramientas, entre las que destacamos la anteriormente mencionada COMRaider de iDefense Labs, además de dranzer del CERT, AxMan de HDMoore, etc.

Os recomiendo este post de Alex titulado "Seguridad en ActiveX" con información detallada sobre cómo realizar pruebas sobre componentes ActiveX utilizando estas y otras herramientas. 

Herramientas para analizar componentes Applets Java

Una vez disponemos de un directorio con el contenido del fichero .jar tras ser descomprimido, veremos una jerarquia de directorios en los que se incluyen ficheros con extensión .class.

Contenido del fichero .jar, con dos ficheros .class y la carpeta de meta-información META-INF.

Decompiladores de Applets Java

A diferencia con los ActiveX, los .class de los Applets de Java pueden ser decompilados, mostrando el código fuente "casi" completo del applet, algo que nos viene genial para poder identificar más rápidamente posibles vulnerabilidades sin tener que recurrir a métodos de prueba y error como los que se utilizan realizando fuzzing a las aplicaciones. Dos de los decompiladores más famosos de ficheros .class son el JD-GUI, el JADClipse que integra el decompilador jad con Eclipse, y el DJ Java Decompiler (obsoleto, GUI para el comando jad).

A continuación vamos a decompilar el simple HelloWorld.class mediante JD-GUI:

Decompilación del código HelloWorld.class mediante JD-GUI

Importante destacar los iconos que se encuentran a la izquierda de la función init(), cuyo color (verde en este caso) indica el tipo de declaración realizada de las funciones. En caso de disponer de un ícono verde, la función es pública y puede ser instanciada de forma externa. Ya tenemos el código fuente completo, en el que si sabemos interpretar mínimamente código Java, veremos una gestión de excepciones y una función que se encarga de crear una etiqueta con el texto "Hello World" en él dentro del applet cuando éste sea cargado en la aplicación. 

Debugger para Applets Java

JavaSnoop fue presentado en la BlackHat de Las Vegas en el 2010 por Arshan Dabirsiaghi, director de investigación de la empresa Aspect Security. Esta herramienta nos permite adjuntarnos al proceso del applet en su ejecución, como ocurre con los típicos debuggers de binarios, instalando "hooks" en los métodos disponibles. Si bien los decompiladores de Applets nos dan todo el código, con esta herramienta se facilita enormemente la realización de pruebas concretas sobre los métodos soportados por el Applet.

Una vez tenemos la aplicación en nuestro sistema, lo iniciamos mediante el correspondiente fichero de inicialización (startup.bat/.sh):

Inicio de JavaSnoop 1.0
Se pueden realizar dos funciones, abrir un nuevo proceso sobre el que adjuntarse, o adjuntarse a un proceso ya existente. Para el ejemplo, nos adjuntaremos al proceso que se encuentra ejecutando el applet de HelloWorld dentro de la página de ejemplo de la propia web de Oracle mediante el botón "Attach & Snoop Process":

Seleccionando el proceso sobre el que nos adjuntaremos y realizaremos la depuración

Adjuntados al proceso correctamente
Añadiendo un hook en las funciones disponibles del applet.

La aplicación nos permite añadir "hooks" a funciones. En el ejemplo de la captura anterior se reconoce la función HelloWorld, entre otras propias de librerias cargadas por el componente (parte gráfica de la etiqueta dónde se muestra el mensaje).

Y bien, ya hemos presentado algunas herramientas que nos permitirán preparar un entorno con el cual comenzar el análisis de componentes ActiveX y applets Java. En el siguiente post comenzaremos a revisar vulnerabilidades típicas que se encuentran en este tipo de componentes.
Leer más...