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

miércoles, febrero 28, 2018

Latch’sApp: módulo de exfiltración de datos con Latch Python en iOS #Latch #pentesting

Hace un tiempo escribí una entrada en este post acerca de el desarrollo de un módulo multiplataforma para Python y Swift con el que poder exfiltrar datos entre dispositivos con Latch'sApp. Allí, introduje la aproximación que seguimos nuestro equipo del Trabajo de Fin de Máster sobre la idea que nos propuso Pablo González para nuestro proyecto basada en Latch'sApp, junto con todo el potencial que puede generar la implementación en esas dos plataformas.

Figura 1: Latch’sApp: módulo de exfiltración de datos con Latch Python en iOS

Con ganas de seguir explorando esta idea, se me ocurrió portar el módulo de Python a una app de iOS que he estado utilizando últimamente.

Pythonista

Pythonista es un entorno de desarrollo de Python 3 y Python 2 para iOS que permite ejecutar scripts e incluye las librerías y módulos de Python más populares. Además de todo esto, la aplicación aporta soporte extra para el control de elementos de iOS como contactos, fotos, localización, elementos de interfaz y mucho más. Es, junto a Working Copy, Coda o Prompt, de las mejores herramientas para el desarrollo en iPhone e iPad. Así, teniendo un interprete de Python en iOS tan completo como este, ¿por qué no usarlo?

Una vez me puse manos a la obra, lo primero que tuve que descartar fue almacenar la clave y el secreto de Latch en una variable de entorno, ya que por desgracia Pythonista no da soporte esta funcionalidad. Por ello, tuve que optar a almacenar las claves en un archivo global para importarlas en cualquier documento. Además añadí este archivo al gitignore del proyecto para evitar que pudiese filtrarse en una subida accidental. Debido a esto, también tuve que cambiar del script de ejecución la comprobación de la variable ‘account_id’ y eliminar el proceso de obtención de ésta a través de Latch.


Figura 2 - Video de exfiltración multiplataforma con Latch

Por lo demás, el funcionamiento sigue siendo el mismo y no difiere de la ejecución en cualquier otra plataforma. Siendo muy sencillo importar el proyecto, pensé en aprovechar varias de las herramientas que ofrece Pythonista para mejorar un poco el script y darle nuevas funcionalidades.

UI en Pythonista

El módulo UI que viene incluido en la app provee componentes similares a la interfaz gráfica de Apple. Este módulo está basado en el framework UIKit, simplificando muchos de sus aspectos. Además, Pythonista ofrece una herramienta de diseño UI para configurar los elementos que queremos incluir en nuestro script, facilitando mucho el proceso de creación de una interfaz gráfica para Python en esta aplicación.

Figura 3: Herramienta de diseño UI en Pythonista

Estos elementos se almacenan en forma de diccionario al que podemos acceder a través de cualquier archivo Python que importe UI y cargue la vista. Podéis encontrar más información acerca de este módulo en su documentación.

Figura 4: Código en Python de view_script.py con Interfaz Gráfica

Una vez construida la interfaz, modifiqué el script de escritura de latch para incluir las funciones que actualizan la interfaz. Hay que recordar que si queremos ejecutar la funcionalidad a través la interfaz gráfica hay que dejar el hilo principal para actualizar los elementos gráficos de la aplicación. Para ello, el módulo UI incluye el decorador “@ui.in_backgroud” para poder tener control de los hilos de ejecución.

PoC: Let´s do it

Una vez integrada la interfaz gráfica, se me ocurrió probar las nuevas funcionalidades con la app de iOS en Swift para exfiltrar datos con Latch. Como no quería abandonar el iPad como entorno de desarrollo y pruebas, decidí convertir el proyecto de XCode en una aplicación universal, para que pudiera ejecutarse tanto en iPhone como en iPad.

Figura 5: Proyecto de XCode optimizado para iPad

Para ello solo tuve que cambiar un poco los elementos de la interfaz, que al usar AutoLayout se adaptan a cualquier formato de pantalla, e indicar en la Property list del proyecto las orientaciones de pantalla tanto para iPhone como para iPad. Teniendo todos estos cambios es posible probar la exfiltración de un mensaje entre aplicaciones en un Ipad.


Figura 6: Video de exfiltración en iPad entre dos aplicaciones, una en Python y otra en Swift

Bonus extra - extensiones en iOS

Mientras estaba escribiendo este post, encontré en la documentación de Pythonista la posibilidad de crear Extensiones y Widgets fácilmente a través de un módulo Python que aporta la app. Básicamente, el módulo appex permite detectar si la ejecución de un script se realiza a través de una extensión o widget, e incluye varias funciones para gestionar el flujo de ejecución. Por ejemplo, con ‘get_text()’ puedes acceder al texto que recoge la extensión, con ‘get_image()’ a imágenes, etcétera.

Así que, con unas pocas lineas de código, pude crear una extensión para exfiltrar cualquier texto desde cualquier parte de un dispositivo iOS a través del módulo en Python.


Figura 7: Funcionamiento de la extensión en iPad

Estos han sido los añadidos que he conseguido jugando un poco con las herramientas de desarrollo que existen en iOS. Se puede observar que poco a poco esta plataforma va incluyendo aplicaciones potentes que permiten programar desde dispositivos móviles. De nuevo vuelvo a dejar el enlace al repositorio del proyecto, por si queréis pasar a echar un ojo o ampliar funcionalidades.

Un saludo.

Autor: Lucas Fernández

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

Entrada destacada

+300 referencias a papers, posts y talks de Hacking & Security con Inteligencia Artificial

Hace un mes comencé a recuperar en un post mi interés en los últimos años, donde he publicado muchos artículos en este blog , y he dejado mu...

Entradas populares