# Android Security Audit ### Appunti Incontro CeSeNA - 30 maggio sources: https://tryhackme.com/room/androidhacking101 ## Native o ibride o ??? Le native sono applicazioni sviluppate per uno specifico sistema operativo (Android o IOS). Quindi con linguaggi che vengono compilati per essere eseguiti direttamente dal sistema operativo o da un layer che lo emula (es. JVM). In Android si usa tipicamente Java o Kotlin mentre in IOS Swift o Objective-C. Nelle ibride si utilizza un insieme di tecnologie e linguaggi come HTML, CSS e Javascript utilizzati contemporaneamente attraverso dei Framework come Ionic (che abilitano di fatto l'utilizzo delle funzionalità native). Sempre più utilizzate le Web Application, che sostanzialmente sono tecnologie web wrappate in un browser pensate e sviluppate per eseguire tutte le computazioni client side ed essere di fatto utilizzabili offline. Qui si vedrà un possibile esempio di audit per le native Android. ## Smali - dentro all'apk di Android sono contenute diverse cose, tra cui file .dex. Il file .dex contiene il bytecode eseguibile sulla JVM di Android e questo bytecode si chiama Smali. - Tipi in Smali: void (V), boolean (Z), byte (B), short (S), char \(C\), float (F), int (I), long (J), double (D), array ( \[ ) - OOP: Un metodo Java è sostanzialmente una funzione che viene chiamata ma referenziata rispetto ad un oggetto. In Java quindi non esistono le funzioni ma solo i metodi perché "ogni cosa è un oggetto". Chiamando un metodo "si passa" implicitamente l'oggetto su cui è stato chiamato e per questo, un metodo può agire su dati contenuti nello stato dell'oggetto. - registri da 32 bit sono utilizzati nei metodi e il numero di questi è specificabile in due modi ad inizio metodo: direttiva *.register* definisce il numero totale mentre il *.local* il numero di registri "non parametri" del metodo stesso. - chiamata a metodo: - i parametri sono messi negli ultimi *n* registri - il primo parametro di un metodo è l'oggetto dove il metodo viene invocato \(a meno ché il metodo sia statico: questo caso è identico al precedente tranne per la presenza di un parametro implicito\) - nomi dei registri: - 2 possibili "schemi" per accedervi, *vN* per tutti i registri e *pN* solo per i registri dei parametri. Indice inizia da 0. Lo schema *p* è stato inserito per facilitare la modifica di codice in maniera che se ci rendiamo conto di volere più parametri basta aumentare il numero nella direttiva ed accedere ai *p* che vanno in ordine in sequenza \(se avessimo acceduto con *v* ai parametri, l'aggiunta di un nuovo parametro avrebbe voluto dire la rinomina di tutti i *v* presenti perché vengono inseriti dal fondo\). - esempio chiamata a metodo: `MyObject;->MyMethod(IJZ)V` `p0 -> this` `p1 -> I` `p2, p3 -> J` `p4 -> Z` - chiamata ad un metodo statico che ritorna un intero ![](https://i.imgur.com/QJezKCB.png) - Come viene tradotto un metodo? ![](https://i.imgur.com/r5vYBQ0.png) - Dall'immagine sopra possiamo notare che: - i metodi mantengono lo stesso nome in Smali - si definisce .locals a 1 perché è necessario un registro interno per una variabile non parametro - si possono notare gli *opcodes* di Smali ([tabella con tutti gli opcodes](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)) ## Oltre al .dex ![](https://i.imgur.com/f13DUpM.png) AndroidManifest.xml: the manifest file in binary XML format. **Ricco di metadati e quindi fondamentale quando si fanno audit di sicurezza** classes.dex: application code compiled in the dex format. resources.arsc: file containing precompiled application resources, in binary XML. res/: folder containing resources not compiled into resources.arsc assets/: optional folder containing applications assets, which can be retrieved by AssetManager. lib/: optional folder containing compiled code - i.e. native code libraries. META-INF/: folder containing the MANIFEST.MF file, which stores meta data about the contents of the JAR. which sometimes will be store in a folder named original.The signature of the APK is also stored in this folder. ## Metodologia 1. raccolta di informazioni 2. reversing 3. analisi statica 4. analisi dinamica 5. report ## Raccolta informazioni - playstore - cliente (whitebox pt) - blackbox pt ## Reversing ### Setup di un ambiente di esecuzione - installare emulatore Android - creare l'immagine, avviare, abilitare le Developers options - andare nelle opzioni e abilitare USB debugging ### Tool - Android Debug Bridge (ADB) - jadx - apktool - tanti altri... #### ADB - vedere i device `adb services` - installare un apk `adb install app.apk` - stampare il path dell'apk del package_name `adb shell pm path package_name` - pull file `adb pull <remote> [<local>]` #### Vedere sorgenti? ##### jadx - mostra il Java di un APK - decompila l'APK in Smali e Smali in Java `jadx -d [path-output-folder] [path-apk-or-dex-file]` ##### jadx-gui - versione con UI ##### Dex2Jar + JD-GUI - converte APK in JAR - Si apre il jar con JD-GUI ##### apktool - build e decode Java<=>Smali #### Riassunto - installare app nell'emulatore - ottenere con adb l'apk - ottenere dall'apk il Java o lo Smali ## Analisi statica - senza eseguire il programma si cercano \(vedi descrizione su \): - crittografia usata impropriamente o debole - Preference Activities esportate - app con backup abilitato - app debuggable - app permissions - firebase instance - informazioni sensibili hardcoded - nel mondo reale si utilizzano vari tool perché il tempo è tiranno - MARA framework - testa con owasp: APK Manifest Analysis, Security Analysis - QARK - static code analysis tool - MobSF - pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis. ### Complicazioni nell'analisi statica - offuscamento del codice - piu difficile fare analisi static con reverse - proguard: Removes unused variables, classes, methods, and attributes; Eliminates unnecessary instructions; Removes Tutorial information: obfuscate Androiddepuración code; Renames classes, fields, and methods with unlegible names ## Analisi dinamica - installare con adb `adb install apkfilename.apk` - analisi traffico di rete (es burbsuite) - analisi dei log (PID Cat) - Drozer: interagisce con Dalvik VM, other apps’ IPC endpoints and the underlying OS, permette il deploy di agenti che sfruttano, Discover and interact with the attack surface exposed by Android apps, Execute dynamic Java-code on a device, to avoid the need to compile and install small test scripts. - Inspeckage: oltre a informazioni statiche, hook preconfigurati, praticamente si installa inspeckage sul dispositivo, questo espone un web server che se forwardato può essere raggiunto dalla macchina host, si seleziona l'applicazione da monitorare e lato webapp si possono vedere tutti risultati e dinamici e possono essere aggiunti dinamicamente - Shared Preferences (log and file); Serialization; Crypto; Hashes; SQLite; HTTP (an HTTP proxy tool is still the best alternative); File System; Miscellaneous (Clipboard, URL.Parse()); WebView; IPC; ### Complicazioni analisi dinamica - un app può controllare se sta venendo eseguita in un ambiente rooted o emulato ## Esercitazione Reversing https://ctftime.org/task/6238 - [download](https://storage.googleapis.com/gctf-2018-attachments/61b15eb6a25322704dcd0d44731621e593fe753151796a8a93359c68bd834a36) app apk ### Esecuzione - aprire emulatore o attaccare uno smartphone all'usb - `adb devices` mostra che è attivo il device e visibile - prima di installare è necessario firmare l'apk (è obbligatorio per qualunque apk e c'è un passaggio ulteriore quando si pubblica sul playstore) - `keytool -genkey -v -keystore NOME.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias ALIAS` - `jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NOME.keystore app.apk ALIAS` - installare app - `adb install app.apk` - provare app ### Reversing #### Ispezione Java - jadx decompila l'apk in Java - `jadx app.apk` - si possono ispezionare i file - si può usare jadx-gui per avere la versione con UI che mostra sia Java che Smali #### Ispezione e modifica Smali - apktool permette di decompilare l'apk estranedo tutti i componenti specificati sopra - `apktool d app.apk` - a questo punto possiamo aprire in un editor e iniziare a modificare - una volta fatte particolari modifiche è necessario rebuildare e firmare - `apktool b -o newapp.apk app` - `jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ec.keystore newapp.apk ec` - disinstallare l'app è necessario prima della reinstallazione