Android Hacking 101 - Introducción

Hola, mis buenos amigos de Hackplayers, su amigo stux de nuevo por estos lares solo que esta vez no será ninguna máquina boot2root, en esta ocasión vengo aportar un pequeño post sobre algo que es muy de moda y que me gusta mucho, me refiero a lo que es el hacking de aplicaciones móviles en este caso orientado en android.

Es común encontrar aplicaciones móviles cuando estamos llevando a cabo una auditoría de seguridad o haciendo programas de recompensas por errores, así que decidí crear este pequeño post donde veremos unos conceptos básicos que debemos tener en cuenta antes de poder iniciar a reventar cosas, no comais ansias.

Las aplicaciones Android se dividen ampliamente en tres tipos en función de cómo se desarrollan:

    1. Nativas
    2. Hibridas
    3. Aplicaciones basadas en web

Nativas: Son aquellas aplicaciones desarrolladas única y exclusivamente para sistemas operativos móviles, ya sea Android o IOS. En Android se utiliza el lenguaje de programación Java o kotlin, mientras que en IOS se hace uso de Swift o Objective-C. Estos lenguajes de programación son los oficiales de los respectivos sistemas operativos.

Híbridas: Estas aplicaciones utilizan tecnologías como HTML, CSS y JavaScript, todas ellas vinculadas y procesadas a través de frameworks como Apache Córdova, Ionic, entre otras.

Web: Una aplicación web móvil, es exactamente lo que dice que es, una aplicación desarrollada con tecnologías web como JavaScript o HTML5 para proporcionar capacidades de interacción, navegación o personalización. Se ejecutan en el explorador web de un dispositivo móvil y se representan solicitando páginas web desde el servidor back-end.

Estructura fundamental de las aplicaciones Android

Cada aplicación que descargamos e instalamos desde Play Store o cualquier otra fuente tiene la extensión .apk. Estos archivos APK son archivos comprimidos, que contienen otros archivos y carpetas que discutiremos en un momento.

Imagen 1. Estructura de una aplicación Android

AndroidManifest.xml: el archivo de manifiesto en formato XML binario.
classes.dex: código de aplicación compilado en el formato dex.
resources.arsc: archivo que contiene recursos de aplicación precompilados, en XML binario.
res/: carpeta que contiene recursos no compilados en resources.arsc
assets/: carpeta opcional que contiene activos de aplicaciones, que AssetManager puede recuperar.
lib/: carpeta opcional que contiene código compilado, es decir, bibliotecas de código nativas.
META-INF/: carpeta que contiene el MANIFEST. MF, que almacena metadatos sobre el contenido del JAR. que a veces se almacenará en una carpeta llamada original. La firma del APK también se almacena en esta carpeta.

Cada archivo APK incluye un archivo AndroidManifest.xml que declara el nombre del paquete de la aplicación, los componentes de la versión y otros metadatos. Detalle completo del archivo de especificaciones del manifiesto de Android se puede ver aquí. A continuación, se muestran solo algunos atributos comunes que se pueden identificar en AndroidManifest.
 
Attributes
Notes
Manifest tag
contiene el modo de instalación de Android, el nombre del paquete, las versiones de compilación
Permissions
permiso personalizado y nivel de protección
uses-permissions
solicita un permiso que debe concederse para que funcione, la lista completa de permisos api puede hacer referencia aquí.
uses-feature
Declara una única característica de hardware o software que utiliza la aplicación.
Application
La declaración de la solicitud contendrá toda la actividad
Activity
Declara una actividad que implementa parte de la interfaz de usuario visual de la aplicación.
intent-filter
Especifica los tipos de intenciones a los que puede responder una actividad, servicio o receptor de difusión.
service
Declara un servicio como uno de los componentes de la aplicación.
receiver
Los receptores de difusión permiten que las aplicaciones reciban intenciones que son emitidas por el sistema o por otras aplicaciones, incluso cuando otros componentes de la aplicación no se están ejecutando.
provider
Declara un componente de proveedor de contenido. Un proveedor de contenido es una subclase de ContentProvider que proporciona acceso estructurado a los datos administrados por la aplicación.

La aplicación apk que esta incluye un archivo .dex, que contiene código de bytes binario Dalvik. Smali es un lenguaje ensamblador que se ejecuta en la JVM (Java Virtual Machine) de Android.

Ejemplo código smali:


Sintaxis Smali – Tipos


En el código de bytes de dalvik, los registros son siempre de 32 bits y pueden contener cualquier tipo de valor. 2 registros se utilizan para contener tipos de 64 bits (largo y doble). Para más información sobre registros smali visitar la siguiente wiki

Ubicación de almacenamiento de archivos APK dentro de nuestro dispositivo móvil

Dependiendo de quién instaló la aplicación y qué opciones adicionales se proporcionan durante la instalación, hay diferentes ubicaciones de almacenamiento en los dispositivos Android.

/data/app/. Las aplicaciones instaladas por el usuario se colocarán en esta ubicación.
/system/app/. Las aplicaciones que vienen con la imagen del sistema se colocarán bajo esta ubicación.
/data/app-private/. Las aplicaciones que requieren una protección de copia especial en el dispositivo suelen estar bajo esta carpeta.

Con esto damos por terminada la primera parte de esta serie post sobre Android hacking, en el próximo estaremos montando nuestro laboratorio con las diferentes herramientas que podemos utilizar para las pruebas de seguridad para hacking de aplicaciones Android.

Saludos.
                                   
Contribución gracias a César Calderón

Comentarios