In questo articolo vedremo i principali fondamenti delle applicazioni Android, in modo da capire come analizzarle al meglio e avere tutti gli strumenti per capire cosa sta avvenendo all’interno del sistema durante un analisi e/o pentesting.
Ogni applicazione scaricata da qualsiasi fonte, per essere installata necessita dell’estenzione .apk. Questi APK (Android Application Package) sono file compressi, contenenti file e cartelle necessari per il funzionamento della stessa.
Come per i file .epub, per accedere ai file interni basta modificare l’estensione in .zip
I file presenti sono di solito:
In base al tipo di applicazione avremo diversi file localizzati in varie parti. I principali sono:
Solitamente le applicazioni consistono di quattro differenti componenti:
Per chiunque volesse approfondire, la fonte è il sito di Developer Android.
Quando si apre un applicazione, il processo che la esegue è Zygote, il quale crea una copia di se stesso (con una fork). L’applicazione chiamerà poi le sue componenti necessarie al funzionamento e, nel caso servisse, attenderà un input dell’utente che la sta utilizzando. Con adb è possibile vedere i processi attivi nello smartphone, con il comando (come su Linux) ps
Nel comando ho inserito anche u0, ossia l'User ID che possiede ogni applicazione. In un dispositivo con i permessi di root è possibile verificare l’UID leggendo il file /data/system/packages.
generic_x86:/ # cat /data/system/packages.xml
<package name="it.nordcom.app" codePath="/data/app/it.nordcom.app-1" nativeLibraryPath="/data/app/it.nordcom.app-1/lib" publicFlags="941145668" privateFlags="0" userId="10071">
<sigs count="1">
<cert index="6" key="308202e...184f9ea9dfdf52da" />
</sigs>
<perms>
<item name="com.google.android.c2dm.permission.RECEIVE" granted="true" flags="0" />
<item name="android.permission.ACCESS_FINE_LOCATION" granted="true" flags="0" />
<item name="com.google.android.providers.gsf.permission.READ_GSERVICES" granted="true" flags="0" />
<item name="android.permission.MANAGE_ACCOUNTS" granted="true" flags="0" />
<item name="android.permission.RECEIVE_BOOT_COMPLETED" granted="true" flags="0" />
<item name="android.permission.AUTHENTICATE_ACCOUNTS" granted="true" flags="0" />
<item name="android.permission.INTERNET" granted="true" flags="0" />
<item name="android.permission.READ_EXTERNAL_STORAGE" granted="true" flags="0" />
<item name="android.permission.ACCESS_NETWORK_STATE" granted="true" flags="0" />
<item name="android.permission.GET_ACCOUNTS" granted="true" flags="0" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" granted="true" flags="0" />
<item name="it.nordcom.app.permission.C2D_MESSAGE" granted="true" flags="0" />
<item name="android.permission.WAKE_LOCK" granted="true" flags="0" />
</perms>
<proper-signing-keyset identifier="12" />
</package>
Con questo comando è anche possibile visualizzare i permessi reali di cui l’applicazione necessita. Quasi sempre sono chiari e già dal nome è possibile capire di cosa si tratta. Nel caso non capiste quale è il permesso, qui sono presenti quasi tutti. Per vedere i permessi che si hanno nello smartphone, il comando sarà
./adb shell pm list permissions
Infine, ogni app salva alcuni dati nello smartphone, utili per il funzionamento della stessa. Si trovano principalmente nella cartella /data/data/nomeapp. Nel nostro caso, avremo
Spero di esser riuscito a spiegare a grandi linee come un’applicazione utilizza uno smartphone e come si comporta nello stesso. Per chi volesse approfondire e/o sviluppare una propria app, uno dei libri più basilari in commercio è Hello, Android. Da questo momento in poi, nella categoria Mobile, passerò a spiegare e introdurre l’analisi e il pentesting di un applicazione, argomento ancora molto poco noto rispetto al pentesting su dispositivi fissi.