El documento «All About Android Pentesting: A Complete Methodology» fue desarrollador por Xcheater
Ver Parte I
Analizar el código fuente
Al descompilar un APK, se obtiene el código fuente y se puede analizar. Sin
embargo, hoy en día, la mayoría de las aplicaciones lo protegen mediante
ofuscación, lo que impide que un atacante comprenda la lógica.
Tal y como se explica en el
post anterior, En general se puede revisar algunos archivos para obtener ideas sobre la
lógica escrita, como la detección de root, SSL Pinning, la comprobación
del depurador, la comprobación del lado del cliente, etc. Analizar el código
fuente te dará ideas para comprender cómo realizar un buen análisis dinámico,
incluyendo ataques como vistas web o enlaces profundos, e inyecciones.
Se puede analizar el código directamente con
semgrep
o
MobSF. Esto te dará una idea rápida del estado de seguridad. A continuación, se
encuentra el repositorio semgrep-rules-android-security, que puede ser
útil.
Qué buscar manualmente en el código fuente:
-
Lógica de detección de root: verificar las comprobaciones
binarias `su` y las comprobaciones de integridad de
SafetyNet/Play. -
Implementación de SSL Pinning: busca `CertificatePinner`, `TrustManager`
y validación SSL personalizada. -
Comprobaciones del depurador: buscar
`isDebuggerConnected()` y comprobaciones de indicadores de
depuración. -
Validación del lado del cliente: buscar comprobaciones de
autenticación/autorización que se puedan omitir. -
Uso de WebView: Comprrobar `loadUrl()` y
`evaluateJavascript()` (son posible fuente de XSS). -
Gestión de intenciones: comprobar cómo se procesan las
intenciones (posible inyección de intenciones). -
Gestión de enlaces profundos: comprobar la validación de
URL en los controladores de enlaces profundos.
Firma APK – Vulnerabilidad Janus
La verificación de la firma APK es importante para la integridad de la
aplicación. Sin embargo, existe una vulnerabilidad llamada
Janus (CVE-2017–13156)
que permite a los atacantes modificar los archivos APK sin invalidar la firma.
Comprobación de integridad (anti-tampering): descompila el APK con
APKtool y modifica algunos archivos, como el manifest.xml y cambia
la cadena de «true» a «false». Recompila el APK con APKtool,
fírmalo con tu propia clave e instala y ejecuta la aplicación.
Si la aplicación detecta una manipulación, debería rechazar su ejecución o
mostrar un error. Si se ejecuta con normalidad, la aplicación no cuenta con la
detección de manipulaciones adecuada. Esto constituye una vulnerabilidad.
Comprobación de integridad: descompila el APK y modifica algunos
archivos, como el archivo manifest.xml o la cadena «true» (verdadero) a
«false». Recompila el APK con apktool, fírmalo con tu propia clave e instala y
ejecuta la aplicación.
Ahora hablemos de una de las medidas de seguridad más importantes: la
detección de root y SSL Pinning.
Generalmente, las aplicaciones modernas cuentan con todas estas medidas de
seguridad, por lo que para realizar la evaluación dinámica y otras
comprobaciones de seguridad, es necesario omitirlas. Echemos un vistazo rápido
a ellas; no profundizaremos en ellas, solo les daré una descripción general.
¡Detección de root!
Si la aplicación detecta que su dispositivo está rooteado, podría
negarse a ejecutarse, mostrar algún error o restringir ciertas funciones.
Las aplicaciones utilizan diversas técnicas para detectar el root.
Veamos las más comunes que encontrará durante la evaluación:
-
Uso de bibliotecas de detección de root: muchos desarrolladores
no escriben código personalizado para la detección de root.
Simplemente utilizan bibliotecas predefinidas que realizan todas las
comprobaciones de detección de root, como RootBeer, RootCloak y
RootInspector. -
Comprobación del binario «su»: la aplicación busca el binario
«su» en rutas comunes como /system/bin/su,
/system/xbin/su o /sbin/su. Si lo encuentra, sabe que el
dispositivo está rooteado. -
Buscando aplicaciones de administración de root: las
aplicaciones comprueban si Magisk, SuperSU u otras aplicaciones de
administración de root están instaladas en el dispositivo. Buscan
nombres de paquetes como com.topjohnwu.magisk o
eu.chainfire.supersu. -
Comprobación de las propiedades del sistema: las aplicaciones
leen propiedades como ro.debuggable, ro.secure o
ro.build.tags para detectar el root o las compilaciones de
prueba. -
Google SafetyNet / API de Integridad de Play: la solución
oficial de Google para la comprobación de la integridad de los dispositivos.
Está basada en la nube y comprueba si hay root, un gestor de arranque
desbloqueado y manipulación del sistema. Esto es más difícil de eludir que
las comprobaciones de root personalizadas. -
Comprobación de particiones del sistema con permisos de escritura: los dispositivos rooteados suelen tener /system montado
como lectura y escritura, lo cual las aplicaciones pueden detectar. -
Detección de Magisk o Zygisk: algunas aplicaciones buscan
específicamente archivos, procesos o puntos de montaje relacionados con
Magisk, como /sbin/.magisk/, /data/adb/magisk, etc.
¿Cómo eludir la detección de root?
Hay varias maneras de eludir la detección de root. Estos son los métodos más
comunes:
-
Magisk Hide / Zygisk DenyList: habilita DenyList en la configuración
de Magisk y añade la aplicación de destino. -
Scripts de Frida: usa la aplicación
Frida
para enlazar funciones de detección de root y hacer que devuelvan
falso. Puedes explorar más scripts personalizados de Frida en GitHub
o escribir los tuyos propios si entiendes la lógica de detección. -
Objection: Basado en Frida, proporciona una interfaz de línea de
comandos sencilla para desactivar las comprobaciones de root. -
Parchear el APK: descompilar, encontrar la lógica de detección
de root, parchearlo, recompilar y firmar. -
Módulos Magisk/LSposed: usar módulos como Hide My Applist,
Shamiko, LSPosed con RootCloak o Zygisk-Assistant para
ocultar el root de las aplicaciones. Estos funcionan a nivel de sistema.
Recuerda que la omisión es más fácil una vez que comprendes cómo la aplicación
detecta el root. Lee el código, identifica las comprobaciones y elige
el método de omisión según corresponda.
SSL Pinning
La fijación SSL (también conocida como fijación de certificados) es un
mecanismo de seguridad mediante el cual la aplicación valida el certificado
SSL del servidor con un certificado predefinido o una clave pública integrada
en la aplicación. Esto evita ataques de intermediario (MitM), incluso si
instalas un certificado de CA personalizado en el dispositivo.
Al implementar la fijación SSL, no puedes interceptar el tráfico de la
aplicación con Burp Suite ni con ningún otro proxy, ya que la aplicación
rechazará el certificado de tu proxy.
¿Implementación de la fijación SSL?
Los desarrolladores pueden implementar la fijación SSL de diversas maneras.
Veamos las más comunes que observarás durante la evaluación:
-
Configuración de seguridad de red (basada en XML): la
aplicación define certificados de confianza en un archivo XML, generalmente
en res/xml/network_security_config.xml. -
TrustManager personalizado: algunos desarrolladores crean su
propio TrustManager para validar certificados manualmente. -
Bibliotecas de terceros: Bibliotecas como OkHttp y
TrustKit ofrecen implementaciones de anclaje SSL listas para usar que
los desarrolladores pueden integrar fácilmente.
¿Cómo evitarlo?
Necesitamos evitar esta comprobación de anclaje SSL, ya que ya sabe que no se
puede interceptar la solicitud ni la respuesta. Sin embargo, para completar la
evaluación, también debe analizar estas áreas. Generalmente, se puede
solicitar al desarrollador que elimine estas comprobaciones de seguridad, como
la detección de root y el anclaje SSL, pero en un escenario de caja negra,
este acceso no es posible.
Veamos algunas soluciones comunes para eludir la fijación de SSL:
- Objection: desactiva la fijación de SSL con un solo comando.
-
Scripts de Frida: usa scripts universales para eludir la
fijación de SSL. Puedes encontrar scripts ya preparados en GitHub,
escribir los tuyos propios si entiendes la implementación o usar IA para
generarlos. -
HTTP Toolkit: una herramienta GUI que gestiona automáticamente la instalación de
certificados y la elusión de la fijación de SSL. -
Aplicación manual de parches: descompilar la aplicación,
encontrar la implementación de fijación (buscar CertificatePinner,
TrustManager, etc.), modificarla o eliminarla, volver a compilarla y
firmarla. Es un proceso lento, pero funciona siempre.
Conclusión
Bien, hemos cubierto mucho en este artículo, desde los fundamentos del
análisis estático. Esto debería darte una base sólida para comenzar tu
experiencia con las pruebas de penetración en Android. Pero sí, las pruebas de
penetración en Android son mucho más que eso. Aún hay muchas áreas que no
hemos profundizado aquí. Por ejemplo, WebView, enlaces profundos, problemas
relacionados con la memoria y problemas de criptografía, etc.
Abordaré estos temas en detalle en futuros artículos, ¡así que queda atento!
El documento
«All About Android Pentesting: A Complete Methodology»
fue desarrollador por
Xcheater

