Como parte de nuestra serie de artículos sobre pentesting en aplicaciones iOS, en esta oportunidad conocemos algunas herramientas y técnicas de análisis desde un enfoque teórico y práctico.
Tabla de contenidos
Introducción
En artículos anteriores hemos mencionado el enfoque de análisis dinámico y estático, hemos planteado temas relativos a las bases metodológicas del análisis de aplicaciones iOS y también hemos mencionando, por ejemplo, las guías que ofrece la organización OWASP. Pero en esta oportunidad analizaremos distintos enfoques de análisis a fin de precisar algunas técnicas y herramientas que nos ayudarán con la auditoría de nuestras aplicaciones.
Otros artículos de esta serie sobre pentesting en iOS:
Entrando en la superficie de análisis
Como hemos mencionado en esta serie de artículos sobre pentesting en aplicaciones iOS, hemos logrado instalar un aplicación de estudio y algunas herramientas que nos sugerirían que solo restaría comenzar con las pruebas de análisis, pero siguiendo con el principio de las distintas metodologías de análisis de hacking ético, una de las primeras tareas que debemos realizar antes de comenzar con las pruebas de penetración es realizar un proceso reconocimiento sobre nuestro objetivo de análisis.
Para cualquier aplicación, este proceso se basa esencialmente en utilizar la aplicación que necesitamos analizar a fin de entender cómo funciona y así generar un “mapeo” que luego nos servirá para realizar nuestras pruebas de análisis con un sentido más racional, minimizando los resultados de cualquier tipo de prueba automatizada.
Nuestro objetivo será entender el funcionamiento de la app a nivel usuario (tarea escencial que luego nos permitirá decidir si podemos o no ejecutar, por ejemplo, un ataque para escalar privilegios), para entender la lógica, la arquitectura, la disposicion de usuarios y privilgios, el flujo de la comunicacion entre objetos de la aplicación, cuándo se produce la comunicación con un servidor, prestar atención especial a eventos de la aplicación (problemas de lógica de la aplicación, límite de caractéres en formularios) y su infraestructura general.
Además de otra información que podemos obtener del uso normal de la app, esta tarea de utilizar la aplicación y observar su funcionamento es radical para comprender el contexto de nuestra superficie de análisis. Luego, toda la información que vayamos recoletando la complementaremos con la información que obtendremos del volcado de clases cuando analicemos el binario de la aplicación —hablaremos mas delante de esto y de todas las herramientas de tipo debbugguing que podamos utilizar para anlizar el comportamiento de la aplicación.
Sin dudas que todo este proceso hace que podamos obtener un mapeo bastante completo de nuestra aplicación, lo cual nos permitirá establecer con con mayor precisión cuál será la superficie de ataque con la que trabajaremos. Para este proceso es importante ser ordenados. Por ejemplo, utilizando esquemas y diagramas de flujo que ayuden a organizar la información que vayamos relacionando.
Si bien este tipo de pruebas no aplican a la app de estudio que hemos instalado por estar esta diseñada con fines académicos, es importante tener presente lo fundamental que es esta etapa, dado que desde allí podremos corrernos de cualquier prueba automatizada y lograr ser precisos en las pruebas que debemos ejecutar.
Una vez que hemos probado nuestra aplicación de estudio y hemos logrado organizar esquemáticamente la informacion recolectada, tenemos diversos caminos que nos irán aportando información de nuestro objetivo. Son caminos que tendremos que recorrer para realizar las pruebas que nos sugieren las diversas organizaciones como OWASP, aunque lo más lógico una vez probada la aplicación sería continuar por el análisis de la aplicación instalada en el dispositivo. Esto implica aspectos como el análisis de los binarios y el análisis en runtime, entre otros.
En esta oportunidad plantearemos recorrer el camino desde lo que podemos considerar la capa más externa de la aplicación (capa de red) hacia las capas más internas. Considerando también el análisis de la aplicación instalada en el dispositivo con sus diversas aristas, algo que analizaremos en otras entragas.
A continuación, recorremos los aspectos más relevantes que debemos considerar a la ahora de ejecutar nuestras auditorías sobre la capa de red conjuntamente con algunas herramientas de análisis.
Análisis de tráfico
Pues bien, dentro del análisis de tráfico sin dudas nuestro objetivo será capturar información sensible y detectar posibles vulnerabilidades en las comunicaciones, aunque a la hora de auditar nuestra aplicación debemos considerar ciertos puntos; por ejemplo, diferenciar entre tráfico generado durante la instalación de la aplicación y el tráfico que se genera mientras se utiliza la misma. Es posible que haya datos en tránsito durante la instalación de la aplicación que luego no existan durante la ejecución o el uso de la misma. Por esto mismo es preferible realizar dos capturas distintas de tráfico, realizando una captura cuando instalamos la aplicación por primera vez y otra cuando usamos la aplicación.
Estas capturas por lo general se pueden realizar mediante el uso de herramientas como tcpdump o Wireshark. A partir de las capturas obtendremos archivos .pcap que luego analizaremos de manera estática para buscar información relevante en las mismas.
Otro de los puntos importantes que debemos considerar es que no todo el tráfico de una aplicación va por http o https. Podría darse el caso donde se estén utilizando otros puertos y servicios para establecer comunicaciones.
En cuanto al análisis de tráfico web será conveniente realizar pruebas de intercepción de tráfico con herramientas como los ProxyWeb, para los que disponemos de herramientas como Zap o Burp Suite, las cuales nos exigen utilizar certificados de confianza en el dispositivo para poder realizar las intercepciones de tráfico.
Tanto las capturas que realicemos con tcpdump como el tráfico que logremos capturar mediante el uso de los proxy web, ambas nos darán aun más información sobre nuestro objetivo de ataque. De este modo podremos saber, por ejemplo, a qué servidores se conecta nuestra aplicación y mediante qué servicios, y de esta manera estaríamos ampliando nuestra superficie de ataque pudiendo agregar a nuestro diagrama de mapeo de la aplicación nuevos objetos de análisis y mayor entendimiento de la misma.
Captura y análisis de tráfico con TCPDUMP
Tal como hemos mencionado anteriormente, será muy importante poder capturar todo el tráfico que se genera cuando instalamos la aplicación que queremos analizar, así como también aquel que se genera cuando utilizamos la misma. Si bien para esto podemos utilizar diversas herramientas, veremos cómo podemos llevar a cabo este proceso mediante la herramienta tcpdump, la cual nos permite capturar todo el tráfico que se ejecute en nuestro dispositivo.
Antes de poner manos a la obra en lo que refiere a capturar paquetes directamente desde iOS, es importante tener presente que necesitaremos poner la tarjeta de red de nuestro dispositivo en modo monitor y esto en principios es un problema, dado que como medida preventiva Apple no permite esta función. Sin embargo, existen diversas herramientas externas que permiten cambiar el estado de la tarjeta de red aunque requieren que realicemos Jailbreak en el dispositivo.
En este caso descartaremos el uso de herramientas externas y la funcionalidad del modo promiscuo en la interfaz de nuestro dispositivo. Utilizaremos nuestro Mac como interceptor de los paquetes que nuestro iOS envía o recibe mediante la creación de una interfaz virtual y así más tarde podamos analizar las capturas obtenidas.
Para poder crear la interfaz virtual en nuestro Mac, el primer paso será identificar el UDID de nuestro dispositivo. Para ello conectaremos nuestro dispositivo por USB al Mac, luego abrimos iTunes, navegamos hasta la información de nuestro iOS, y en la sección general se encuentran los elementos identificativos del dispositivo, tal como se observa en la imagen a continuación:
Nota: Si de primeras no nos sale el UDID podemos hacer clic en los números de la última etiqueta y esta irá mostrando diferentes valores, incluido el UDID.
Una vez obtenido el UDID del dispositivo utilizaremos este identificador para crear una interfaz remota virtual y por medio de esta llevar a cabo la captura de los paquetes. Esta interfaz de red virtual que vamos a crear representara la interfaz de red del dispositivo iOS por la que pasaran todos los paquetes que nos interesan capturar. Para ello abrimos el terminal y escribimos el comando rvictl -s <UDID> que se ve en la siguiente imagen:
Nota: Para poder ejecutar rvictl necesitamos tener instalado el Command Line Tools de Xcode
Tal como observamos en la imagen, en la salida del comando se crea la interfaz del dispositivo cuyo UDID hemos indicado. Para verificar que la interfaz se creó satisfactoriamente podemos listar las interfaces de red usando el comando (ifconfig -l) que se muestra en la siguiente imagen.
Una vez que tenemos nuestra interfaz configurada solo queda comenzar a capturar tráfico y para ello colocaremos el siguiente comando (sudo tcpdump -i revi0 -w ./output.pcap) como se observa en la siguiente imagen.
Desarrollando un poco más la sintaxis que hemos colocado anteriormente, debemos mencionar que con la opción -i le estamos diciendo a tcpdump en qué interfaz queremos escuchar (en nuestro caso es rvi0, que es la que hemos creado anteriormente con el UDID del dispositivo), y el parámetro -w específica la ruta y nombre del directorio donde queremos guardar la captura que vamos a realizar.
Si observamos en la imagen, tras ejecutar el comando se da comienzo a la captura de los paquetes del dispositivo mostrando en pantalla el peso del archivo de captura. De este modo, todo lo que hagamos en el dispositivo quedará registrado en el archivo de captura. Para finalizar la captura solo habrá que oprimir Ctrl+C y esta se detendrá arrojando los resultados en un archivo de extensión .pcap que, como dijimos, luego podremos analizar de forma estática. Por otra parte, es importante que al terminar de capturar los paquetes no olvidemos eliminar la interfaz remota que hemos creado. Para eso nos podemos ayudar con el comando (rvictl -x <UDID>) que se muestra en la siguiente imagen:
Como podemos observar de manera práctica y sencilla, con esta herramienta podemos realizar capturas de tráfico que involucran absolutamente todo el ecosistema de comunicaciones donde estamos analizando nuestra aplicación y no obstante tenemos la posibilidad de realizar estos análisis repetidamente, puesto que contamos con una muestra de la captura de tráfico que podemos manipular a nuestra disposición. Si observamos la siguiente imagen vemos el archivo de captura que hemos obtenido abierto con Wireshark en el cual se muestran distintas opciones de búsqueda como Regular expresión, Strings, Hex Value y otras herramientas que podemos utilizar para encontrar información relevante dentro de la captura realizada.
Captura y análisis de tráfico con WebProxy (Burp)
Siguiendo con la intercepción y análisis de tráfico, en este punto veremos cómo interceptar tráfico mediante un WebProxy, lo cual nos permitirá ejecutar un ataque de “man the middle” clásico para interceptar tráfico que va cifrado. Aunque existen varias herramientas para lograr esta técnica, debemos destacar la eficacia de mitmproxy, la cual cuenta con basta documentación y, como vemos en la siguiente imagen, nos ofrece un esquema de funcionamiento del tipo de proxy (RegularProxy) que necesitaremos utilizar para llevar a cabo este tipo de intercepciones.
Tal como mencionábamos anteriormente, existen diversas herramientas que nos permiten realizar esta técnica de interceptar tráfico cifrado y a continuación veremos cómo realizarla mediante el WebProxy de BurpSuite, la cual consta de una versión profesional y otra community que podemos descargar desde el siguiente enlace e incluye diversas herramientas para manipular tráfico.
Como veremos más adelante, este tipo de herramientas nos obligarán a agregar en nuestro dispositivo un certificado para poder llevar a cabo las diversas intercepciones que necesitemos realizar. Este tipo de herramientas (WebProxy), entre las cuales podemos destacar a BurpSuite, mitmproxy o Zap, son muy poderosas puesto que nos permiten modificar consultas y realizar análisis minuciosos sobre casos específicos y traen diversas funcionalidades como escaneo de vulnerabilidades, crawlers y herramientas de automatización, entre otras.
Una vez instalado BurpSuite en nuestro Mac, lo primero que haremos será revisar nuestra configuración de red a fin de buscar nuestra dirección IP utilizando, por ejemplo, el comando ifconfig; tal como se muestra en la siguiente imagen.
Una vez que sabemos cuál es nuestra dirección IP abriremos Burp, luego buscaremos la solapa Proxy, Options, y daremos clic en Editar, tal como se observa en la siguiente imagen. Aquí especificaremos en el puerto el número Blind to port 8080 y en specific address nuestra dirección de IP. Luego, hacemos clic en OK.
Una vez creada la configuración en Burp tomaremos nuestro dipositivo e iremos a la configuración de nuestra red inalámbrica y veremos una opción llamada “configurar proxy”, tal como se muestra en la siguiente imagen:
Una vez ingresado al menú de la configuración del proxy, colocaremos donde dice Servidor los datos de la IP donde tenemos instaldo Burp e indicamos el número de puerto que, tal como se observa, en este caso es el 8080.
Una vez guardados los cambios de la configuración del proxy ingresaremos al navegador safari y colocaremos la URL http://burp, tal como se muestra en la imagen.
Si observamos, se abre un sitio web desde el cual podemos descargar el certificado de confianza que necesitaremos para interceptar las conexiones cifradas. En la parte superior derecha vemos un botón llamado CA Certificate, tal como se aprecia en la siguiente imagen, en el cual debemos hacer clic para descargar el certificado.
Tras oprimir el botón del certificado nos aparece un mensaje que advierte la descarga del certificado y debemos elegir la opción permitir.
Luego procedemos a instalar el certificado de confianza que descargamos. Por supuesto que esto lo podemos realizar por que tenemos nuestro dispositivo con jailbreak, de otro modo solo podriamos ver tráfico http.
Ahora bien, ya tenemos configurado el proxy tanto en nuestra PC como en nuestro dispositivo. Ahora es momento de interceptar tráfico https y ver su contenido. Para este ejemplo ingresaremos al sitio de https://apple.com desde nuestro dispositivo y capturaremos este tráfico desde el proxy burp instalado en nuestra PC.
Tal como observamos en la siguiente imagen, una vez que ingresamos al sitio por https el proxy automáticamente intercepta la conexión.
Si observamos la descripción del tráfico interceptado vemos con claridad los encabezados utilizados y los parametros de consulta. En este caso el ejemplo es sencillo, pero bien podriamos interceptar el inicio de sesión de una aplicación y ver, por ejemplo, cómo viajan los parámetros de las credenciales, entre otros aspectos.
Todas las pruebas de intercepción que realicemos sin dudas serán complementarias al mapeo de la aplicación que hemos realizado inicialmente. Hemos dicho que a medida que ganemos información de nuestra aplicación es probable que aumentemos nuestra superficie de ataque, dando lugar, por ejemplo, a la deteccion de diversos servidores y servicios que utilice la aplicación, pues en este punto nuestro objetivo será analizar los puertos abiertos y servicios publicados (tanto TCP como UDP), así como el analisis de la existencia de sistemas IDS/IPS/WAF e intento de bypass de los mismos o posibles vulnerabilidades de tipo web que podamos detectar.
Hay aplicaciones que utilizan, por ejemplo, el módulo webview, donde se hacen muchas peticiones tipo GET que conectan con diversas API y aquí es probable que podamos encontramos con vulnerabilidades típicas en aplicaciones web (XSS, CSRF, etc.) o infraestructuta (SSL, Headers,etc.). Para este tipo de tareas es fundamental el uso de herramientas como los web proxy Burp o Zap, las cuales, como ya dijimos, nos permiten desplegar técnicas de análisis a fin de detectar vulnerabilidades de un modo muy eficaz.
En este punto donde la superficie de ataque puede crecer radicalmente, hay casos en los que es necesario realizar auditorias paralelas y fuera del análisis de nuestra aplicación. Si bien esto incrementaría el alcance de análisis, nos desviaría de nuestro foco de estudio y por otra parte nos tomaría demasiado tiempo.
Túneles SSH y otras comunicaciones con el dispositivo
En muchas ocaciones sucederá que necesitemos comunicarnos con el dipositivo evitando que esta comunicación se realice a través de Internet. En estos casos los tuneles SSH cobran una gran utilidad y veremos a continuación cómo se implementan utilizando la herramienta itnl y iproxy
Tunel vía itnl
Para utilizar itnl descargaremos la herramienta desde el siguiente enlace. Una vez descargado el archivo lo descomprimimos y abrimos el directorio descomprimido en el terminal, para llevar a cabo la ejecución del script mediante la sintaxis que se ve en la siguiente imagen:
Como se observa, el script detecta el dispositivo conectado a nuestro equipo y realiza el tunel de la conexión.
A continuacion podemos ver cómo logramos conectarnos al dispositivo mediante el tunel que hemos creado por medio del comando ssh root@localhost -p 2222.
Nota: Recordar que la contraseña por defecto del servicio ssh es “alpine”, la cual debemos cambiar para mayor seguridad.
Como podemos apreciar, el procedimiento para establecer el tunel es muy sencillo y lo mismo veremos que sucede a continuación con la implementación de iproxy.
Tunel vía iproxy
Procedemos descargar la herramienta desde el siguiente enlace y, tal como hemos realizado con itnl, una vez que descargamos la herramienta descomprimimos el archivo y abrimos en el terminal el directorio donde está el archivo para llevar a cabo la ejecución del script mediante la sintaxis que se ve en la siguiente imagen:
Como observamos, la herramienta detecta el dispositivo conectado a nuestro equipo y realiza el tunel de la conexión dandonos la posibilidad, como se ve a continuacion, de conectarnos al dispositivo mediante SSH por el tunel establecido.
Nota: Recordar que la contraseña por defecto del servicio ssh es “alpine”, la cual debemos cambiar para mayor seguridad.
Si bien la creación de este tipo de tuneles nos permite comunicarnos y manipular información en el dispositivo, existen otras herramientas para comunicarnos con el dispositivo y poder manipular información que incluyen la vista de información detallada, instalación de aplicaciones y otras tareas. Podemos mencionar, por ejemplo, a iExplorer, iFunBox o AppleConfigurator2 como herramientas de entorno gráfico, y las librerías de libimobiledevice, que traen herramientas como ideviceinstaller, ideviceinfo, entre otras, que podemos utilizar desde el terminal. Todas son herramientas realmente geniales para comunicarnos con el dispositivo y obtener y manipular información en el mismo.
Herramientas de debugger
Otras herramientas de análisis que son complementarias en toda las etapas de una auditoría son aquellas que nos permiten debugguear y que nos permiten la posibilidad de buscar informacion relevante dentro de los procesos que vayamos ejecutando. Si bien contamos con diversas herramientas que podríamos utilizar a continuacion, veremos cómo utilizar las herramientas de debugger que trae incorporado el IDE Xcode.
Tal como se muestra en la siguiente imagen, abrimos Xcode, luego abrimos Windows y seleccionamos “Device and Simulators”.
Como lo muestra la siguiente imagen, veremos los detalles de nuestro iPhone y tres opciones, Take Screenshot, View Device Logs y Open Console; todas herramientas que nos permiten obtener información del dispositivo y las tareas que se ejcutan en el mismo, incluídas las actividades de las aplicaciones que se encuentren en ejecución.
En la siguiente imagen vemos por ejemplo la salida de la opción Open Console, la cual, como su nombre lo indica, se trata de una consola que muestra la actividad que transcurre en el dispositivo y poseé una opción de búsqueda que nos permite filtrar la información que estamos buscando. En el siguiente ejemplo y tras haber ejecutado la aplicación de estudio que hemos instalado (DVIA) podemos ver la busqueda realizada mediante el filtro del nombre de la aplicación.
Toda esta información es muy valiosa, dado que si bien en este caso hemos realizado un busqueda sencilla podríamos ejecutar consultas más refinadas que nos permitan monitorear qué es lo que está sucediendo en cada actividad del dipositivo y la aplicación que estamos utilizando a fin de relacionar eventos o ayudarnos a tomar decisiones.
Conclusiones
Si bien podría profundizarse más en estas técnicas y herramientas que hemos mencionado y siempre nos quedará información por mencionar, al menos y a modo esquemático han quedado planteados diferentes recursos y consideraciones que podemos utilizar para trabajar a nivel de la capa tráfico/red conjuntamente con las herramientas de debugger.
Para las próximas entregas abordaremos otros recursos que nos ayudaran a analizar nuestra aplicación en el dispositivo, contemplando tanto el análisis de sistema de archivos iOS como el análisis de los binarios y pruebas en tiempo de ejecución a fin de cubrir todas las aristas de análisis y de esta manera disponer de información de referencia sobre cada una de las etapas de análisis que necesitemos ejecutar.
Otros artículos de esta serie:
Pruebas de pentesting en aplicaciones iOS: bases metodológicas y prácticas
Jailbreak: todo lo que debes saber para realizar pentesting sobre aplicaciones iOS
Arquitectura de Seguridad iOS: las bases del pentesting para este sistema operativo