Analizzare applicazioni mobile con Drozer

Tempo di lettura: 7 minuti

Drozer è un framework sviluppato dai laboratori MWR, utilizzato per testare e rilevare vulnerabilità in un applicazione o dispositivo mobile. Esso è uno dei software più utilizzati per analisi dinamiche, exploits remoti o locali e per uno dei suoi punti chiave, ossia l’utilizzo dei meccanismi IPC che interagiscono con il sistema operativo.

Installazione

Dopo aver scaricato la versione del software compatibile con il vostro computer e l'app di testing,  avviate il vostro smartphone virtuale e, con adb, installate l’applicazione di prova

Agent.apk
Agent.apk

Una volta installata, bisogna eseguirla e attivarla direttamente nello smartphone

Agent avviato
Agent avviato

Dopo averlo avviata, i comandi da eseguire nel terminale sono

./adb forward tcp:31415 tcp:31415

il quale permette l’ascolto al server di Drozer e

drozer console connect

che avvierà direttamente Drozer

Console di Drozer
Console di Drozer

Moduli

[Nota: per questo articolo utilizzerò InsecureBank, app apposita per imparare il pentesting di applicazioni mobile]

Come molti altri framework, Drozer ha decine di diversi moduli utilizzabili per l’analisi di applicazioni. Per vederli, basta digitare list

dz> list
app.activity.forintent                   Find activities that can handle the given intent                                                             
app.activity.info                        Gets information about exported activities.                                                                  
app.activity.start                       Start an Activity                                                                                            
app.broadcast.info                       Get information about broadcast receivers                                                                    
app.broadcast.send                       Send broadcast using an intent                                                                               
app.broadcast.sniff                      Register a broadcast receiver that can sniff particular intents                                              
app.package.attacksurface                Get attack surface of package                                                                                
app.package.backup                       Lists packages that use the backup API (returns true on FLAG_ALLOW_BACKUP)                                   
app.package.debuggable                   Find debuggable packages                                                                                     
app.package.info                         Get information about installed packages                                                                     
app.package.launchintent                 Get launch intent of package                                                                                 
app.package.list                         List Packages   
............

Informazioni sui pacchetti

Il modulo “padre” delle informazioni sui pacchetti è app.package.*. Esso ha al suo interno diversi altri moduli, come list, _manifest _o info.

Per cercare se un’applicazione è installata basta digitare run app.package.list seguito dal comando di ricerca

dz> run app.package.list -f bank
com.android.insecurebankv2 (InsecureBankv2)

Una volta trovato il nome dell’applicazione, controllo i permessi

Permessi di InsecureBank
Permessi di InsecureBank

Come già detto nel precedente articolo, se non si capisse cosa fa un determinato permesso, è possibile cercarlo in questa lista.

Per una visione più chiara dei permessi è anche possibile eseguire il comando manifest, il quale visualizza il file AndroidManifest.xml dell’applicazione selezionata

dz> run app.package.manifest com.android.insecurebankv2

Identificare l’attacco

Per identificare i processi da attaccare bisogna prima di tutto capire quali sono e in che componenti l’applicazione può essere scomposta. Per fare ciò, digitiamo il comando

dz> run app.package.attacksurface com.android.insecurebankv2
Attack Surface:
  5 activities exported
  1 broadcast receivers exported
  1 content providers exported
  0 services exported

Come si può vedere, Drozer ha esportato cinque attività, un broadcast receiver e un content provider. Un’applicazione “esporta” una serie di attività per renderle disponibili al sistema, all’utente o ad altre applicazioni. Ora possiamo vedere quali sono queste attività esportate con il comando

dz> run app.activity.info -a com.android.insecurebankv2
Package: com.android.insecurebankv2
  com.android.insecurebankv2.LoginActivity
    Permission: null
  com.android.insecurebankv2.PostLogin
    Permission: null
  com.android.insecurebankv2.DoTransfer
    Permission: null
  com.android.insecurebankv2.ViewStatement
    Permission: null
  com.android.insecurebankv2.ChangePassword
    Permission: null

Avviando una delle attività con il comando

dz> run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin

possiamo eseguire una singola attività senza passare dalle altre. Un applicazione con i dovuti controlli darà probabilmente la possibilità di accedere all’attività prescelta, ma eseguendo altri comandi è probabile che crashi.

Attività di PostLogin avviata
Attività di PostLogin avviata

Lettura dei contenuti

Oltre alle attività, vengono esportati, se presenti, anche i contenuti locali dell’applicazione. Per poterli leggere, il comando è

dz> run app.provider.info -a com.android.insecurebankv2
Package: com.android.insecurebankv2
  Authority: com.android.insecurebankv2.TrackUserContentProvider
    Read Permission: null
    Write Permission: null
    Content Provider: com.android.insecurebankv2.TrackUserContentProvider
    Multiprocess Allowed: False
    Grant Uri Permissions: False

Come si può notare, nessun permesso è richiesto per leggere i contenuti, quindi nel caso di dati salvati in locale (come i dati di accesso) sarà possibile leggerli senza nessun problema. Un altro comando permette di verificare ciò, stampando anche le cartelle che possono essere lette o no

Content provider
Content provider

Nel caso fossero accessibili, possiamo provare a leggere questi dati sempre tramite Drozer. Il comando è

dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers/
| id | name |

Ovviamente in questo caso l’applicazione testata è vuota, ma se avvesse degli account, avremmo già avuto i dati di autenticazione.

Conclusioni

Per chi conoscesse Metasploit, avrà già notato molte somiglianze. Drozer funziona in modo molto simile, e, anche se non ha centinaia di moduli, è utilissimo per analisi dinamiche preliminari, e per trovare vulnerabilità che saltano all’occhio. Per chi vuole approfondire, la guida è ottima, con esempio compiuti su un’applicazione di testing.