miércoles, enero 31, 2018

Latch Exfiltration: Módulo multiplataforma de exfiltración de datos usando Latch

El año pasado, planificando el Trabajo de Fin de Máster del Máster de Seguridad de la UEM que consistía en la fortificación de una cartera Bitcoin con Latch, Pablo González (@pablogonzalezpe) nos propuso una idea muy interesante: aprovechando la integración con Latch, por qué no habilitar la transferencia de la clave privada entre carteras a través de esa plataforma.

Figura 1: Latch Exfiltration: Módulo multiplataforma de exfiltración de datos usando Latch

Poco después, Pablo González y Álvaro Nuñez-Romero (@toolsprods) implementaron sobre esta idea una PoC llamada Latch'sApp en el Equinox de ElevenPaths para exfiltrar datos en general. Hicieron un hack en Python muy completo e interesante, llegando incluso a integrarlo como plugin para Data Exfiltration Toolkit.


Figura 2: Funcionamiento de Latch'sApp

Sin embargo, en nuestro equipo del TFM, decidimos crear una aproximación de la herramienta por nuestra cuenta, para ver hasta donde podíamos llegar partiendo de la idea inicial. Para llevar a cabo el proyecto elegimos el SDK de Latch en Python, ya que teníamos implementada nuestra cartera Coinbase en un servidor Django y Python 2.7. Así, planteamos las siguientes reglas para nuestro desarrollo:
1. Existe un módulo de lectura y otro de escritura, que comparten entre ellos una cadena de caracteres; así podríamos enviar información en formato JSON para luego poderla procesar como nos convenga. 
2. Creamos 8 cerrojos para la representación binaria, junto a otros tres de control. 
3. Los cerrojos de control se encargan de tres cosas. Indicar si la operación es de escritura o lectura, informar de que ha terminado la ejecución cuando se ha transmitido toda la cadena e indicar al módulo de escritura que hay un módulo de lectura escuchando para empezar la escritura. 
4. Si los cerrojos no están creados existe una comprobación para inicializarlos. 
Figura 3: Explicación en vídeo de los pasos de Latch Exfiltration
5. Se lee el primer byte de la cadena y se obtiene una representación binaria en unos y ceros. 
6. El módulo de escritura coloca los cerrojos acorde a los bits y deja el cerrojo de control en “off” para indicar que ha realizado la operación. 
7. El módulo de lectura comprueba el estado de los cerrojos y obtiene la cadena binaria, añadiendo un 1 si el cerrojo está en “off” y un 0 si está en “on” y vuelve a colocar el cerrojo de control en “on”. 
8. Una vez se tenga la cadena entera se obtiene el byte filtrado.
Portar el módulo de exfiltración a iOS con Swift.

A pocas semanas de entregar el TFM se me ocurrió una nueva idea. Ya que Coinbase es una cartera virtual que cuenta con una API y varios SDKs muy completos, sería relativamente fácil portarla a otras plataformas como pueden ser iOS o Android, así que me puse manos a la obra y empecé a portar la aplicación a iOS con Swift.

Figura 4: Implementación de Latch exfiltration en Python

El primer problema vino cuando buscando un SDK para esa plataforma vi que no había ninguno implementado. Primero intenté usar el SDK de Latch en C, ya que iOS soporta la ejecución de código en Lenguaje C tanto en proyectos con Objective-C como en Swift. Por desgracia, una de las librerías necesarias, libcurl, no llegaba a funcionar correctamente con el proyecto, así que pasé al Plan B.

Si no existe, créalo.

Una de las ventajas de Latch es que su SDK se reduce a implementar peticiones HTTPS a un servidor, que producen una respuesta que se procesa para actuar acorde con el estado de la petición, un estándar en desarrollo web. Además, los chicos de ElevenPaths tienen una documentación muy clara y concisa en la página para desarrolladores, además de los vídeos en los que explican cómo usar la tecnología Latch.


Figura 5: Cómo utilizar Latch en aplicaciones PHP

Así, en un par tardes y con ayuda de las las URLs ya formadas que saqué de la herramienta escrita en Python, implementé una primera versión del SDK. A grandes rasgos y sin entrar en detalle - ya que viene muy bien explicado en la documentación - los puntos más importantes a los que me tuve que enfrentar fueron:
1. Implementación de las HTTP Request. Para ello usé una dependencia muy famosa de iOS llamada Alamofire, que envía procesa peticiones HTTP pudiendo elegir el método, cabeceras, parámetros... 
2. Formación las cabeceras y posterior firma usando el algoritmo HMAC-SHA1. Swift tampoco soporta nativamente firmas por hash, por lo que tuve que usar la librería CCommonCrypto y un wrapper para Swift. 
3. Por el carácter asíncrono de las peticiones, la necesidad implementar las funciones con “completion handlers”, trozos de código que escapan el flujo de una función y se ejecutan por un trigger. Así, tuve que recurrir mucho a recursión en sustitución a los bucles que podía usar en Python.
Pese a todo, no resultó muy difícil, y en poco tiempo conseguí implementar todas las funciones necesarias para desarrollar el módulo de exfiltración.

Figura 6: Proyecto con la implementación de Latch'sApp en XCode con Swift

Después de esto, solo fue necesario portar lo que había hecho en Python a Swift, implementando las respuestas asíncronas y buscando librerías que permitiesen la traducción de caracteres a bytes. Para ilustrar todo esto, lo junté en un PoC, una app para iOS que pudiera enlazarse con Latch a través de un código de enlace, poder controlar el cerrojo general de la aplicación y poder exfiltrar datos desde un ordenador a un móvil con iOS.

Figura 7 - PoC de Latch'sApp Data Exiltration en Swift

En definitiva, la experiencia ha sido satisfactoria, me quedo con la versatilidad y potencial que tiene Latch, como se ha podido ver en otras ocasiones, y con la experiencia de haber podido ampliar el alcance del Trabajo de Fin de Máster que realizamos mis compañeros Nacho (@DadeKan) y Danilo. Tanto el módulo en Python como el PoC en Swift los podéis encontrar en Github, cualquier mejora o ayuda es bien recibida.

Un saludo.

Autor: Lucas Fernández

2 comentarios:

Unknown dijo...

De vez en cuando leo una banda de artículos que tenés del blog (cuando no tengo que preparar finales), moviéndome por todos los freaking tags, leo escuchando TriviuM, por supuesto!

Ojalá que sigas escribiendo esta cantidad eeenoooorrrmee de información por 40 años más, con eso me conformo.

Saludos chemmiiita queriido.

Unknown dijo...

Recién ahora me dí cuenta que el artículo fue escrito por
echo `WHOAMI`
Lucas Motherfucking Fernández

Igual sos crack chema

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares