Aplicaciones móviles iOS de ingeniería inversa no es una tarea sencilla. En comparación con la ingeniería inversa de Android con herramientas como apktool, jadx y similares, las herramientas de inversión para iOS son escasas debido a que las medidas de seguridad implementadas por Apple y iOS son menos de código abierto en general. Esto hace que el proceso de inversión sea un poco más complicado pero no imposible de ninguna manera.
En este blog, aprenderemos los conceptos básicos de la ingeniería inversa de los binarios de iOS utilizando algunas de las herramientas más populares proporcionadas por Apple (Xcode Command Line Tools) y también algunas herramientas de terceros. Estos nos ayudarán a obtener información valiosa sobre la aplicación móvil que estamos analizando.
Tenga en cuenta que usaremos macOS para realizar estas pruebas porque proporciona las utilidades y los comandos más útiles para lograr nuestro objetivo. Si no tiene acceso a macOS, siempre puede tomar las ideas presentadas en el contenido de este blog y utilizar herramientas similares disponibles en otros sistemas operativos para lograr un objetivo similar.
Herramientas y utilidades para aplicaciones iOS de ingeniería inversa
Primero, echemos un vistazo rápido a algunas de las herramientas y utilidades que usaremos para obtener conocimiento adicional sobre la aplicación con la que estamos trabajando:
Estos son bastante sencillos de usar y pueden proporcionar mucha información relacionada con el binario que estamos intentando aplicar ingeniería inversa. Antes de comenzar, asegúrese de configurar todas las herramientas anteriores y asegúrese de que funcionen correctamente. Una buena manera de probar esto en herramientas basadas en terminales es emitir el help
comando, que en la mayoría de los casos será una variación de --help, --h
, o similar. Si la lista de comandos relacionados con la herramienta es devuelta por el --help
llamada, lo más probable es que la herramienta esté funcionando correctamente.
Empezando
Una vez que nuestro entorno está configurado, estamos listos para comenzar. Trabajaremos con iGoat, una aplicación de iOS intencionalmente vulnerable disponible públicamente en GitHub y presentada por OWASP. Sigamos adelante y descarguemos el binario: https://github.com/OWASP/iGoat-Swift
Una vez que hayamos descargado el archivo .ipa, localicémoslo y abrámoslo con la herramienta Archive Utility de macOS. Esto descomprimirá el binario y revelará algunas carpetas. Todos los binarios de iOS tienen un Payload
carpeta que contiene un archivo .app, a menudo con el mismo nombre que el binario que estamos analizando. Al hacer clic con el botón derecho en este archivo y seleccionar ‘Mostrar contenido del paquete’, se mostrarán los diferentes archivos que componen el propio binario.
Al mostrar el contenido del paquete de cualquier archivo .app que pertenezca a un .ipa, notaremos que también hay un archivo ejecutable de Unix con el mismo nombre que el .app. Este será el archivo binario principal de la aplicación, mientras que los otros archivos allí son componentes de apoyo que mantienen la aplicación en funcionamiento.
Ahora que hemos repasado los componentes de un binario de iOS, ¡comencemos a invertir! Abra la terminal y navegue hasta la carpeta Payload que acabamos de descompilar. Una vez en ese directorio, estamos listos para comenzar.
Nuevo Méjico
Empezaremos con nm
. Como se mencionó anteriormente, esta utilidad nos ayudará a mostrar diferentes componentes de la aplicación para recopilar información. Lo uso principalmente cuando realizo tareas relacionadas con el cumplimiento en las que necesito verificar si la aplicación que estoy probando implementa un determinado método que va en contra de un determinado estándar, cuando realizo tareas de reconocimiento (por ejemplo, cuando busco nombres de funciones relacionados con implementaciones criptográficas débiles como ‘SecRandomCopyBytes’ o similar), y cuando quiero ver qué nombres de funciones no han sido ofuscados por el desarrollador. Esto es útil ya que ayuda a que la recopilación de información sea un poco más fácil al permitirnos formular un plan sobre las funciones a las que nos dirigiremos a continuación como parte de nuestro proceso de ingeniería inversa. En mi experiencia, nm
funciona mejor con la Terminal grep
utilidad ya que me permite filtrar el contenido descargado por nm
y eche un vistazo rápido a los resultados en lugar de tener que desplazarse por muchos resultados. Un requisito de cumplimiento muy común es el uso de la clase de protección de datos NSFileProtectionComplete, por lo que una forma de ver las diferentes clases de protección de datos implementadas en el código fuente es usar el siguiente comando: nm iGoat-Swift.app/iGoat-Swift | grep -i protect
En la captura de pantalla anterior, podemos identificar llamadas a NSFileProtectionNone y similares, lo que podría provocar fallas de cumplimiento para ciertas organizaciones. El nm
La utilidad también se puede usar de manera similar para buscar el uso de métodos obsoletos (incluyendo el nombre del método deseado después del grep
comando en lugar de ‘proteger’) y revelar nombres de funciones que no han sido ofuscados (nm iGoat-Swift.app/iGoat-Swift | less
mostrará estos: ¡advertencia de salida larga!)
herramienta
A continuación tenemos otool
, que es una de las herramientas más útiles para la ingeniería inversa de iOS, ya que es muy versátil y se puede utilizar para volcar mucha información sobre la aplicación. Un uso muy común es volcar las diferentes bibliotecas y buscar las obsoletas o vulnerables, ya que esto podría comprometer la aplicación. Emitir el siguiente comando mostrará las bibliotecas en uso por la aplicación: otool -L iGoat-Swift.app/iGoat-Swift
instrumentos de cuerda
Analicemos el strings
utilidad siguiente. Como sugiere el nombre, esta utilidad descarga todas las cadenas codificadas en el binario, lo que la hace especialmente útil cuando se buscan credenciales codificadas, secretos e información similar que el desarrollador de la aplicación podría haber dejado en el código fuente por error. Podemos hacer esto ejecutando strings iGoat-Swift.app/iGoat-Swift | grep -i <your_search_here>
codiseño
El codesign
La herramienta, como se mencionó anteriormente, nos permite agregar y manipular firmas, verificar derechos y mucho más. Volcar los derechos de la aplicación suele ser una buena manera de obtener más información sobre la configuración de la aplicación (por ejemplo, si la aplicación utiliza una determinada clase de protección de datos para todos los archivos, aparecerá aquí). Usa el comando codesign -d --entitlements
:- iGoat-Swift.app/
lograr esto.
Desensamblador de tolva
Por último, pero no menos importante, tenemos el desensamblador Hopper, que es probablemente la herramienta más poderosa de las mencionadas anteriormente pero, al mismo tiempo, la más compleja de aprender y utilizar correctamente, ya que requiere conocimiento del código a nivel de máquina (ensamblaje). para poder entender qué está pasando exactamente dentro de la aplicación. Si bien hay otros desensambladores más poderosos como Radare2me gusta usar Hopper por su simplicidad y algunas de las funciones que discutiremos pronto.
Cuando usamos Hopper, tenemos la opción de desensamblar todo el .ipa si queremos centrarnos en la aplicación en sí y todos los componentes de terceros que implementa, o también podemos seleccionar solo el ejecutable de Unix si queremos examinar el código fuente Debido a que hasta ahora hemos estado trabajando solo con el código fuente, sigamos adelante y sigamos haciéndolo. Haga clic derecho en el ejecutable de Unix y seleccione abrir con Hopper Disassembler. Hopper tardará unos minutos en cargar y realizar su análisis de código fuente automatizado, pero una vez que haya terminado, veremos una pantalla similar a la de la captura de pantalla a continuación.
En el menú que aparece en el lado izquierdo de la pantalla, justo debajo de la barra amarilla en la parte superior, podemos ver algunas opciones diferentes, incluidas Etiquetas, Procesos y Cadenas. Las etiquetas contienen las diferentes direcciones de memoria con su nombre/instrucción asociado. El Proc. La pestaña contiene todos los métodos utilizados por la aplicación. Por último, Strings muestra todas las cadenas en el binario (similar a la utilidad que usamos anteriormente). Una cosa que me gusta hacer es utilizar las herramientas anteriores para recopilar la mayor cantidad de información posible, luego ir a Hopper y ver los métodos específicos y cómo interactúan con la aplicación con más detalle. Por ejemplo, al descargar las cadenas de la aplicación, notamos algunas relacionadas con secretos. Si seguimos adelante y buscamos ‘secreto’ en Str. pestaña estos deberían aparecer y deberíamos poder acceder a la función que los contiene haciendo doble clic en él.
Al hacer clic derecho en el aYouFoundTheSec
podemos inspeccionar todas las referencias hacia y desde él que hace la aplicación.
Haciendo clic en ‘Referencias a “aYouFoundTheSec
” (en 0x1b8ca0)’ y seleccionando la primera referencia que aparece en la ventana que aparece nos lleva al método en cuestión.
Además, Hopper tiene una opción muy útil que convierte el código de máquina en pseudocódigo para facilitar la lectura que se puede habilitar haciendo clic en la opción resaltada por el cuadrado rojo en la captura de pantalla a continuación. El cuadrado verde muestra el pseudocódigo correspondiente a las instrucciones de montaje enumeradas anteriormente.
Hopper es una herramienta increíble y muy poderosa que nos permitirá realizar muchas actividades de ingeniería inversa. Todavía no instalé esta aplicación en mi dispositivo iOS, pero al mirar el código puedo decir que hay algún tipo de desafío o validación que se puede omitir profundizando en estos métodos, identificando direcciones específicas que contienen las diferentes validaciones, y eludirlos para alcanzar la función específica en la que la cadena que contiene el real se almacena el código secreto.
Otras herramientas para aplicaciones móviles iOS de ingeniería inversa
Estos son solo algunos pasos básicos que nos ayudarán a comenzar con las aplicaciones móviles iOS de ingeniería inversa. Las herramientas explicadas anteriormente son muy poderosas y tienen muchas capacidades que no se explicaron en esta publicación de blog, así que asegúrese de enumerar siempre los comandos disponibles para cada una de ellas y profundizar leyendo la documentación oficial de cada una de ellas. Además, hay muchas otras herramientas increíbles, como Frida y Radare, que podemos usar para aplicar ingeniería inversa a todo tipo de aplicaciones de iOS. En una nota similar, si desea obtener más información sobre los conceptos básicos de la ingeniería inversa en Android, consulte mi publicación de blog anterior, donde explico terminología básica y demuestro técnicas de inversión utilizando jadx-gui. Y para obtener más información sobre la seguridad de las aplicaciones móviles, pruebe NowSecure Academy cursos gratis.