viernes, 22 de junio de 2012

Solución al reto de sensepost.com - BlackHat Challenge

Descripción del Reto:

Una empresa crea su propio sistema de cifrado de comunicaciones y lo utiliza para que un cliente/empleado les envíe diariamente un mensaje.

Una de esas comunicaciones es interceptada por un 'intruso' y además copia el código fuente del software utilizado para dichas comunicaciones entrando en un servidor de la empresa.

Para resolver el reto se pide que obtengamos la password (shared secret) utilizada por ambas partes (cliente/servidor) para iniciar la autenticación, así como la clave usada para cifrar los mensajes.

Para ello nos dan un archivo PCAP con las tramas capturadas y, el código fuente del software de comunicación.

He de decir, que este reto me ha parecido muy sencillo debido principalmente, a la cantidad de información (pistas) proporcionadas, no obstante ha sido igualmente entretenido (gracias por prepararlo).

Primera Parte

Lo primero que hice fue echar un vistazo al PCAP con un tiburón. Rápidamente localizamos los protocolos que intervienen en las comunicaciones entre cliente y servidor y vemos como se envían una serie de 'comandos' tipo HELO, RESP, AUTH OK, etc

Echando un vistazo a los programas vemos que en uno de los paquetes se envía un número que es aleatorio, y un HASH que se crea a partir del número aleatorio y la password (shared secret).

Datos extraídos de uno de los paquetes: 52:45:53:50:20:cb:4e:fa:38:89:20:33:a4:34:3b:fe:c9:47:70:16:09

52=R, 45=E, 53=S, 50=P, 20=ESPACIO el resto cb:4e...16:09 es el hash de tipo MD5(valor_aleatorio:password)

Lo que hice fue aprovechar el propio código fuente proporcionado y utilizar su función HMAC(...) para ir generando hash "bruteforceando" la password, eso sí salían más de 78.000 millones de combinaciones posibles (36 caracteres alfanuméricos 'abcdefghijklmnopqrstuvwxyz0123456789' en grupos de 7 = 36^7 = 78.364.164.096), por lo tanto se podría recurrir a algún servicio en la nube para obtener el MD5.

Aquí el resultado de la ejecución del programa generador de pass:

Yo empezé generando passwords comenzando por 'aaaaaaa' con lo cual era cuestión de tiempo sacar la password original utilizada en la comunicación interceptada. La cual resultó ser: bm28lg1

Segunda Parte

Una vez que obtenemos la password, averiguar la clave de cifrado de mensajes fue más sencillo todavía. En mi caso, lo que hice fue utilizar los dos programas proporcionados AuthClient y AuthServer pero modificando el AuthServer para que en lugar de generar el número aleatorio, enviase siempre el número que saqué de la captura PCAP (448). De esta forma generaría el mismo hash:

MD5("448bm28lg1") = "cb4efa38892033a4343bfec947701609"

Puse a funcionar el servidor modificado utilizando como password 'bm28lg1'

A continuación, utilizando la misma password ejecute el cliente AuthClient:

Y ¡voilá! ya tenemos todos los datos que se pedían en el reto

Password: bmp28lg1
Session Key: 07e0f7a7cbc2d8b3dba6b7d3b69c3236

Realmente estuvo entretenido y si a alguien le sirve de algo pues me alegro.

martes, 19 de junio de 2012

Archivos MUI (Multilanguage User Interface)

Todos los que nos dedicamos a este complejo mundo del desarrollo de software, nos hemos topado en alguna ocasión con la necesidad de hacer que nuestras aplicaciones estén localizadas, es decir, que estén disponibles en varios idiomas.

Para conseguir esto existen multitud de técnicas, pero en esta ocasión quiero comentaros una que utiliza Microsoft en el desarrollo de sus sistemas operativos Windows Vista, 7, 8, etc Se trata de los archivos MUI (Multilanguage User Interface).

La idea es muy simple, pero bastante eficaz. Consiste en compilar las aplicaciones como binarios independientes de los recursos utilizados por las mismas, de tal forma que tengamos por un lado nuestros ejecutables o librerías (EXEs, DLLs) y por otro lado los recursos (en un archivo de tipo .MUI).

En este escenario, una aplicación que necesita hacer uso de un recurso (cadena de texto, diálogo, icono, etc. ), lo que debe hacer es cargarlo desde el archivo .MUI correspondiente a la aplicación y en el "idioma establecido en el sistema operativo". Para tal fin se hace uso de llamadas a las APIs:

