Buenas! hoy vamos a tocar un par de temas básicos pero a la vez muy importantes.
¿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?
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.
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