# Objection Tutorial {{#include ../../../banners/hacktricks-training.md}} ## **Introducción** **objection - Exploración Móvil en Tiempo de Ejecución** [**Objection**](https://github.com/sensepost/objection) es un kit de herramientas de exploración móvil en tiempo de ejecución, impulsado por [Frida](https://www.frida.re). Fue creado con el objetivo de ayudar a evaluar aplicaciones móviles y su postura de seguridad sin la necesidad de un dispositivo móvil con jailbreak o root. **Nota:** Esto no es alguna forma de bypass de jailbreak / root. Al usar `objection`, todavía estás limitado por todas las restricciones impuestas por el sandbox aplicable al que te enfrentas. ### Resumen El **objetivo** de **objection** es permitir al usuario llamar a las **acciones principales que ofrece Frida**. **De lo contrario**, el usuario necesitará crear un **script único para cada aplicación** que desee probar. ## Tutorial Para este tutorial voy a usar el APK que puedes descargar aquí: {% file src="../../../images/app-release.zip" %} O desde su [repositorio original](https://github.com/asvid/FridaApp)(descargar app-release.apk) ### Instalación ```bash pip3 install objection ``` ### Conexión Haz una **conexión ADB regular** y **inicia** el **servidor frida** en el dispositivo (y verifica que frida esté funcionando tanto en el cliente como en el servidor). Si estás utilizando un **dispositivo rooteado**, es necesario seleccionar la aplicación que deseas probar dentro de la opción _**--gadget**_. en este caso: ```bash frida-ps -Uai objection --gadget asvid.github.io.fridaapp explore ``` ### Acciones Básicas No se enumerarán todos los comandos posibles de objections en este tutorial, solo los que he encontrado más útiles. #### Entorno Se puede encontrar información interesante (como contraseñas o rutas) dentro del entorno. ```bash env ``` ![](<../../../images/image (220).png>) #### Información de Frida ```bash frida ``` ![](<../../../images/image (1093).png>) #### Cargar/Descargar ```bash file download [] file upload [] ``` #### Importar script de frida ```bash import ``` #### SSLPinning ```bash android sslpinning disable #Attempts to disable SSL Pinning on Android devices. ``` #### Detección de root ```bash android root disable #Attempts to disable root detection on Android devices. android root simulate #Attempts to simulate a rooted Android environment. ``` #### Comando Exec ```bash android shell_exec whoami ``` #### Capturas de pantalla ```bash android ui screenshot /tmp/screenshot android ui FLAG_SECURE false #This may enable you to take screenshots using the hardware keys ``` ### Análisis estático hecho dinámico En una aplicación real, deberíamos conocer toda la información descubierta en esta parte antes de usar objection gracias al **análisis estático**. De todos modos, de esta manera tal vez puedas ver **algo nuevo**, ya que aquí solo tendrás una lista completa de clases, métodos y objetos exportados. Esto también es útil si de alguna manera **no puedes obtener un código fuente legible** de la aplicación. #### Listar actividades, receptores y servicios ```bash android hooking list activities ``` ![](<../../../images/image (1016).png>) ```bash android hooking list services android hooking list receivers ``` Frida lanzará un error si no se encuentra ninguno #### Obteniendo la actividad actual ```bash android hooking get current_activity ``` ![](<../../../images/image (813).png>) #### Buscar Clases Comencemos a buscar clases dentro de nuestra aplicación. ```bash android hooking search classes asvid.github.io.fridaapp ``` ![](<../../../images/image (507).png>) #### Métodos de búsqueda de una clase Ahora extraigamos los métodos dentro de la clase _MainActivity:_ ```bash android hooking search methods asvid.github.io.fridaapp MainActivity ``` ![](<../../../images/image (929).png>) #### Lista de métodos declarados de una clase con sus parámetros Vamos a averiguar qué parámetros necesitan los métodos de la clase: ```bash android hooking list class_methods asvid.github.io.fridaapp.MainActivity ``` ![](<../../../images/image (299).png>) #### Listar clases También podrías listar todas las clases que se cargaron dentro de la aplicación actual: ```bash android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes. ``` Esto es muy útil si quieres **enganchar el método de una clase y solo conoces el nombre de la clase**. Podrías usar esta función para **buscar qué módulo posee la clase** y luego enganchar su método. ### Enganchar es fácil #### Enganchar (observar) un método Del [código fuente](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) de la aplicación sabemos que la **función** _**sum()**_ **de** _**MainActivity**_ se está ejecutando **cada segundo**. Intentemos **extraer toda la información posible** cada vez que se llama a la función (argumentos, valor de retorno y traza de llamada): ```bash android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return ``` ![](<../../../images/image (1086).png>) #### Hooking (observando) una clase entera En realidad, encuentro todos los métodos de la clase MainActivity realmente interesantes, así que **los engancharé todos**. Ten cuidado, esto podría **hacer que la aplicación se bloquee**. ```bash android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return ``` Si juegas con la aplicación mientras la clase está enganchada, verás cuando **cada función es llamada**, sus **argumentos** y el **valor de retorno**. ![](<../../../images/image (861).png>) #### Cambiando el valor de retorno booleano de una función Del código fuente puedes ver que la función _checkPin_ recibe un _String_ como argumento y devuelve un _boolean_. Hagamos que la función **siempre devuelva true**: ![](<../../../images/image (883).png>) Ahora, si escribes cualquier cosa en el cuadro de texto para el código PIN, verás que cualquier cosa es válida: ![](<../../../images/image (228).png>) ### Instancias de clase Busca e imprime **instancias activas de una clase Java específica**, especificada por un nombre de clase completamente calificado. El resultado es un intento de obtener un valor de cadena para una objeción descubierta que típicamente **contendría valores de propiedad para el objeto**. ``` android heap print_instances ``` ![](<../../../images/image (1095).png>) ### Keystore/Intents Puedes jugar con el keystore y los intents usando: ```bash android keystore list android intents launch_activity android intent launch_service ``` ### Memoria #### Volcado ```bash memory dump all #Dump all memory memory dump from_base #Dump a part ``` #### Lista ```bash memory list modules ``` ![](<../../../images/image (286).png>) En la parte inferior de la lista puedes ver frida: ![](<../../../images/image (1097).png>) Verifiquemos qué está exportando frida: ![](<../../../images/image (298).png>) #### Buscar/Escribir También puedes buscar y escribir dentro de la memoria con objection: ```bash memory search "" (--string) (--offsets-only) memory write "
" "" (--string) ``` ### SQLite Puedes usar el comando `sqlite` para interactuar con bases de datos sqlite. ### Exit ```bash exit ``` ## Lo que me falta en Objection - Los métodos de hooking a veces hacen que la aplicación se bloquee (esto también se debe a Frida). - No puedes usar las instancias de las clases para llamar a las funciones de la instancia. Y no puedes crear nuevas instancias de clases y usarlas para llamar a funciones. - No hay un atajo (como el de sslpinnin) para enganchar todos los métodos criptográficos comunes que utiliza la aplicación para ver texto cifrado, texto plano, claves, IVs y algoritmos utilizados. {{#include ../../../banners/hacktricks-training.md}}