LoadLibrary, FreeLibrary, FindResource, LoadString, LoadIcon, LoadMenu, LoadCursor, LoadBitmap, LoadAccelerators, FormatMessage, etc

Por ejemplo, la calculadora de windows se encuentra en la carpeta %SystemRoot%\system32\calc.exe y su archivo 'MUI' correspondiente está alojado en C:\Windows\System32\idioma_es_ES_fr_FR_etc\calc.exe.mui

Ejemplo de uso: cuando intentamos hacer una división entre '0' la calculadora muestra en pantalla el mensaje de error:

Error: división por cero.

Se trata de una cadena de texto que está alojada en el archivo calc.exe.mui y su identificador es el nº 71. En el pedazo de código siguiente veremos cómo se puede tener acceso a esa cadena de texto (se trata de un fragmento de código como prueba de concepto y muy simplificado, para utilizarlo en un escenario real hay que comprobar que los identificadores devueltos no sean nulos, etc. ):

// En primer lugar obtenemos un handle a la librería de recursos (el archivo mui de la calculadora)

HMODULE resLibrary = LoadLibraryExW(L"C:\\Windows\\System32\\es-ES\\calc.exe.mui", NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);

// A continuación cargamos el recurso de tipo 'cadena de texto' cuyo identificador es 71 correspondiente a "Error: división por cero."

WCHAR szCadena[MAX_PATH * 2];
LoadStringW(resLibrary, 71, szCadena, MAX_PATH * 2);

// Y por último liberamos la librería de recursos

FreeLibrary(resLibrary);

NOTA AL MARGEN:

Desde el punto de vista de la seguridad, he encontrado multitud de archivos de tipo MUI, en cuyo interior se encuentran cadenas de texto que contienen información sensible (ej. contraseñas, sentencias SQL para acceso a base de datos, etc), cuidado con esto, es muy fácil inyectar código SQL en un MUI por ejemplo, o acceder/extraer cualquier tipo de recurso.

miércoles, 6 de junio de 2012

¿Dónde se instalan las aplicaciones estilo METRO en Windows 8?

Si hay algo que nunca me ha gustado -entre otras cosas- en un sistema operativo, es no saber donde se instala un programa. Pues bien, en Windows 8, al igual que en versiones anteriores, cuando instalamos un programa de escritorio este va a parar a la clásica carpeta "Archivos de programa" ó "Archivos de programa(x86)" a menos que digamos lo contrario durante el proceso de instalación.

Sin embargo, en windows 8, además de disponer de aplicaciones de escritorio también tenemos las MARAVILLOSAS aplicaciones estilo Metro, y estas ya no se instalan como las de escritorio (al menos no al 100%), es decir, seguirán instalandose en "Archivos de programa", pero en esta ocasión bajo una carpeta oculta que se llama "WindowsApps". No se si en la versión definitiva de Windows 8 esto seguirá siendo así, pero por lo menos hasta la Release Preview sí.

Por lo tanto, si quereis ver donde estan esos flamantes y llamativos programas estilo Metro, tan solo hay que ir a buscarlos a: "C:\Archivos de programa\WindowsApps", la carpeta está protegida pero es cuestión de permisos de seguridad, también podeis acceder desde consola con privilegios.

Hay muchos más sitios que tienen relación con las aplicaciones Metro instaladas, os muestro alguno:

  • %ProgramData%\Microsoft\Windows\AppRepository
  • %LOCALAPPDATA%\Packages
  • HKEY_CURRENT_USER\Software\Classes\ActivatableClasses\Package
  • ... en el registro hay mucho más

sábado, 2 de junio de 2012

Dibujando la función trigonométrica Seno en un Canvas.

Enredando un poco con HTML5, Javascript y el elemento Canvas he programado un pequeño código que dibuja una función trigonométrica Seno. Lo bueno de todo esto es que no es preciso recurrir a plugins de terceros para poder dibujar con precisión (a nivel de pixel) y calidad utilizando tan solo HTML5 y JavaScript.

Seguridad en el Sistema Operativo iOS de Apple (IV)

Secure Boot Chain - Boot ROM

