Android Pentesting – Análisis Estático

Un análisis completo de una aplicacion consta de 2 partes:

  • Análisis estático: se basa en los recursos, fichero de propiedades y código fuente de la aplicación.
  • Análisis dinámico: se basa en el comportamiento de la aplicación durante su ejecución controlada.

ANÁLISIS ESTÁTICO

  • Análisis de permisos: Revision del fichero de configuración AndroidManifest.xml .
  • Exploración de recursos: Revision de los directorios de recursos de la aplicación.
  • Búsqueda de cadenas: Busqueda de patrones dentro del código de la aplicación.
  • Revisión del código fuente: Revision del código decompilado de la aplicacion.
  • Verificación del certificado: Verificacion de validez e informacion del certificado.
Flujo del analisis estatico

HERRAMIENTAS PARA ANÁLISIS ESTÁTICO

MobSF

MobSF es una aplicación automatica todo-en-uno (Android / iOS / Windows), es capaz de realizar análisis estáticos y dinámicos, admite binarios de aplicaciones móviles (APK, IPA y APPX) junto con el código fuente comprimido y proporciona API REST. Dynamic Analyzer ayuda a realizar analisis de seguridad en tiempo de ejecución y pruebas instrumentadas interactivas.

android-static-analysis-apk
android-static-analysis-apk2

SublimeText3

Editor de texto y de código fuente…

ANÁLISIS DE COMPONENTES

Para empear es importante identificar tanto los permisos que necesita la aplicación como los demás componentes (activities, services, receivers, content providers) que se encuentran declarados en el fichero AndroidManifest.xml.

El método tradicional para el decompilado de el fichero apk seria con apktool:

Mas sencillo con APKEasyTool:

Y mas aún con MobSF:

«Arrastrar apk y esperar…»

En este fichero se declaran los siguientes elementos que tendremos que tener en cuenta:

  • Permisos: revisarlos cuidadosamente, sobre todo cuando la aplicación requiera permisos que no están relacionados con lo que ofrece la aplicación o que son permisos con privilegios (modificar configuración del sistema o descargar ficheros sin notificación).
  • Activities: cada una de las pantallas empleadas por la aplicación.
  • Services: servicios que corren en segundo plano y pueden llevar a cabo acciones sin interacción del usuario.
  • Receivers: clases que pueden manejar eventos del sistema, como por ejemplo, la aplicación envía un SMS y lee el código de confirmación del SMS recibido, todo en segundo plano.
  • Content Providers: componentes que permiten compartir información con otras aplicaciones.

ANÁLISIS del AndroidManifest.xml

Vamos a centrarnos en los permisos que la aplicación necesita para su correcto funcionamiento, sin dejar de lado el resto de elementos. Se observa que la aplicación utiliza los siguientes componentes declarados en el fichero AndroidManifest.xml:

PERMISOS

Listado de permisos considerados como peligrosos (fuente) :

  • android.permission.INTERNET: Acceso total a Internet.
  • android.permission.READ_PHONE_STATE: Acceso de sólo lectura al estado del teléfono.
  • android.permission.WRITE_EXTERNAL_STORAGE: Escritura en almacenamiento externo.
  • android.permission.ACCESS_NETWORK_STATE: Acceso a información sobre las redes.
  • android.permission.SEND_SMS: Permite el envio de mensajes sms.
  • android.permission.RECEIVE_SMS: Monitorizar SMS entrantes, grabar o procesarlos.
  • android.permission.WAKE_LOCK: Acceso a bloqueos de energía (mantener el procesador durmiendo o la pantalla apagada).
  • android.permission.RECEIVE_BOOT_COMPLETED: Permite que una aplicación reciba el ACTION_BOOT_COMPLETED que se emite después de que el sistema termine de iniciarse.
  • com.android.launcher.permission.INSTALL_SHORTCUT: Instalar un acceso directo.
  • android.permission.READ_SMS: Leer los sms.
  • android.permission.CALL_PHONE: Realizar llamadas de teléfono sin usar el dialer de Android.
  • android.permission.GET_TASKS: Obtener información sobre tareas en ejecución y recientes.
  • android.permission.ACCESS_COARSE_LOCATION: Acceso a la ubicación aproximada derivada de fuentes de ubicación de red, como las torres de posicionamiento 4G y Wi-Fi.
  • android.permission.ACCESS_FINE_LOCATION: Acceso a la ubicación precisa derivada de fuentes de localización como el GPS, las torres de posicionamiento 4G y Wi-Fi.
  • android.permission.ACCESS_WIFI_STATE: Acceso a información sobre redes Wi-Fi.
  • android.permission.PROCESS_OUTGOING_CALLS: Permite que una aplicación visualice el número al que se está llamando con la opción de redirigir la llamada a un número diferente o cancelarla.
  • android.permission.SYSTEM_ALERT_WINDOW: Apertura de ventanas utilizando el tipo TYPE_SYSTEM_ALERT, que se muestra en la parte superior de todas las demás aplicaciones.
  • android.permission.WRITE_SETTINGS: Lectura o escriba en la configuración del sistema.
  • android.permission.INSTALL_PACKAGES: Permite la instalacion de paquetes.
  • android.permission.WRITE_SMS: Escritura de mensajes SMS.

