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:
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:
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:
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
:
Múltiples dispositius
Si tenim més d'un dispositiu connectat simultàniament, adb devices
ens llistarà un identificador per cadascun.
Podem especificar a quin volem obrir el terminal posant el paràmetre -s
davant de la comanda 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:
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:
Això és així perquè estem obrint el terminal com a l'usuari no privilegiat shell
:
I els permisos del directori són drwxrwx--x
:
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:
Per tornar de des-rootejar el dispositiu
Podem consultar en quin estat està el dispositiu llegint el valor de la propietat amb getprop
:
Un cop fet això, podem fer-nos root executant la comanda su
un cop connectats amb adb:
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:
:/ # 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.
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
:
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 paraulafalse
- 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:
:/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: