Pentesting de Aplicaciones Android
Tip
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)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Conceptos básicos de aplicaciones Android
Se recomienda encarecidamente empezar leyendo esta página para conocer las partes más importantes relacionadas con la seguridad en Android y los componentes más peligrosos en una aplicación Android:
ADB (Android Debug Bridge)
Esta es la herramienta principal que necesitas para conectar con un dispositivo Android (emulado o físico).
ADB permite controlar dispositivos tanto por USB como por red desde un ordenador. Esta utilidad posibilita el copiado de archivos en ambas direcciones, la instalación y desinstalación de apps, la ejecución de comandos de shell, la copia de seguridad de datos, la lectura de logs, entre otras funciones.
Echa un vistazo a la siguiente lista de ADB Commands para aprender cómo usar adb.
Smali
A veces es interesante modificar el código de la aplicación para acceder a información oculta (por ejemplo contraseñas bien ofuscadas o flags). En ese caso, puede ser interesante descompilar el APK, modificar el código y recompilarlo.
En este tutorial puedes aprender cómo descompilar un APK, modificar código Smali y recompilar el APK con la nueva funcionalidad. Esto puede ser muy útil como alternativa para varias pruebas durante el análisis dinámico que se van a presentar. Por lo tanto, ten siempre en mente esta posibilidad.
Other interesting tricks
- Spoofing your location in Play Store
- Play Integrity attestation spoofing (SafetyNet replacement)
- Shizuku Privileged API (ADB-based non-root privileged access)
- Exploiting Insecure In-App Update Mechanisms
- Abusing Accessibility Services (Android RAT)
- Android IME / InputMethodService Abuse (Malicious Keyboards)
- NFC/EMV Relay via HCE (Android Tap-to-Pay abuse)
- Descargar APKs: https://apps.evozi.com/apk-downloader/, https://apkpure.com/es/, https://www.apkmirror.com/, https://apkcombo.com/es-es/apk-downloader/, https://github.com/kiber-io/apkd
- Extract APK from device:
adb shell pm list packages
com.android.insecurebankv2
adb shell pm path com.android.insecurebankv2
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
- Fusiona todos los splits y base apks con APKEditor:
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
java -jar ../APKEditor.jar m -i splits/ -o merged.apk
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
Android Enterprise & Work Profile Attacks
Android Enterprise Work Profile Bypass
Estudios de Caso & Vulnerabilidades
Air Keyboard Remote Input Injection
Android Rooting Frameworks Manager Auth Bypass Syscall Hook
Abusing Android Media Pipelines Image Parsers
Arm64 Static Linear Map Kaslr Bypass
Análisis Estático
First of all, for analysing an APK you should take a look to the to the Java code using a decompiler.
Please, read here to find information about different available decompilers.
Buscando información interesante
Just taking a look to the strings of the APK you can search for passwords, URLs (https://github.com/ndelphit/apkurlgrep), api keys, encryption, bluetooth uuids, tokens and anything interesting… look even for code execution backdoors or authentication backdoors (hardcoded admin credentials to the app).
Firebase
Pay special attention to firebase URLs and check if it is bad configured. More information about whats is FIrebase and how to exploit it here.
Comprensión básica de la aplicación - Manifest.xml, strings.xml
The examination of an application’s Manifest.xml and strings.xml files can reveal potential security vulnerabilities. These files can be accessed using decompilers or by renaming the APK file extension to .zip and then unzipping it.
Vulnerabilities identified from the Manifest.xml include:
- Debuggable Applications: Applications set as debuggable (
debuggable="true") in the Manifest.xml file pose a risk as they allow connections that can lead to exploitation. For further understanding on how to exploit debuggable applications, refer to a tutorial on finding and exploiting debuggable applications on a device. - Backup Settings: The
android:allowBackup="false"attribute should be explicitly set for applications dealing with sensitive information to prevent unauthorized data backups via adb, especially when usb debugging is enabled. - Network Security: Custom network security configurations (
android:networkSecurityConfig="@xml/network_security_config") in res/xml/ can specify security details like certificate pins and HTTP traffic settings. An example is allowing HTTP traffic for specific domains. - Exported Activities and Services: Identifying exported activities and services in the manifest can highlight components that might be misused. Further analysis during dynamic testing can reveal how to exploit these components.
- Content Providers and FileProviders: Exposed content providers could allow unauthorized access or modification of data. The configuration of FileProviders should also be scrutinized.
- Broadcast Receivers and URL Schemes: These components could be leveraged for exploitation, with particular attention to how URL schemes are managed for input vulnerabilities.
- SDK Versions: The
minSdkVersion,targetSDKVersion, andmaxSdkVersionattributes indicate the supported Android versions, highlighting the importance of not supporting outdated, vulnerable Android versions for security reasons.
From the strings.xml file, sensitive information such as API keys, custom schemas, and other developer notes can be discovered, underscoring the need for careful review of these resources.
Tapjacking
Tapjacking is an attack where a malicious application is launched and positions itself on top of a victim application. Once it visibly obscures the victim app, its user interface is designed in such a way as to trick the user to interact with it, while it is passing the interaction along to the victim app.
In effect, it is blinding the user from knowing they are actually performing actions on the victim app.
Find more information in:
Task Hijacking
An activity with the launchMode set to singleTask without any taskAffinity defined is vulnerable to task Hijacking. This means, that an application can be installed and if launched before the real application it could hijack the task of the real application (so the user will be interacting with the malicious application thinking he is using the real one).
More info in:
Insecure data storage
Internal Storage
In Android, files stored in internal storage are designed to be accessible exclusively by the app that created them. This security measure is enforced by the Android operating system and is generally adequate for the security needs of most applications. However, developers sometimes utilize modes such as MODE_WORLD_READABLE and MODE_WORLD_WRITABLE to allow files to be shared between different applications. Yet, these modes do not restrict access to these files by other applications, including potentially malicious ones.
- Static Analysis:
- Ensure that the use of
MODE_WORLD_READABLEandMODE_WORLD_WRITABLEis carefully scrutinized. These modes can potentially expose files to unintended or unauthorized access.
- Dynamic Analysis:
- Verify the permissions set on files created by the app. Specifically, check if any files are set to be readable or writable worldwide. This can pose a significant security risk, as it would allow any application installed on the device, regardless of its origin or intent, to read or modify these files.
External Storage
When dealing with files on external storage, such as SD Cards, certain precautions should be taken:
- Accessibility:
- Files on external storage are globally readable and writable. This means any application or user can access these files.
- Security Concerns:
- Given the ease of access, it’s advised not to store sensitive information on external storage.
- External storage can be removed or accessed by any application, making it less secure.
- Handling Data from External Storage:
- Always perform input validation on data retrieved from external storage. This is crucial because the data is from an untrusted source.
- Storing executables or class files on external storage for dynamic loading is strongly discouraged.
- If your application must retrieve executable files from external storage, ensure these files are signed and cryptographically verified before they are dynamically loaded. This step is vital for maintaining the security integrity of your application.
External storage can be accessed in /storage/emulated/0 , /sdcard , /mnt/sdcard
Tip
Starting with Android 4.4 (API 17), the SD card has a directory structure which limits access from an app to the directory which is specifically for that app. This prevents malicious application from gaining read or write access to another app’s files.
Sensitive data stored in clear-text
- Shared preferences: Android allow to each application to easily save xml files in the path
/data/data/<packagename>/shared_prefs/and sometimes it’s possible to find sensitive information in clear-text in that folder. - Databases: Android allow to each application to easily save sqlite databases in the path
/data/data/<packagename>/databases/and sometimes it’s possible to find sensitive information in clear-text in that folder.
Broken TLS
Accept All Certificates
For some reason sometimes developers accept all the certificates even if for example the hostname does not match with lines of code like the following one:
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
Broken Cryptography
Poor Key Management Processes
Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los cifran con una key hardcoded/predictable en el código. Esto no debería hacerse, ya que un reversing podría permitir a los atacantes extraer la información confidencial.
Use of Insecure and/or Deprecated Algorithms
Los desarrolladores no deberían usar deprecated algorithms para realizar checks de autorización, almacenar o enviar datos. Algunos de estos algoritmos son: RC4, MD4, MD5, SHA1… Si se usan hashes para almacenar passwords por ejemplo, deberían usarse hashes resistentes a brute-force con salt.
Other checks
- It’s recommended to obfuscate the APK para dificultar el trabajo de reverse engineer a los atacantes.
- If the app is sensitive (like bank apps), it should perform it’s own checks to see if the mobile is rooted and act in consequence.
- If the app is sensitive (like bank apps), it should check if an emulator is being used.
- If the app is sensitive (like bank apps), it should check it’s own integrity before executing it to check if it was modified.
- Use APKiD to check which compiler/packer/obfuscator was used to build the APK
React Native Application
Read the following page to learn how to easily access javascript code of React applications:
Xamarin Applications
Read the following page to learn how to easily access C# code of a xamarin applications:
Superpacked Applications
According to this blog post superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps… and a faster way which involves to execute the application and gather the decompressed files from the filesystem.
Automated Static Code Analysis
The tool mariana-trench is capable of finding vulnerabilities by scanning the code of the application. This tool contains a series of known sources (that indicates to the tool the places where the input is controlled by the user), sinks (which indicates to the tool dangerous places where malicious user input could cause damages) and rules. These rules indicates the combination of sources-sinks that indicates a vulnerability.
With this knowledge, mariana-trench will review the code and find possible vulnerabilities on it.
Secrets leaked
An application may contain secrets (API keys, passwords, hidden urls, subdomains…) inside of it that you might be able to discover. You could us a tool such as https://github.com/dwisiswant0/apkleaks
Bypass Biometric Authentication
Bypass Biometric Authentication (Android)
Other interesting functions
- Code execution:
Runtime.exec(), ProcessBuilder(), native code:system() - Send SMSs:
sendTextMessage, sendMultipartTestMessage - Native functions declared as
native:public native, System.loadLibrary, System.load - Read this to learn how to reverse native functions
- In-memory native code execution via JNI (downloaded shellcode → mmap/mprotect → call):
In Memory Jni Shellcode Execution
Other tricks
Dynamic Analysis
First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended.
Online Dynamic analysis
You can create a free account in: https://appetize.io/. This platform allows you to upload and execute APKs, so it is useful to see how an apk is behaving.
You can even see the logs of your application in the web and connect through adb.
.png)
Thanks to the ADB connection you can use Drozer and Frida inside the emulators.
Local Dynamic Analysis
Using an emulator
- Android Studio (You can create x86 and arm devices, and according to this latest x86 versions support ARM libraries without needing an slow arm emulator).
- Learn to set it up in this page:
- Genymotion (Free version: Personal Edition, you need to create an account. It’s recommend to download the version WITH VirtualBox to avoid potential errors.)
- Nox (Free, but it doesn’t support Frida or Drozer).
Tip
When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
To install google services (like AppStore) in Genymotion you need to click on the red marked button of the following image:
.png)
Also, notice that in the configuration of the Android VM in Genymotion you can select Bridge Network mode (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
Use a physical device
Necesitas activar las opciones de debugging y es recomendable que puedas rootear el dispositivo:
- Settings.
- (FromAndroid 8.0) Select System.
- Select About phone.
- Press Build number 7 times.
- Go back and you will find the Developer options.
Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.
I will suggest to perform this initial dynamic analysis using MobSF dynamic analysis + pidcat, so we will be able to learn how the application works while MobSF captures a lot of interesting data you can review later on.
Magisk/Zygisk quick notes (recommended on Pixel devices)
- Patch boot.img with the Magisk app and flash via fastboot to get systemless root
- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required
- Keep original boot.img to recover from OTA updates; re-patch after each OTA
- For screen mirroring, use scrcpy on the host
Unintended Data Leakage
Logging
Los desarrolladores deben ser cautelosos al exponer información de debugging públicamente, ya que puede conducir a leaks de datos sensibles. Las herramientas pidcat y adb logcat son recomendadas para monitorizar los logs de la aplicación e identificar y proteger información sensible. Pidcat es preferido por su facilidad de uso y legibilidad.
Warning
Note that from later newer than Android 4.0, applications are only able to access their own logs. So applications cannot access other apps logs.
Anyway, it’s still recommended to not log sensitive information.
Copy/Paste Buffer Caching
El framework basado en el clipboard de Android permite la funcionalidad de copiar/pegar en las apps, pero supone un riesgo ya que otras aplicaciones pueden acceder al portapapeles, exponiendo potencialmente datos sensibles. Es crucial deshabilitar las funciones de copy/paste en secciones sensibles de una aplicación, como los datos de tarjetas de crédito, para prevenir leaks.
Crash Logs
Si una aplicación crashea y guarda logs, esos logs pueden ayudar a los atacantes, especialmente cuando la aplicación no puede ser reverse-engineered. Para mitigar este riesgo, evita loguear en los crash, y si los logs deben transmitirse por la red, asegúrate de que se envíen vía un canal SSL para seguridad.
As pentester, try to take a look to these logs.
Analytics Data Sent To 3rd Parties
Las aplicaciones a menudo integran servicios como Google Adsense, lo que puede inadvertidamente provocar leaks de datos sensibles debido a una implementación incorrecta por parte de los desarrolladores. Para identificar posibles leaks, es recomendable interceptar el tráfico de la aplicación y comprobar si se está enviando información sensible a servicios de terceros.
SQLite DBs
La mayoría de las aplicaciones usarán internal SQLite databases para guardar información. Durante el pentest revisa las databases creadas, los nombres de tables y columns y todos los datos guardados porque podrías encontrar información sensible (lo cual sería una vulnerabilidad).
Las bases de datos deberían estar localizadas en /data/data/the.package.name/databases como /data/data/com.mwr.example.sieve/databases
Si la database guarda información confidencial y está encrypted pero puedes find la password dentro de la aplicación sigue siendo una vulnerability.
Enumera las tablas usando .tables y enumera las columnas de las tablas con .schema <table_name>
Drozer (Exploit Activities, Content Providers and Services)
From Drozer Docs: Drozer allows you to assume the role of an Android app and interact with other apps. It can do anything that an installed application can do, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .
Drozer is s useful tool to exploit exported activities, exported services and Content Providers as you will learn in the following sections.
Exploiting exported Activities
Read this if you want to refresh what is an Android Activity.
Also remember that the code of an activity starts in the onCreate method.
Authorisation bypass
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with sensitive information is exported you could bypass the authentication mechanisms to access it.
Learn how to exploit exported activities with Drozer.
You can also start an exported activity from adb:
- PackageName is com.example.demo
- Exported ActivityName is com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity
NOTA: MobSF detectará como malicioso el uso de singleTask/singleInstance como android:launchMode en una activity, pero debido a this, aparentemente esto solo es peligroso en versiones antiguas (API versions < 21).
Tip
Ten en cuenta que un authorisation bypass no siempre es una vulnerabilidad; dependerá de cómo funcione el bypass y qué información se exponga.
Sensitive information leakage
Activities can also return results. Si logras encontrar una activity exportada y sin protección que llame al método setResult y devuelva información sensible, there is a sensitive information leakage.
Tapjacking
Si Tapjacking no está prevenido, podrías abusar de la activity exportada para hacer que el usuario realice acciones inesperadas. Para más info sobre what is Tapjacking follow the link.
Exploiting Content Providers - Accessing and manipulating sensitive information
Read this if you want to refresh what is a Content Provider.
Los content providers se usan básicamente para compartir datos. Si una app tiene content providers disponibles, puede que puedas extraer datos sensibles de ellos. También es interesante probar posibles SQL injections y Path Traversals, ya que podrían ser vulnerables.
Learn how to exploit Content Providers with Drozer.
Exploiting Services
Read this if you want to refresh what is a Service.
Recuerda que las acciones de un Service comienzan en el método onStartCommand.
Un Service es básicamente algo que puede recibir datos, procesarlos y devolver (o no) una respuesta. Por tanto, si una aplicación exporta algunos Services deberías comprobar el código para entender qué está haciendo y probarlo dinámicamente para extraer información confidencial, realizando bypass de medidas de autenticación…
Learn how to exploit Services with Drozer.
Exploiting Broadcast Receivers
Read this if you want to refresh what is a Broadcast Receiver.
Recuerda que las acciones de un Broadcast Receiver comienzan en el método onReceive.
Un broadcast receiver estará a la espera de un tipo de mensaje. Dependiendo de cómo el receiver maneje el mensaje, podría ser vulnerable.
Learn how to exploit Broadcast Receivers with Drozer.
Exploiting Schemes / Deep links
Puedes buscar deep links manualmente, usando herramientas como MobSF o scripts como this one.
Puedes abrir un scheme declarado usando adb o un browser:
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
Tenga en cuenta que puede omitir el nombre del paquete y el dispositivo móvil llamará automáticamente a la aplicación que debería abrir ese enlace.
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
Code executed
Para encontrar el código que se ejecutará en la App, ve a la activity llamada por el deeplink y busca la función onNewIntent.
 (1) (1) (1).png)