ACTIVITIES

Comenzando por la clase que sirva de punto de entrada a la aplicación se verifican las diferentes «pantallas de la aplicación«.

Cuando un componente de aplicación declara un intent-filter pero no establece la propiedad android:exported=false o sí establece la propiedad pero con valor android:exported=true, se considera que tiene visibilidad pública, esto permite ser ejecutado por otras aplicaciones. Adicionalmente, también se podría restringir el acceso complementando la propiedad anterior con el atributo permission.

SERVICES

Si en un servicio se declara un intent-filter y establece el atributo android:exported=true, lo convierte en un componente público accesible por otras aplicaciones:

RECEIVERS

Se declaran tres receivers de los cuales todos declaran un intent-filter pero no establecen el atributo android:exported=false, lo que los convierte en componentes públicos accesibles por otras aplicaciones:

CONTENT PROVIDERS

«Proveedores de contenido«, componentes que permiten compartir información con otras aplicaciones:

ANÁLISIS DE RECURSOS

Lo siguiente es revisar la carpeta de recursos de la aplicación con el objetivo de detectar imágenes u otros ficheros. Un fichero a revisar es el fichero strings.xml.

BÚSQUEDA DE CADENAS

Uso MobSF por la rapidez y facilidad en la que es posible la lectura del fichero AndroidManifest.xml y el decompilado a Java de la aplicacion:

Se descomprime el fichero .zip y se carga directamente en SublimeText:

ANÁLISIS DE CÓDIGO FUENTE

El proceso de entender que hace la aplicación a veces es muy tedioso y tambien puede ser complicado, es necesaria la paciencia, habiendo entendido un poco como funciona comprobaremos para que necesita cada uno de los permisos y cómo los usa.

Ejemplos:

  • Si usa el permiso de envío de recepción y envío de sms, android.permission.SEND_SMS, es aconsejable realizar búsquedas, como por ejemplo de «sendSms«:
  • Otro permiso, android.permission.INSTALL_PACKAGES que permite instalar aplicaciones, se realizara una búsqueda, por ejemplo por la cadena «Download».

Seguiriamos el flujo a fin de comprobar que estos mecanismos estan desarrollados de manera segura.

VERIFICACION DEL CERTIFICADO

Se verifican principalmente fechas de validez, robustez del algoritmo de cifrado y emisor del certificado.

MobSF

ANÁLISIS DINÁMICO

El siguiente paso es el análisis dinámico, el flujo sería el siguiente:

Flujo del analisis dinamico

Se realizan pruebas como:

  • Interacción con el sistema de archivos
  • Inspeccionar objetos en memoria
  • Llamadas a funciones y métodos
  • Reemplazar variables y métodos
  • Buffer overflow
  • Inyecciones del lado del cliente(XML, XSS, SQL)

Todo esto y mas se explica con mas detenimiento en otros posts de blog.

Deja un comentario