Android

Android Pentesting

Android Debug Bridge ADB

adb è un CLI che permette di comunicare in maniera semplice con il dispositivo. Senza entrare nel dettaglio del funzionamento, quello che segue è un cheatsheet con i comandi utili:

Connessione: adb connect IP_DEVICE:5555

Lista dispositivi: adb devics -l

Shell: adb shell

Installa app: adb install file.apk

Upload file sul device: adb push /path/file/locale /path/device

Download dal device: adb pull /path/file/dir/device /path/locale

Port forward: adb forward tcp:6100[host] tcp:7100[device]

Molteplici dispositivi: adb -s SERIAL shell

Screenshot: adb exec-out screencap -p > screen.png

Backup tutto: adb backup -all -noshared -noapk -nosystem

Backup app: adb backup -f nomedelbackup.ab pacchetto.di.cui.fare.il.backup

Backup shared: adb backup –apk –shared com.android.insecurebankv2

Extract backup: cat backup.ab | (dd bs=24 count=0 skip=1; cat) | zlib-flate -uncompress > backup.tar

Log Android: adb logcat | grep "$(adb shell ps | grep <package-name> | awk '{print $2}')"

Info sui processi: adb shell dumpsys meminfo

Info sui processi: adb shell dumpsys meminfo nome.del.pacchetto

Send broadcast: am broadcast -a theBroadcast -n nome.del.pacchetto/.MyBroadCastReceiver -e phone 1234 -e data abcdef

Query provider: content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers 

Dump memoria: fridump.py -s -u -o /path/dump PID

Rimuovere lockscreen: adb shell locksettings clear --old xxxx [xxxx=pattern]

pattern

Cattura clipboard:

$ su u0_a88
$ service call clipboard 2 s16 jakhar.aseem.diva

Debug con Jdwp

È possibile specificare attraverso il file manifest se un’applicazione può essere debuggabile oppure no. Se nel manifest c’è android:debuggable=”true” allora l’applicazione è debuggabile con jdwp.

Dal momento che gli emulatori sono device con accesso root occorre fare attenzione, perché anche se un’app è configurata per non essere debuggabile è possibile farlo. Questo può trarre in inganno nel momento in cui l’attributo android:debuggable non sia presente all’interno del manifest. Il valore di default è false.

Avviare l’applicazione.

JDWP Cheatsheet

Mostra processi debuggabili: adb jdwp

Cerca il processo da debuggare: adb shell ps aux |grep nome.pacchetto.app

Verificare che il processo sia tra quelli listati con il primo comando ed utilizzarlo nel comando seguente.

Port forward: adb forward tcp:qualsiasiporta jdwp:process_id

Aggancia debugger: jdb -attach localhost:quasiasiporta_impostata_prima

Frida

Frida è un tool di instrumentation che permette di interagire attraverso l’utilizzo di JavaScript con il codice nativo delle applicazioni.

Durante le attività viene utilizzato principalmente per bypassare i controlli di root e di SSL pinning, ma è possibile fare molto di più. Per avere un’idea delle potenzialità di frida basta dare un’occhiata al repository ufficiale codeshare: https://codeshare.frida.re/

Python Template per agganciarsi a un’app

import frida, sys
 
js = """
Java.perform(function () {
    // declare classes that are going to be used
    const System = Java.use('java.lang.System');
    const Log = Java.use("android.util.Log");
    const Exception = Java.use("java.lang.Exception");
    
    System.exit.implementation = function() {
        // console.log(Log.getStackTraceString(Exception.$new()));
    };
});
"""
device = frida.get_device_manager().enumerate_devices()[-1]
session = device.attach("com.example.test")
script = session.create_script(js)
script.load()
sys.stdin.read()

Python Template per spawner un’app

import frida, sys
 
js = """
Java.perform(function () {
    // declare classes that are going to be used
    const System = Java.use('java.lang.System');
    const Log = Java.use("android.util.Log");
    const Exception = Java.use("java.lang.Exception");
    
    System.exit.implementation = function() {
        // console.log(Log.getStackTraceString(Exception.$new()));
    };
});
"""
device = frida.get_usb_device()
pid = device.spawn(["com.example.test"])
session = device.attach(pid)
script = session.create_script(js)
script.load()
device.resume(pid)
sys.stdin.read()

Trace della funzione strcmp su chrome: frida-trace -U -i strcmp -f com.android.chrome

Spawn app con file .js: frida -U -l root_bypass.js -f nome.del.pacchetto.app

Attach to app con file .js: frida -U -l multiple_unpinning.js nome.del.pacchetto.app

frida -U --codeshare akabe1/frida-multiple-unpinning -f nome.del.pacchetto

Drozer

Drozer è un framework per l’analisi della sicurezza di app Android che consente di assumere il ruolo di un’app e di interagire con le altre app. Può fare tutto ciò che può fare un’applicazione installata, ad esempio utilizzare il meccanismo IPC di Android e interagire con il sistema operativo.

Drozer permette anche di exploitare i device da remoto creando file o pagine Web dannose che sfruttano vulnerabilità note. Il payload utilizzato in questi exploit è un agente drozer che è essenzialmente uno strumento di amministrazione remota. A seconda delle autorizzazioni concesse all’app vulnerabile, drozer può installare un agente completo o iniettare un agente limitato all’interno del processo.

Manuale: https://labs.f-secure.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf

Drozer cheatsheet

General

run app.package.list

run app.package.attacksurface org.owasp.goatdroid.fourgoats

run app.package.info –a nome.del.pacchetto

Activity

run app.activity.info -a nome.del.pacchetto

run app.activity.start --component nome.del.pacchetto nome.del.pacchetto.activities.Main

run app.activity.start --component com.example.android.notepad com.example.android.notepad.NoteEditor --action android.intent.action.EDIT --data-uri content://com.google.provider.NotePad/notes/1

Services

run app.service.info -a org.owasp.goatdroid.fourgoats

run app.service.start --component com.elearnsecurity.sillyservice com.elearnsecurity.sillyservice.SillyService --extra string COMMAND "find /data/data/com.elearnsecurity.sillyservice/files; echo 'ciccio bello' > /data/data/com.elearnsecurity.sillyservice/files/ste.txt"

Providers

run app.provider.info -a org.owasp.goatdroid.fourgoats

run scanner.provider.finduris -a org.owasp.goatdroid.fourgoats

run app.provider.query content://com.elearnsecurity.injectme.provider.CredentialProvider/credentials/ --vertical

run app.provider.read content://com.els.filebrowser/../../../../../../etc/hosts

run scanner.provider.injection -a org.owasp.goatdroid.fourgoats

Broadcast

run app.broadcast.info --package org.owasp.goatdroid.fourgoats -i 

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver --extra string phoneNumber 11111111 --extra string message "ciccio"