En los dispositivos iOS han intentado "y conseguido" que exista una fuerte integración entre el hardware y el software, lo que permite y facilita la validación de actividades a través de todas las capas del dispositivo. Digamos que durante toda la fase de funcionamiento del dispositivo, no se permite dar un paso sin antes validarlo y verificar que es confiable.

Cada paso del proceso de arranque de un dispositivo iOS contiene componentes que han sido firmados criptográficamente por Apple para garantizar su integridad. Esto incluye los bootloaders, el kernel, las extensiones del kernel y el firmware base.

Cuando encendemos un dispositivo iOS, lo primero que se ejecuta es un código almacenado en la Boot ROM (Read Only Memory), una memoria de solo lectura cuyo código es inmutable y no puede ser modificado, ya que, es grabado en ROM durante el proceso de fabricación del dispositivo.

Si durante el proceso de arranque el dispositivo detecta que alguno de los pasos del Boot no se ha podido validar o realizar correctamente, éste entrará en un modo conocido como DFU (Device Firmware Update) y en la pantalla aparecerá el mensaje "Conectar a iTunes". Esto nos indica que debemos conectar el dispositivo mediante un cable USB al ordenador y restaurarlo al estado de fabrica desde el propio iTunes.

También podemos provocar esta situación de forma manual, teneís más información aquí: Recuperación de un dispositivo iOS

Seguridad en el Sistema Operativo iOS de Apple (III)

ASLR - Address Space Layout Randomization

Se trata de una técnica bastante interesante que consiste básicamente en "Aleatorizar" el espacio de direcciones de un proceso. De tal forma que las partes más críticas -desde el punto de vista de la seguridad ante un ataque vírico o de malware-, no dispongan de direccines fijas. Con esto lo que se hace es asignar direcciones distintas para las librerías, base del ejecutable, memoria del proceso, pila, etc.

Un escenario típico donde no se haga uso de la técnica ASLR es aquel en el cual el Sistema Operativo carga sus librerías core siempre en la misma dirección, en esta situación es muy fácil para un software malintencionado hacer uso o acceder (saltar) a las funciones almacenadas en dichas librerías, ya que, bastaría con obtener su dirección y siempre será la misma. Con ASLR esto no es posible, ya que, dichas librerías se cargaran con direcciones base diferentes.

Esta técnica no es infalible pero si "Dificulta" bastante los ataques.

Podeís encontrar información sobre esto aquí: ASLR en la Wikipedia y por supuesto en Google o similares.

Seguridad en el Sistema Operativo iOS de Apple (II)

Se puede clasificar o dividir toda la plataforma de seguridad de un dispositivo móvil con el sistema iOS de Apple (iPhone, iPad, iPod Touch), en cuatro bloques principales. En cada uno de estos bloques o fases se utilizan diversos métodos, tecnologías y estrategias con el fin de conseguir proteger cada uno de los pasos que se realizan desde el momento en que se enciende el dispositivo.
  • Arquitectura del Sistema
  • Protección y codificación de datos
  • Seguridad de red
  • Acceso al dispositivo
Arquitectura del Sistema

En este caso se trata de asegurar los dispositivos iPhone, iPad y iPod touch desde el punto de vista de la plataforma hardware principalmente.

Protección y codificación de datos

Se encarga de proteger los datos del usuario ante la pérdida, posible robo del dispositivo ó, cuando una persona no autorizada intenta utilizarlo o modificarlo.

Seguridad de red

iOS utiliza protocolos de red basados en estándares internacionales con el fin de conseguir asegurar tanto la autenticación como la codificación de los datos transmitidos en las comunicaciones.

Acceso al dispositivo

En este caso se trata de utilizar métodos que evitan el uso no autorizado del dispositivo y el borrado remoto en caso de pérdida o robo.

Seguridad en el Sistema Operativo iOS de Apple (I)

Son varias las técnicas que han utilizado los ingenieros de Apple para intentar conseguir un Sistema Operativo seguro (al menos más seguro que "OTROS"). Todas estas y alguna más son las cosas que nos vamos a encontrar cuando investigamos un poco sobre la seguridad del sistema iOS:


  • Address space layout randomization (ASLR)
  • Boot ROM
  • Data Protection
  • DFU
  • ECID
  • Effaceable Storage
  • GID
  • iBoot
  • Keybag
  • Keychain
  • Key wrapping
  • Low-Level Bootloader (LLB)
  • Per-file key
  • Provisioning profile
  • Tangling
  • UID
  • XNU
  • Yarrow