Salta el contingut

Modificació d'aplicacions Android

En aquesta pràctica guiada veurem els passos a seguir per localitzar punts de vulnerabilitat d'aplicacions instal·lades a un dispositiu Android.

A diferència de la pràctica d'anàlisi de fitxers APK amb apktool, en aquest cas no modificarem el contingut de l'APK de l'aplicació sinó els fitxers que utilitza un cop ja ha sigut instal·lada.

Emulador Genymotion

Utilitzarem l'emulador d'Android Genymotion.
El podem descarregar per Windows, Linux i MacOS des de la seva pàgina web.
Durant el procés d'instal·lació haurem de crear una llicència gratuïta d'usuari.

Un cop instal·lat, crearem un dispositiu Android virtual amb l'assistent de l'aplicació i l'iniciarem:

Genymotion

Aplicació vulnerable

Instal·larem la nostra aplicació vulnerable, CyberApp 4.0

Es tracta d'una aplicació creada amb APP Inventor que simula un programa comercial amb característiques Premium inicialment no disponibles, però que es poden activar introduint un codi de desbloqueig.

Caldrà descarregar l'instal·lador de l'aplicació CyberApp 4.0 i arrossegar-lo sobre la finestra de Genymotion per directament instal·lar i executar l'APK:

Genymotion

Connexió al dispositiu amb ADB

Ens podem connectar al nostre dispositiu virtual de Genymotion mitjançant una de les eines de desenvolupament i depuració de la plataforma: ADB

ADB (Android Debug Bridge) és una eina de línia de comandes que ens permet comunicar-nos amb un dispositiu Android. Ens permet realitzar accions com ara instal·lar i depurar apps, i també ens proporciona accés a un shell que podem utilitzar per executar comandes.

ADB s'inclou dins del paquet d'eines de la plataforma de l'SDK d'Android i es pot descarregar per Windows, Linux i MacOS.

Un cop instal·lat el binari d'ADB comprovarem si és capaç de detectar el nostre Android virtualitzat amb Genymotion.

La comanda adb devices ens llistarà tots els dispositius connectats que es puguin detectar:

$ adb devices
List of devices attached
127.0.0.1:6555  device

Connexió de dispositius físics

ADB també detectarà telèfons i tauletes Android, sempre i quan tinguin activada la Depuració USB dins les Eines per desenvolupadors a la configuració del dispositiu.

Ens connectarem al nostre Android obrint un terminal amb la comanda adb shell:

$ adb shell
genymotion:/ $

Múltiples dispositius

Si tenim més d'un dispositiu connectat simultàniament, adb devices ens llistarà un identificador per cadascun.

$ adb devices
List of devices attached
emulator-5554   device
7f1c864e    device

Podem especificar a quin volem obrir el terminal posant el paràmetre -s davant de la comanda shell:

adb -s emulator-5554 shell

Localització de l'aplicació

Un cop obert el terminal a Genymotion, localitzarem on s'ha instal·lat la nostra aplicació.
L'estructura de directoris d'Android té un aspecte com aquest:

img

Ens interessa la branca /data/ de l'arrel del dispositiu, dins de la qual trobem:

  • /data/app
    Conté el codi executable de l'aplicació
  • /data/data
    Conté les dades de l'aplicació

Però si intentem llistar el contingut de qualsevol d'aquests directoris, ens trobem amb que no tenim permisos:

$ cd /data
$ ls
ls: .: Permission denied

Això és així perquè estem obrint el terminal com a l'usuari no privilegiat shell:

$ whoami
shell

I els permisos del directori són drwxrwx--x:

$ ls -lad /data
drwxrwx--x 51 system system 4096 2025-03-06 18:22 /data

Per tant amb l'usuari shell no podem mostrar-ne el contingut.
Necessitem accés amb permisos de root.

Accés com a root

Genymotion ens permet rootejar el dispositiu virtual, i un cop fet això podrem obrir un terminal d'adb i fer-nos root.

Per aconseguir-ho utilitzarem la comanda setprop d'adb per canviar el valor de persist.sys.root_access.
Amb un valor de 3 el dispositiu quedarà rootejat, i amb 0 estarà en l'estat per defecte:

Rootejar Genymotion
adb shell setprop persist.sys.root_access 3

Per tornar de des-rootejar el dispositiu

Des-rootejar Genymotion
adb shell setprop persist.sys.root_access 0

Podem consultar en quin estat està el dispositiu llegint el valor de la propietat amb getprop:

adb shell getprop persist.sys.root_access

Un cop fet això, podem fer-nos root executant la comanda su un cop connectats amb adb:

$ adb shell
genymotion:/ $ whoami
shell
genymotion:/ $ su
:/ # whoami
root
:/ #

Arxius temporals de l'aplicació

Un cop connectats amb accés root, podem llistar el contingut de /data/app, on trobarem un arbre de directoris per cada aplicació instal·lada per l'usuari.

Aplicacions del sistema

Les aplicacions preinstal·lades al sistema es troben dins de /system/app

