This page looks best with JavaScript enabled

Pentesting Mobile 101: Destripando un APK (Android Application Package)

 ·   4 min read  ·  Autor - Gabdotsh

Buenas! hoy vamos a tocar un par de temas b√°sicos pero a la vez muy importantes.

Destripando un APK

¬ŅQue es un APK?

Para responder esta pregunta de forma sencilla un APK (Android Application Package) es un paquete de instalación que contiene los datos de una aplicación. En otras palabras, al descargar un aplicativo para nuestro dispositivo android del Play Store lo que estamos haciendo basicamente es bajar un archivo .APK para su posterior instalación.

¬ŅQue lleva dentro un APK?

Estructura de un APK

Un archivo APK es un archivo que normalmente contiene los siguientes directorios y archivos:

  • META-INF directorio:
    • MANIFEST.MF: el archivo manifest
  • Lib: El directorio que contiene el c√≥digo compilado que es espec√≠fico de una capa de software de un procesador, el directorio se divide en m√°s directorios dentro de √©l:
    • armeabi: C√≥digo compilado solo para todos los procesadores basados en ARM.
    • armeabi-v7a: C√≥digo compilado solo para todos los procesadores ARMv7 y posteriores.
    • arm64-v8a: C√≥digo compilado solo para todos los procesadores ARMv8 arm64 y posteriores.
    • x86: C√≥digo compilado solo para procesadores x86.
    • x86_64: C√≥digo compilado solo para procesadores x86-64.
    • mips: C√≥digo compilado solo para procesadores MIPS.
  • res: El directorio que contiene recursos no compilados en resources.arsc
  • resources.arsc: Un archivo que contiene recursos precompilados, como XML binario, por ejemplo.
  • assets: Un directorio que contiene recursos de aplicaciones, que puede ser recuperado por AssetManager.
  • AndroidManifest.xml: Un archivo de manifiesto adicional de Android, que describe el nombre, la versi√≥n, los derechos de acceso y los archivos de bibliotecas referenciados para la aplicaci√≥n.
  • classes.dex: Las clases compiladas en el formato de archivo dex, comprensible por la m√°quina virtual Dalvik y por Android Runtime.

Una vez que ya conocemos y comprendemos que es lo que tiene un APK internamente empezamos a ver vectores de revisión al momento de revisar.

¬ŅC√≥mo podemos usar esta informaci√≥n a nuestro favor?

Android Manifest

  • android:allowBackup: Por defecto esta directiva toma el valor TRUE, es decir, a menos que en el AndroidManifest se encuentre inicializado en FALSE su valor va a ser TRUE. En caso de que la aplicaci√≥n guarde informaci√≥n sensible esta directiva podria permitirle a un posible atacante realizar un backup de la misma lo que daria como consiguiente el acceso a esta informaci√≥n sensible y la posibilidad de instalar el backup robado en otro dispositivo movil fisico o emulado a traves de adb restore.
  • android:debuggable: Por defecto esta directiva toma el valor FALSE. Basicamente permite a un atacante realizar el debug de la aplicaci√≥n inclusive en modo usuario. Lo que nos va a permitir un debuger va a ser entender a fondo como la aplicaci√≥n realiza ciertas acciones que de otra manera no podriamos ver, interrumpir el flujo de la aplicaci√≥n o hasta inclusive realizar algun tipo de bypass a la misma.
  • android:usesCleartextTraffic: Por defecto esta directiva se encuentra con el valor TRUE para APIS nivel 27 (Android 8.1) o menores. Lo que permite es la posibilidad de comunicaciones en texto plano, al estar el atributo en FALSE automaticamente la aplicaci√≥n rechaza este tipo de comunicaciones.¬†La raz√≥n para evitar el tr√°fico en texto plano es la falta de confidencialidad, autenticidad y protecciones contra la manipulaci√≥n de datos; un atacante podria espiar los datos transmitidos y tambi√©n modificarlos sin ser detectado.

Dentro del manifest tambien vamos a encontrar los permisos que va a requerir la aplicaci√≥n de nuestro dispositivo lo cual es muy importante. Finalmente vamos a observar “app components” como ser activities, services, broadcast receivers y content providers. De estos dos seguramente hablemos en un proximo post ya que es un tema para ir en profundidad. So stay tunned! (:

“/res/raw” y “values/strings.xml”:

Ambos dos son sumamente importantes, por que? basicamente por que en estos podriamos llegar a encontrar API Keys, alguna credencial olvidada por los desarrolladores, información que puede ser relevante para un posible ataque.

Strings.xml

Para el caso de las API Keys hay un github muy bueno el cual recomiendo que es Keyhacks donde tenemos el método de uso de cada potencial API Key que identifiquemos.

3. Código Smali

Adem√°s, en caso de que necesitemos hacer algun tipo de parcheo de la aplicacion por codigo vamos a tener acceso al codigo smali al desempaquetar el APK.

¬ŅQue es codigo smali? a grandes razgos el codigo smali es una representaci√≥n en lenguaje de bajo nivel del c√≥digo, con este vamos a poder ver¬†los nombres de las clases de Java y Android, as√≠ como los nombres de los m√©todos.

Snifer En próximas entradas estaremos viendo el uso de herramientas que nos permitan automatizar la detección de vulnerabilidades por fallas en el punto de desarrollo que deben ser cubiertas.

Espero que este post les haya ayudado a entender m√°s sobre un APK y las buenas practicas sobre el mismo.

Saludos y happy hacking!

Jorge Mac Tier
@gabdotsh

Share on
Support the author with

Avatar
WRITTEN BY
Gabdotsh
Escritor en el blog Snifer@L4b's. Mobile Application Security Specialist.