Exploiting a debuggeable application

Explotando una aplicación depurable

Apoya a HackTricks

Evitando verificaciones de root y depurables

Esta sección de la publicación es un resumen de la publicación https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

Pasos para hacer que una aplicación de Android sea depurable y evitar verificaciones

Haciendo la aplicación depurable

Contenido basado en https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

  1. Descompilar el APK:

  • Utiliza la herramienta APK-GUI para descompilar el APK.

  • En el archivo android-manifest, inserta android:debuggable=true para habilitar el modo de depuración.

  • Vuelve a compilar, firmar y zipalign la aplicación modificada.

  1. Instalar la aplicación modificada:

  • Usa el comando: adb install <application_name>.

  1. Recuperar el nombre del paquete:

  • Ejecuta adb shell pm list packages –3 para listar aplicaciones de terceros y encontrar el nombre del paquete.

  1. Configurar la aplicación para esperar la conexión del depurador:

  • Comando: adb shell am setup-debug-app –w <package_name>.

  • Nota: Este comando debe ejecutarse cada vez antes de iniciar la aplicación para asegurarse de que espera al depurador.

  • Para persistencia, usa adb shell am setup-debug-app –w -–persistent <package_name>.

  • Para eliminar todas las banderas, usa adb shell am clear-debug-app <package_name>.

  1. Preparar para la depuración en Android Studio:

  • Navega en Android Studio a File -> Open Profile or APK.

  • Abre el APK recompilado.

  1. Establecer puntos de interrupción en archivos Java clave:

  • Coloca puntos de interrupción en MainActivity.java (específicamente en el método onCreate), b.java y ContextWrapper.java.

Evitando verificaciones

La aplicación, en ciertos puntos, verificará si es depurable y también comprobará los binarios que indican un dispositivo rooteado. El depurador se puede usar para modificar la información de la aplicación, desactivar el bit depurable y alterar los nombres de los binarios buscados para evitar estas verificaciones.

Para la verificación depurable:

  1. Modificar la configuración de la bandera:

  • En la sección de variables de la consola del depurador, navega a: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.

  • Nota: La representación binaria de flags = 814267974 es 11000011100111011110, lo que indica que la "Flag_debuggable" está activa.

Estos pasos aseguran colectivamente que la aplicación se pueda depurar y que ciertas verificaciones de seguridad se puedan evitar utilizando el depurador, facilitando un análisis o modificación más profundo del comportamiento de la aplicación.

El paso 2 implica cambiar un valor de bandera a 814267972, que se representa en binario como 110000101101000000100010100.

Explotando una vulnerabilidad

Se proporcionó una demostración utilizando una aplicación vulnerable que contiene un botón y un textview. Inicialmente, la aplicación muestra "Crack Me". El objetivo es alterar el mensaje de "Try Again" a "Hacked" en tiempo de ejecución, sin modificar el código fuente.

Verificando la vulnerabilidad

  • La aplicación fue descompilada usando apktool para acceder al archivo AndroidManifest.xml.

  • La presencia de android_debuggable="true" en el AndroidManifest.xml indica que la aplicación es depurable y susceptible a explotación.

  • Vale la pena señalar que apktool se emplea únicamente para verificar el estado depurable sin alterar ningún código.

Preparando la configuración

  • El proceso implicó iniciar un emulador, instalar la aplicación vulnerable y usar adb jdwp para identificar los puertos de Dalvik VM que están escuchando.

  • El JDWP (Java Debug Wire Protocol) permite depurar una aplicación que se ejecuta en una VM al exponer un puerto único.

  • Se necesitó el reenvío de puertos para la depuración remota, seguido de la conexión de JDB a la aplicación objetivo.

Inyectando código en tiempo de ejecución

  • La explotación se llevó a cabo estableciendo puntos de interrupción y controlando el flujo de la aplicación.

  • Se utilizaron comandos como classes y methods <class_name> para descubrir la estructura de la aplicación.

  • Se estableció un punto de interrupción en el método onClick, y se controló su ejecución.

  • Se utilizaron los comandos locals, next y set para inspeccionar y modificar variables locales, particularmente cambiando el mensaje "Try Again" a "Hacked".

  • El código modificado se ejecutó utilizando el comando run, alterando con éxito la salida de la aplicación en tiempo real.

Este ejemplo demostró cómo se puede manipular el comportamiento de una aplicación depurable, destacando el potencial para explotaciones más complejas, como obtener acceso a la shell en el dispositivo en el contexto de la aplicación.

Referencias

Apoya a HackTricks

Last updated