Android Applications Pentesting
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
¡Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de bugs!
Perspectivas de Hacking Involúcrate con contenido que profundiza en la emoción y los desafíos del hacking
Noticias de Hacking en Tiempo Real Mantente al día con el mundo del hacking de ritmo rápido a través de noticias e información en tiempo real
Últimos Anuncios Mantente informado sobre las nuevas recompensas por bugs que se lanzan y actualizaciones cruciales de la plataforma
Únete a nosotros en Discord y comienza a colaborar con los mejores hackers hoy mismo!
Se recomienda encarecidamente comenzar a leer esta página para conocer las partes más importantes relacionadas con la seguridad de Android y los componentes más peligrosos en una aplicación Android:
Android Applications BasicsEsta es la herramienta principal que necesitas para conectarte a un dispositivo Android (emulado o físico). ADB permite controlar dispositivos ya sea por USB o Red desde una computadora. Esta utilidad permite la copia de archivos en ambas direcciones, instalación y desinstalación de aplicaciones, ejecución de comandos de shell, respaldo de datos, lectura de registros, entre otras funciones.
Echa un vistazo a la siguiente lista de Comandos ADB para aprender a usar adb.
A veces es interesante modificar el código de la aplicación para acceder a información oculta (quizás contraseñas o flags bien ofuscadas). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo. En este tutorial puedes aprender a descompilar un APK, modificar el código Smali y recompilar el APK con la nueva funcionalidad. Esto podría ser muy útil como una alternativa para varias pruebas durante el análisis dinámico que se van a presentar. Entonces, siempre ten en mente esta posibilidad.
Extraer APK del dispositivo:
Fusiona todos los splits y apks base con APKEditor:
Primero que nada, para analizar un APK deberías echar un vistazo al código Java usando un descompilador. Por favor, lee aquí para encontrar información sobre diferentes descompiladores disponibles.
Solo echando un vistazo a las cadenas del APK puedes buscar contraseñas, URLs (https://github.com/ndelphit/apkurlgrep), claves de api, cifrado, bluetooth uuids, tokens y cualquier cosa interesante... busca incluso backdoors de ejecución de código o backdoors de autenticación (credenciales de administrador codificadas en la aplicación).
Firebase
Presta especial atención a las URLs de firebase y verifica si está mal configurado. Más información sobre qué es Firebase y cómo explotarlo aquí.
La examinación de los archivos _Manifest.xml** y **strings.xml_** de una aplicación puede revelar posibles vulnerabilidades de seguridad**. Estos archivos se pueden acceder usando descompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo.
Vulnerabilidades identificadas en el Manifest.xml incluyen:
Aplicaciones Depurables: Las aplicaciones configuradas como depurables (debuggable="true"
) en el archivo Manifest.xml representan un riesgo ya que permiten conexiones que pueden llevar a la explotación. Para una mejor comprensión sobre cómo explotar aplicaciones depurables, consulta un tutorial sobre cómo encontrar y explotar aplicaciones depurables en un dispositivo.
Configuraciones de Respaldo: El atributo android:allowBackup="false"
debe ser establecido explícitamente para aplicaciones que manejan información sensible para prevenir respaldos de datos no autorizados a través de adb, especialmente cuando la depuración por usb está habilitada.
Seguridad de Red: Configuraciones de seguridad de red personalizadas (android:networkSecurityConfig="@xml/network_security_config"
) en res/xml/ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos.
Actividades y Servicios Exportados: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes.
Proveedores de Contenido y FileProviders: Proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada.
Receptores de Difusión y Esquemas de URL: Estos componentes podrían ser aprovechados para explotación, prestando especial atención a cómo se gestionan los esquemas de URL para vulnerabilidades de entrada.
Versiones de SDK: Los atributos minSdkVersion
, targetSDKVersion
y maxSdkVersion
indican las versiones de Android soportadas, destacando la importancia de no soportar versiones de Android obsoletas y vulnerables por razones de seguridad.
Del archivo strings.xml, se puede descubrir información sensible como claves de API, esquemas personalizados y otras notas de desarrollador, subrayando la necesidad de una revisión cuidadosa de estos recursos.
Tapjacking es un ataque donde una aplicación maliciosa se lanza y se posiciona encima de una aplicación víctima. Una vez que oculta visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para interactuar con ella, mientras pasa la interacción a la aplicación víctima. En efecto, está cegando al usuario para que no sepa que realmente está realizando acciones en la aplicación víctima.
Encuentra más información en:
TapjackingUna actividad con el launchMode
configurado como singleTask
sin ningún taskAffinity
definido es vulnerable al secuestro de tareas. Esto significa que una aplicación puede ser instalada y si se lanza antes de la aplicación real, podría secuestrar la tarea de la aplicación real (por lo que el usuario estará interactuando con la aplicación maliciosa pensando que está usando la real).
Más información en:
Android Task HijackingAlmacenamiento Interno
En Android, los archivos almacenados en el almacenamiento interno están diseñados para ser accesibles exclusivamente por la aplicación que los creó. Esta medida de seguridad es aplicada por el sistema operativo Android y generalmente es adecuada para las necesidades de seguridad de la mayoría de las aplicaciones. Sin embargo, los desarrolladores a veces utilizan modos como MODE_WORLD_READABLE
y MODE_WORLD_WRITABLE
para permitir que los archivos sean compartidos entre diferentes aplicaciones. Sin embargo, estos modos no restringen el acceso a estos archivos por otras aplicaciones, incluidas las potencialmente maliciosas.
Análisis Estático:
Asegúrate de que el uso de MODE_WORLD_READABLE
y MODE_WORLD_WRITABLE
sea examinado cuidadosamente. Estos modos pueden potencialmente exponer archivos a acceso no intencionado o no autorizado.
Análisis Dinámico:
Verifica los permisos establecidos en los archivos creados por la aplicación. Específicamente, verifica si algún archivo está configurado para ser legible o escribible a nivel mundial. Esto puede representar un riesgo de seguridad significativo, ya que permitiría que cualquier aplicación instalada en el dispositivo, independientemente de su origen o intención, lea o modifique estos archivos.
Almacenamiento Externo
Al tratar con archivos en almacenamiento externo, como tarjetas SD, se deben tomar ciertas precauciones:
Accesibilidad:
Los archivos en almacenamiento externo son globalmente legibles y escribibles. Esto significa que cualquier aplicación o usuario puede acceder a estos archivos.
Preocupaciones de Seguridad:
Dada la facilidad de acceso, se aconseja no almacenar información sensible en almacenamiento externo.
El almacenamiento externo puede ser removido o accedido por cualquier aplicación, haciéndolo menos seguro.
Manejo de Datos desde Almacenamiento Externo:
Siempre realiza validación de entrada en los datos recuperados del almacenamiento externo. Esto es crucial porque los datos provienen de una fuente no confiable.
Almacenar ejecutables o archivos de clase en almacenamiento externo para carga dinámica está fuertemente desaconsejado.
Si tu aplicación debe recuperar archivos ejecutables del almacenamiento externo, asegúrate de que estos archivos estén firmados y verificados criptográficamente antes de ser cargados dinámicamente. Este paso es vital para mantener la integridad de seguridad de tu aplicación.
El almacenamiento externo puede ser accedido en /storage/emulated/0
, /sdcard
, /mnt/sdcard
A partir de Android 4.4 (API 17), la tarjeta SD tiene una estructura de directorio que limita el acceso de una aplicación al directorio que es específicamente para esa aplicación. Esto previene que aplicaciones maliciosas obtengan acceso de lectura o escritura a los archivos de otra aplicación.
Datos sensibles almacenados en texto claro
Preferencias compartidas: Android permite a cada aplicación guardar fácilmente archivos xml en la ruta /data/data/<packagename>/shared_prefs/
y a veces es posible encontrar información sensible en texto claro en esa carpeta.
Bases de datos: Android permite a cada aplicación guardar fácilmente bases de datos sqlite en la ruta /data/data/<packagename>/databases/
y a veces es posible encontrar información sensible en texto claro en esa carpeta.
Aceptar Todos los Certificados
Por alguna razón, a veces los desarrolladores aceptan todos los certificados incluso si, por ejemplo, el nombre de host no coincide con líneas de código como la siguiente:
Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar Burp CA dentro del dispositivo. También puedes generar con Burp un certificado para un nombre de host diferente y usarlo.
Procesos de Gestión de Claves Pobres
Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que alguna ingeniería inversa podría permitir a los atacantes extraer la información confidencial.
Uso de Algoritmos Inseguros y/o Obsoletos
Los desarrolladores no deberían usar algoritmos obsoletos para realizar verificaciones de autorización, almacenar o enviar datos. Algunos de estos algoritmos son: RC4, MD4, MD5, SHA1... Si se utilizan hashes para almacenar contraseñas, por ejemplo, se deberían usar hashes resistentes a fuerza bruta con sal.
Se recomienda ofuscar el APK para dificultar el trabajo de ingeniería inversa a los atacantes.
Si la aplicación es sensible (como las aplicaciones bancarias), debería realizar sus propias verificaciones para ver si el móvil está rooteado y actuar en consecuencia.
Si la aplicación es sensible (como las aplicaciones bancarias), debería verificar si se está utilizando un emulador.
Si la aplicación es sensible (como las aplicaciones bancarias), debería verificar su propia integridad antes de ejecutarse para comprobar si ha sido modificada.
Usa APKiD para verificar qué compilador/empaquetador/ofuscador se utilizó para construir el APK.
Lee la siguiente página para aprender cómo acceder fácilmente al código javascript de aplicaciones React:
React Native ApplicationLee la siguiente página para aprender cómo acceder fácilmente al código C# de aplicaciones xamarin:
Xamarin AppsSegún este blog, superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.