Dins d'aquests directoris hi trobarem:

  • L'arxiu APK de l'aplicació
  • Un directori oat, que conté codi Dalvik de l'APK optimitzat per poder carregar l'aplicació més ràpidament

Ara també tenim accés a les dades de l'aplicació, que trobarem dins de /data/data.
En aquest cas, són les dades tant d'aplicacions del sistema com les instal·lades per l'usuari.

Si llistem el contingut de /data/data, hi localitzarem les dades corresponents a la nostra aplicació vulnerable a partir del nom del paquet, ja que conté la cadena appinventor que és el nom de l'eina que s'ha utilitzar per crear-lo:

Llistat retallat del contingut de /data/data
:/ # ls /data/data
android
android.ext.services
android.ext.shared
appinventor.ai_egallegos.APP_unlock
com.amaze.filemanager
com.android.adservices.api
com.android.backupconfirm
com.android.bips
com.android.bluetooth
com.android.bluetoothmidiservice
com.android.bookmarkprovider
com.android.calendar
...

Dins del directori de dades de la nostra aplicació hi trobem:

  • cache, dades temporals de l'aplicació
  • code-cache, dades temporals de codi optimitzat de l'aplicació
  • files, fitxers relacionats amb l'aplicació
  • shared_prefs, fitxers configuració

Podem comprovar com si creem qualsevol dada dins del directori cache aquesta s'elimina si esborrem la cache des de les opcions d'Android.

echo "Unes dades qualsevol" > cache/temp

Clear cache

De manera similar, amb el botó Clear Storage esborrarem completament els 4 directoris, i es tornaran a crear amb les dades inicials quan es torni a executar l'aplicació.

Si desinstal·lem l'aplicació del sistema, podem comprovar com s'eliminen completament els directoris corresponents, tant dins de /data/app com de /data/data.

Arxius de configuració de l'aplicació

Examinarem el contingut de les preferències de l'aplicació vulnerable, que es troben dins del directori shared_prefs. Hi localitzem un fitxer en format XML anomenat AppPrefs.xml:

:/data/data/appinventor.ai_egallegos.APP_unlock/shared_prefs # ls -la
total 12
drwxrwx--x 2 u0_a101 u0_a101 4096 2025-03-09 18:21 .
drwx------ 5 u0_a101 u0_a101 4096 2025-03-09 18:21 ..
-rw-rw---- 1 u0_a101 u0_a101  113 2025-03-09 18:21 AppPrefs.xml

Si examinem el seu contingut amb cat, veiem que és on s'emmagatzema el paràmetre que indica a l'aplicació si està o no desbloquejada:

:/data/data/.../shared_prefs # cat AppPrefs.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="unlocked">false</string>
</map>

Modificació de la configuració

Editarem el contingut del fitxer AppPrefs.xml per canviar el valor false per true, i així desbloquejar l'aplicació:
Des del terminal d'adb l'únic editor que tenim disponible és el vi:

vi AppPrefs.xml

Per fer el canvi, els passos a seguir són els següents:

  • movem el cursor fins al caràcter < que hi ha just després a la paraula false
  • premem la tecla I per entrar en mode d'inserció (veurem el text INSERT abaix)
  • esborrem amb Backspace els caràcters de false
  • escrivim els caràcters de true
  • premem Esc per sortir del mode d'inserció
  • premem consecutivament les tecles : W Q Enter per sortir guardant els canvis

Info

Les comandes per sortir del vi corresponen a:
W = Write
Q = Quit

Ja hem modificat el fitxer, però si obrim l'aplicació directament, comprovarem que no està desbloquejada.

Això és així perquè hem modificat el fixer XML amb l'usuari root, i quan hem gravat hem canviat el propietari de l'arxiu.

Per això l'aplicació no podrà obrir aquest fitxer. El sistema l'esborrarà i l'aplicació el crearà de nou amb els valors per defecte, que deixaran l'aplicació bloquejada.

:/data/data/appinventor.ai_egallegos.APP_unlock/shared_prefs # ls -la
total 12
drwxrwx--x 2 u0_a101 u0_a101 4096 2025-03-09 18:33 .
drwx------ 5 u0_a101 u0_a101 4096 2025-03-09 18:21 ..
-rw-rw---- 1 root    root     112 2025-03-09 18:33 AppPrefs.xml

Per tant hem de canviar el propietari del fitxer i posar-hi el mateix que tenen la resta de fitxers i directoris:

chown u0_a101:u0_a101 AppPrefs.xml
:/data/data/appinventor.ai_egallegos.APP_unlock/shared_prefs # ls -la
total 12
drwxrwx--x 2 u0_a101 u0_a101 4096 2025-03-09 18:33 .
drwx------ 5 u0_a101 u0_a101 4096 2025-03-09 18:21 ..
-rw-rw---- 1 u0_a101 u0_a101  112 2025-03-09 18:33 AppPrefs.xml

Un cop fet això, ja podem executar l'aplicació i ara sí ens la trobarem desbloquejada:

App unlocked