En el artículo anterior se explicó cómo modificar la aplicación para evadir la detección de rooteo del dispositivo. En este vamos a ver cómo reempaquetar, firmar, instalar y probar.

Una vez tenemos ya la aplicación parcheada, el siguiente paso consiste en reempaquetar la aplicación con el siguiente comando:

				
					apktool b 
				
			

En esa ocasión utilizamos apktool con la opción “b”, para indicar que hay que construir (build) la aplicación. Este comando creará un archivo .apk en la ruta: 

<DIRECTORIO_APP>/dist/<DIRECTORIO_APK>.apk.

Ahora, para firmar la aplicación, primero necesitamos un almacén de claves (keystore) para poder firmar. Para crear este keystore usamos el siguiente comando:

				
					keytool -genkey -alias test -keyalg RSA -keystore test.keystore -storepass test123 -keysize 2048 -validity 10000 -dname "CN=TEST, OU=TEST, O=TEST, L=TEST, S=TEST, C=TEST"
				
			

 

 

Este comando crea un keystore de pruebas con la contraseña “test123” y un alias llamado “test” que usaremos para firmar.
Después firmamos la aplicación con el siguiente comando:

				
					jarsigner -sigalg MD5withRSA -digestalg SHA1 -storepass test123 -keystore test.keystore base/dist/base.apk test
				
			

Es importante destacar que, aunque se use MD5 con RSA y SHA1 (lo cual también indica jarsigner), no es relevante puesto que esta aplicación no se va a distribuir, solamente está firmada con una clave de pruebas para hacer pruebas.

En este punto tenemos una aplicación parcheada y firmada, queda pendiente instalar y probar. Antes de instalar debemos desinstalar la aplicación legítima puesto que, al no estar firmadas por la misma clave, va a dar error.

Por tanto, desinstalamos la aplicación legítima con el siguiente comando:

				
					adb uninstall 
				
			

Ahora se instala la aplicación parcheada con el siguiente comando:

				
					adb install 
				
			

Debería haber aparecido una nueva aplicación instalada en el dispositivo, la ejecutamos y vemos si el comportamiento nuevo es el esperado:

Comprobamos que, efectivamente, hemos evadido la detección de rooteo del dispositivo. En el caso de esta aplicación sólo cambia un mensaje, pero en una aplicación real puede suponer que, si el dispositivo está rooteado la aplicación se cierre. Esta técnica permite eliminar este tipo de impedimentos para poder realizar un análisis de una mejor forma.

Las auditorías a aplicaciones es uno de los servicios que ofrecemos en Sidertia Solutions. Este tipo de análisis permite detectar vulnerabilidades.

La primera operación que realizamos es la extracción del fichero APK (Android Application Package) para su análisis. Esto en caso de que el cliente no nos proporcione una versión concreta.

Esta operación se puede hacer desde un dispositivo no rooteado sin ningún problema, pero en este ejemplo se va a realizar desde un emulador de Genymotion que sí está rooteado (Android 7, API 24).

En este caso vamos a extraer una aplicación de linterna llamada “Flashlight”, para ello el primer paso es conectar con el dispositivo o emulador utilizando ADB (Android Debug Bridge). Es esencial que, si el dispositivo no está conectado con cable al PC, esté conectado a la misma red que el PC. Ejecutamos el siguiente comando para conectar con el emulador en el puerto por defecto 5555:

				
					adb connect <IP_DISPOSITIVO>:5555
				
			
adb connect

Una vez conectados, vamos a listar todos los paquetes (aplicaciones) que están instalados en el dispositivo con el siguiente comando:

				
					(Linux) adb shell pm list packages | grep -i <NOMBRE_APP>
(Windows) adb Shell pm list packages | findstr -i <NOMBRE_APP>
				
			
adb shell pm list packages

El comando anterior utiliza adb para invocar una Shell del dispositivo y pm para invocar al Package Manager del dispositivo. 

Luego ejecuta el comando list packages de Package Manager para obtener la lista completa de paquetes. Posteriormente se filtra la lista para obtener el que estamos buscando.

Una vez localizado el nombre del paquete que estamos buscando, ejecutamos el siguiente comando para obtener la ruta de dicho paquete:

				
					adb shell pm path <PAQUETE_APP>
				
			
adb shell pm path

Este comando es similar al anterior, pero ahora se usa el comando path y el nombre del paquete.

Por último, extraemos el fichero utilizando la ruta obtenida en el comando anterior de la siguiente forma:

				
					adb pull <RUTA_PAQUETE_APP>
				
			
adb shell pm list packages

Este comando ha creado un fichero llamado base.apk en el directorio actual, este es el fichero APK de la aplicación.

Antes de comenzar con el análisis, se recomienda obtener el hash de la aplicación:

Esto permitirá identificar correctamente el APK que ha sido objeto de auditoría.