Sensitive info
Cada vez que encuentres un deep link verifica que no esté recibiendo datos sensibles (como contraseñas) a través de parámetros URL, porque cualquier otra aplicación podría impersonate the deep link and steal that data!
Parameters in path
También debes comprobar si algún deep link está usando un parámetro dentro de la ruta de la URL como: https://api.example.com/v1/users/{username} , en ese caso puedes forzar un path traversal accediendo a algo como: example://app/users?username=../../unwanted-endpoint%3fparam=value .
Ten en cuenta que si encuentras los endpoints correctos dentro de la aplicación podrías causar un Open Redirect (si parte de la ruta se usa como nombre de dominio), account takeover (si puedes modificar detalles de usuarios sin token CSRF y el endpoint vulnerable usó el método correcto) y cualquier otra vulnerabilidad. More info about this here.
More examples
An interesting bug bounty report about links (/.well-known/assetlinks.json).
Transport Layer Inspection and Verification Failures
- Certificates are not always inspected properly por aplicaciones Android. Es común que estas aplicaciones ignoren advertencias y acepten certificados self-signed o, en algunos casos, vuelvan a usar conexiones HTTP.
- Negotiations during the SSL/TLS handshake are sometimes weak, empleando cipher suites inseguros. Esta vulnerabilidad hace la conexión susceptible a ataques man-in-the-middle (MITM), permitiendo a un atacante desencriptar los datos.
- Filtración de información privada es un riesgo cuando las aplicaciones se autentican usando canales seguros pero luego comunican sobre canales no seguros para otras transacciones. Este enfoque no protege datos sensibles, como cookies de sesión o detalles de usuario, frente a la intercepción por entidades maliciosas.
Certificate Verification
Nos centraremos en la verificación de certificados. La integridad del certificado del servidor debe verificarse para mejorar la seguridad. Esto es crucial porque configuraciones TLS inseguras y la transmisión de datos sensibles por canales no encriptados pueden suponer riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y mitigar vulnerabilidades, this resource proporciona una guía completa.
SSL Pinning
SSL Pinning es una medida de seguridad donde la aplicación verifica el certificado del servidor contra una copia conocida almacenada dentro de la propia aplicación. Este método es esencial para prevenir ataques MITM. Se recomienda encarecidamente implementar SSL Pinning en aplicaciones que manejen información sensible.
Traffic Inspection
Para inspeccionar tráfico HTTP, es necesario instalar el certificado del proxy (p. ej., Burp). Sin instalar este certificado, el tráfico encriptado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un CA custom, click here.
Las aplicaciones que targetean API Level 24 and above requieren modificaciones en el Network Security Config para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar tráfico encriptado. Para instrucciones sobre cómo modificar el Network Security Config, refer to this tutorial.
Si Flutter está siendo usado necesitas seguir las instrucciones en this page. Esto se debe a que, simplemente añadiendo el certificado al store no funcionará ya que Flutter tiene su propia lista de CAs válidas.
Static detection of SSL/TLS pinning
Antes de intentar bypasses en runtime, mapea rápidamente dónde se aplica el pinning en el APK. El descubrimiento estático te ayuda a planear hooks/patches y a centrarte en las rutas de código correctas.
Tool: SSLPinDetect
- Open-source static-analysis utility que decompila el APK a Smali (vía apktool) y escanea patrones regex curados de implementaciones de SSL/TLS pinning.
- Reporta la ruta exacta del archivo, número de línea y un snippet de código para cada coincidencia.
- Cubre frameworks comunes y rutas de código custom: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init con TrustManagers/KeyManagers custom, y pins en Network Security Config XML.
Instalación
- Prereqs: Python >= 3.8, Java on PATH, apktool
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
pip install -r requirements.txt
Uso
# Basic
python sslpindetect.py -f app.apk -a apktool.jar
# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
Ejemplo de reglas de patrones (JSON) Utilice o amplíe signatures para detectar estilos propietarios/personalizados de pinning. Puede cargar su propio JSON y scan at scale.
{
"OkHttp Certificate Pinning": [
"Lcom/squareup/okhttp/CertificatePinner;",
"Lokhttp3/CertificatePinner;",
"setCertificatePinner"
],
"TrustManager Override": [
"Ljavax/net/ssl/X509TrustManager;",
"checkServerTrusted"
]
}
Notas y consejos
- Escaneo rápido en apps grandes mediante multi-threading y E/S mapeada en memoria; regex precompiladas reducen la sobrecarga/falsos positivos.
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
- Objetivos típicos de detección para priorizar a continuación:
- OkHttp: uso de CertificatePinner, setCertificatePinner, referencias al paquete okhttp3/okhttp
- TrustManagers personalizados: javax.net.ssl.X509TrustManager, sobrescrituras de checkServerTrusted
- Contextos SSL personalizados: SSLContext.getInstance + SSLContext.init con managers personalizados
- Pins declarativos en res/xml network security config y referencias en el manifest
- Usa las ubicaciones emparejadas para planear Frida hooks, parches estáticos o revisiones de configuración antes de las pruebas dinámicas.
Bypass de SSL Pinning
Cuando SSL Pinning está implementado, eludirlo se vuelve necesario para inspeccionar el tráfico HTTPS. Hay varios métodos disponibles para este propósito:
- Automatically modify the apk to bypass SSLPinning with apk-mitm. The best pro of this option, is that you won’t need root to bypass the SSL Pinning, but you will need to delete the application and reinstall the new one, and this won’t always work.
- You could use Frida (discussed below) to bypass this protection. Here you have a guide to use Burp+Frida+Genymotion: https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
- You can also try to automatically bypass SSL Pinning using objection:
objection --gadget com.package.app explore --startup-command "android sslpinning disable" - You can also try to automatically bypass SSL Pinning using MobSF dynamic analysis (explained below)
- If you still think that there is some traffic that you aren’t capturing you can try to forward the traffic to burp using iptables. Read this blog: https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62
Búsqueda de vulnerabilidades web comunes
Es importante también buscar vulnerabilidades web comunes dentro de la aplicación. La información detallada sobre cómo identificar y mitigar estas vulnerabilidades está fuera del alcance de este resumen, pero se cubre extensamente en otros lugares.
Frida
Frida es un toolkit de instrumentación dinámica para desarrolladores, reverse-engineers, y security researchers.
Puedes acceder a la aplicación en ejecución y hookear métodos en tiempo de ejecución para cambiar el comportamiento, modificar valores, extraer valores, ejecutar código distinto…
Si quieres pentestear aplicaciones Android necesitas saber cómo usar Frida.
- Aprende a usar Frida: Frida tutorial
- Algunas “GUI” para acciones con Frida: https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
- Ojection es great to automate the use of Frida: https://github.com/sensepost/objection , https://github.com/dpnishant/appmon
- Puedes encontrar algunos Awesome Frida scripts aquí: https://codeshare.frida.re/
- Intenta evadir mecanismos anti-debugging / anti-frida cargando Frida como se indica en https://erfur.github.io/blog/dev/code-injection-without-ptrace (tool linjector)
Anti-instrumentation & SSL pinning bypass workflow
Android Anti Instrumentation And Ssl Pinning Bypass
Volcar memoria - Fridump
Revisa si la aplicación está almacenando información sensible en la memoria que no debería guardar, como contraseñas o mnemónicos.
Usando Fridump3 puedes volcar la memoria de la app con:
# With PID
python3 fridump3.py -u <PID>
# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"
Esto hará un dump de la memoria en la carpeta ./dump, y allí podrías usar grep con algo como:
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
Datos sensibles en Keystore
En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con privilegios suficientes todavía es posible acceder a él. Como las aplicaciones tienden a almacenar aquí datos sensibles en texto sin cifrar, los pentests deberían comprobarlo: un usuario root o alguien con acceso físico al dispositivo podría robar estos datos.
Incluso si una app almacenó datos en el Keystore, los datos deben estar cifrados.
Para acceder a los datos dentro del Keystore puedes usar este script de Frida: https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
Fingerprint/Biometrics Bypass
Usando el siguiente script de Frida, podría ser posible bypass fingerprint authentication que las aplicaciones Android podrían estar realizando para proteger ciertas áreas sensibles:
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
Imágenes de fondo
Cuando pones una aplicación en segundo plano, Android almacena una instantánea de la aplicación para que, cuando se recupere al primer plano, empiece cargando esa imagen antes que la aplicación y parezca que la aplicación se cargó más rápido.
Sin embargo, si esta instantánea contiene información sensible, alguien con acceso a la instantánea podría robar esa información (ten en cuenta que necesitas root para acceder a ella).
Las instantáneas suelen almacenarse en: /data/system_ce/0/snapshots
Android proporciona una forma de impedir la captura de pantalla estableciendo el parámetro de layout FLAG_SECURE. Al usar este flag, el contenido de la ventana se trata como seguro, impidiendo que aparezca en capturas de pantalla o que se muestre en pantallas no seguras.
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Android Application Analyzer
Esta herramienta puede ayudarte a gestionar diferentes herramientas durante el análisis dinámico: https://github.com/NotSoSecure/android_application_analyzer
Intent Injection
Los desarrolladores a menudo crean componentes proxy como activities, services y broadcast receivers que manejan estos Intents y los pasan a métodos como startActivity(...) o sendBroadcast(...), lo cual puede ser arriesgado.
El peligro radica en permitir que atacantes activen componentes de la app no exportados o accedan a content providers sensibles redirigiendo estos Intents. Un ejemplo notable es el componente WebView que convierte URLs en objetos Intent mediante Intent.parseUri(...) y luego las ejecuta, lo que puede conducir a Intent injections maliciosos.
Essential Takeaways
- Intent Injection es similar al problema de Open Redirect en la web.
- Los exploits implican pasar objetos
Intentcomo extras, que pueden ser redirigidos para ejecutar operaciones inseguras. - Puede exponer componentes no exportados y content providers a atacantes.
- La conversión de URLs a
IntentdeWebViewpuede facilitar acciones no deseadas.
Android Client Side Injections and others
Probablemente conozcas este tipo de vulnerabilidades por la Web. Debes tener especial cuidado con estas vulnerabilidades en una aplicación Android:
- SQL Injection: Al trabajar con queries dinámicas o Content-Providers, asegúrate de usar consultas parametrizadas.
- JavaScript Injection (XSS): Verifica que el soporte para JavaScript y Plugins esté deshabilitado para cualquier WebViews (deshabilitado por defecto). More info here.
- Local File Inclusion: Las WebViews deben tener el acceso al sistema de archivos deshabilitado (habilitado por defecto) -
(webview.getSettings().setAllowFileAccess(false);). More info here. - Eternal cookies: En varios casos, cuando la aplicación Android termina la sesión la cookie no se revoca o incluso puede guardarse en disco
- Secure Flag in cookies
Automatic Analysis
MobSF
Static analysis
.png)
Evaluación de vulnerabilidades de la aplicación usando una interfaz web agradable. También puedes realizar dynamic analysis (pero necesitas preparar el entorno).
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
Notice that MobSF can analyse Android(apk), IOS(ipa) and Windows(apx) applications (Windows applications must be analyzed from a MobSF installed in a Windows host).
Also, if you create a ZIP file with the source code if an Android or an IOS app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also.
MobSF also allows you to diff/Compare analysis and to integrate VirusTotal (you will need to set your API key in MobSF/settings.py and enable it: VT_ENABLED = TRUE VT_API_KEY = <Your API key> VT_UPLOAD = TRUE). You can also set VT_UPLOAD to False, then the hash will be upload instead of the file.
Análisis dinámico asistido con MobSF
MobSF también puede ser muy útil para el análisis dinámico en Android, pero en ese caso necesitarás instalar MobSF y genymotion en tu host (una VM o Docker no funcionarán). Nota: Necesitas start first a VM in genymotion and then MobSF.
El MobSF dynamic analyser puede:
- Dump application data (URLs, logs, clipboard, screenshots made by you, screenshots made by “Exported Activity Tester”, emails, SQLite databases, XML files, and other created files). Todo esto se realiza automáticamente excepto las capturas de pantalla: debes pulsar cuando quieras una captura o debes pulsar “Exported Activity Tester” para obtener capturas de todas las actividades exportadas.
- Capturar tráfico HTTPS
- Usar Frida para obtener información en tiempo de ejecución
From android versions > 5, it will automatically start Frida and will set global proxy settings to capture traffic. It will only capture traffic from the tested application.
Frida
By default, it will also use some Frida Scripts to bypass SSL pinning, root detection and debugger detection and to monitor interesting APIs.
MobSF can also invoke exported activities, grab screenshots of them and save them for the report.
To start the dynamic testing press the green bottom: “Start Instrumentation”. Press the “Frida Live Logs” to see the logs generated by the Frida scripts and “Live API Monitor” to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing “Start Instrumentation”).
MobSF also allows you to load your own Frida scripts (to send the results of your Friday scripts to MobSF use the function send()). It also has several pre-written scripts you can load (you can add more in MobSF/DynamicAnalyzer/tools/frida_scripts/others/), just select them, press “Load” and press “Start Instrumentation” (you will be able to see the logs of that scripts inside “Frida Live Logs”).
.png)
Moreover, you have some Auxiliary Frida functionalities:
- Enumerate Loaded Classes: Imprimirá todas las clases cargadas
- Capture Strings: Imprimirá todas las strings capturadas mientras se usa la aplicación (muy ruidoso)
- Capture String Comparisons: Puede ser muy útil. Mostrará las 2 strings being compared y si el resultado fue True or False.
- Enumerate Class Methods: Introduce el nombre de la clase (like “java.io.File”) y mostrará todos los métodos de la clase.
- Search Class Pattern: Buscar clases por patrón
- Trace Class Methods: Trace a whole class (ver entradas y salidas de todos los métodos de la clase). Recuerda que por defecto MobSF traza varios métodos interesantes de la Android Api.
Once you have selected the auxiliary module you want to use you need to press “Start Intrumentation” and you will see all the outputs in “Frida Live Logs”.
Shell
Mobsf also brings you a shell with some adb commands, MobSF commands, and common shell commands at the bottom of the dynamic analysis page. Some interesting commands:
help
shell ls
activities
exported_activities
services
receivers
Herramientas HTTP
Cuando se captura tráfico HTTP puedes ver una vista poco clara del tráfico capturado en el botón “HTTP(S) Traffic” o una vista más agradable en el botón verde “Start HTTPTools”. Desde la segunda opción, puedes send las captured requests a proxies como Burp u Owasp ZAP.
Para ello, power on Burp –> turn off Intercept –> en MobSB HTTPTools selecciona la request –> pulsa “Send to Fuzzer” –> select the proxy address (http://127.0.0.1:8080\).
Una vez termines el dynamic analysis con MobSF puedes pulsar “Start Web API Fuzzer” para fuzz http requests y buscar vulnerabilidades.
Tip
Después de realizar un dynamic analysis con MobSF la configuración del proxy puede quedar mal y no podrás corregirla desde la GUI. Puedes arreglar la configuración del proxy haciendo:
adb shell settings put global http_proxy :0
Assisted Dynamic Analysis with Inspeckage
Puedes conseguir la herramienta en Inspeckage.
Esta herramienta utilizará algunos Hooks para informarte qué está pasando en la aplicación mientras realizas un dynamic analysis.
Yaazhini
Esta es una excelente herramienta para realizar static analysis con una GUI
.png)
Qark
Esta herramienta está diseñada para buscar varias security related Android application vulnerabilities, ya sea en source code o en packaged APKs. La herramienta también es capable of creating a “Proof-of-Concept” deployable APK y ADB commands, para explotar algunas de las vulnerabilidades encontradas (Exposed activities, intents, tapjacking…). Como con Drozer, no es necesario rootear el dispositivo de prueba.
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
qark --java path/to/parent/java/folder
qark --java path/to/specific/java/file.java
ReverseAPK
- Muestra todos los archivos extraídos para referencia rápida
- Descompila automáticamente archivos APK a los formatos Java y Smali
- Analiza AndroidManifest.xml en busca de vulnerabilidades y comportamientos comunes
- Análisis estático del código fuente para detectar vulnerabilidades y comportamientos comunes
- Información del dispositivo
- y más
reverse-apk relative/path/to/APP.apk
SUPER Android Analyzer
SUPER es una aplicación de línea de comandos que puede usarse en Windows, MacOS X y Linux, que analiza archivos .apk en busca de vulnerabilidades. Lo hace descomprimiendo APKs y aplicando una serie de reglas para detectar esas vulnerabilidades.
Todas las reglas están centralizadas en un archivo rules.json, y cada empresa o tester puede crear sus propias reglas para analizar lo que necesiten.
Descarga los binarios más recientes en la download page
super-analyzer {apk_file}
StaCoAn
.png)
StaCoAn es una herramienta multiplataforma que ayuda a desarrolladores, bugbounty hunters y ethical hackers a realizar static code analysis en aplicaciones móviles.
El concepto es que arrastras y sueltas tu archivo de aplicación móvil (un .apk o .ipa) en la aplicación StaCoAn y esta generará un informe visual y portable para ti. Puedes ajustar la configuración y las wordlists para obtener una experiencia personalizada.
Descargar latest release:
./stacoan
AndroBugs
AndroBugs Framework es un sistema de análisis de vulnerabilidades de Android que ayuda a desarrolladores o hackers a encontrar posibles vulnerabilidades de seguridad en aplicaciones Android.
Windows releases
python androbugs.py -f [APK file]
androbugs.exe -f [APK file]
Androwarn
Androwarn es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre posibles comportamientos maliciosos desarrollados por una aplicación Android.
La detección se realiza mediante el static analysis del bytecode Dalvik de la aplicación, representado como Smali, con la librería androguard.
Esta herramienta busca comportamientos comunes de aplicaciones “malas” como: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution…
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
MARA Framework
.png)
MARA es un Marco de Análisis y Reingeniería Aplicaciones Móviles. Es una herramienta que reúne las herramientas de análisis y reverse engineering de aplicaciones móviles más usadas, para ayudar en las pruebas de aplicaciones móviles frente a las amenazas de seguridad móvil de OWASP. Su objetivo es facilitar esta tarea y hacerla más accesible para desarrolladores de aplicaciones móviles y profesionales de seguridad.
Es capaz de:
- Extraer código Java y Smali usando diferentes herramientas
- Analiza APKs usando: smalisca, ClassyShark, androbugs, androwarn, APKiD
- Extraer información privada del APK usando regexps.
- Analizar el Manifest.
- Analizar los dominios encontrados usando: pyssltest, testssl y whatweb
- Desofuscar APK vía apk-deguard.com
Koodous
Útil para detectar malware: https://koodous.com/
Ofuscación/Desofuscación de código
Ten en cuenta que, dependiendo del servicio y la configuración que uses para ofuscar el código, los secretos pueden o no terminar ofuscados.
ProGuard
Desde Wikipedia: ProGuard es una herramienta open source de línea de comandos que reduce, optimiza y ofusca código Java. Es capaz de optimizar bytecode así como detectar y eliminar instrucciones no usadas. ProGuard es software libre y se distribuye bajo la GNU General Public License, versión 2.
ProGuard se distribuye como parte del Android SDK y se ejecuta cuando se construye la aplicación en modo release.
DexGuard
Encuentra una guía paso a paso para desofuscar el apk en https://blog.lexfo.fr/dexguard.html
(Desde esa guía) La última vez que lo comprobamos, el modo de operación de Dexguard era:
- cargar un recurso como un InputStream;
- pasar el resultado a una clase que hereda de FilterInputStream para descifrarlo;
- hacer alguna ofuscación inútil para hacer perder unos minutos a un reverser;
- pasar el resultado descifrado a un ZipInputStream para obtener un archivo DEX;
- finalmente cargar el DEX resultante como un Resource usando el método
loadDex.
DeGuard
DeGuard invierte el proceso de ofuscación realizado por las herramientas de ofuscación de Android. Esto permite numerosos análisis de seguridad, incluyendo la inspección de código y la identificación de bibliotecas.
Puedes subir un APK ofuscado a su plataforma.
[Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
Esta es una herramienta LLM para encontrar posibles vulnerabilidades de seguridad en apps Android y desofuscar el código de aplicaciones Android. Usa la API pública Gemini de Google.
Simplify
Es un deofuscador genérico para Android. Simplify ejecuta virtualmente una app para entender su comportamiento y luego intenta optimizar el código para que se comporte de forma idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa el tipo específico de ofuscación utilizado.
APKiD
APKiD te da información sobre cómo se hizo un APK. Identifica muchos compiladores, packers, obfuscators y otras cosas raras. Es el PEiD para Android.
Manual
Lee este tutorial para aprender algunos trucos sobre cómo revertir ofuscaciones personalizadas
Labs
Androl4b
AndroL4b es una máquina virtual de seguridad Android basada en ubuntu-mate que incluye la colección de los últimos frameworks, tutoriales y labs de diferentes expertos e investigadores en seguridad para reverse engineering y análisis de malware.
Referencias
- Play Integrity API: How It Works & How to Bypass It
- https://owasp.org/www-project-mobile-app-security/
- https://appsecwiki.com/#/ Es una gran lista de recursos
- https://maddiestone.github.io/AndroidAppRE/ Curso rápido de Android
- https://manifestsecurity.com/android-application-security/
- https://github.com/Ralireza/Android-Security-Teryaagh
- https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec
- SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis
- SSLPinDetect GitHub
- smali-sslpin-patterns
- Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa
- CoRPhone — Android in-memory JNI execution and packaging pipeline
Tip
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)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


