Exploiting a debuggeable application

Sfruttare un'applicazione debuggabile

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Bypassare i controlli di root e debuggabilità

Questa sezione del post è un riassunto del post https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

Passaggi per rendere un'applicazione Android debuggabile e bypassare i controlli

Rendere l'applicazione debuggabile

Contenuto basato su https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

  1. Decompilare l'APK:

  • Utilizzare lo strumento APK-GUI per decompilare l'APK.

  • Nel file android-manifest, inserire android:debuggable=true per abilitare la modalità di debug.

  • Ricompilare, firmare e zipalignare l'applicazione modificata.

  1. Installare l'applicazione modificata:

  • Utilizzare il comando: adb install <nome_applicazione>.

  1. Recuperare il nome del pacchetto:

  • Eseguire adb shell pm list packages –3 per elencare le applicazioni di terze parti e trovare il nome del pacchetto.

  1. Impostare l'applicazione in attesa di una connessione del debugger:

  • Comando: adb shell am setup-debug-app –w <nome_pacchetto>.

  • Nota: Questo comando deve essere eseguito ogni volta prima di avviare l'applicazione per assicurarsi che attenda il debugger.

  • Per la persistenza, utilizzare adb shell am setup-debug-app –w -–persistent <nome_pacchetto>.

  • Per rimuovere tutti i flag, utilizzare adb shell am clear-debug-app <nome_pacchetto>.

  1. Prepararsi per il debug in Android Studio:

  • Navigare in Android Studio su File -> Apri profilo o APK.

  • Aprire l'APK ricompilato.

  1. Impostare i punti di interruzione nei file Java chiave:

  • Posizionare i punti di interruzione in MainActivity.java (specificamente nel metodo onCreate), b.java e ContextWrapper.java.

Bypassare i controlli

L'applicazione, in determinati punti, verificherà se è debuggabile e controllerà anche la presenza di binari che indicano un dispositivo con root. Il debugger può essere utilizzato per modificare le informazioni dell'applicazione, annullare il bit di debuggabilità e modificare i nomi dei binari cercati per bypassare questi controlli.

Per il controllo di debuggabilità:

  1. Modificare le impostazioni del flag:

  • Nella sezione delle variabili della console del debugger, passare a: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.

  • Nota: La rappresentazione binaria di flags = 814267974 è 11000011100111011110, che indica che il "Flag_debuggable" è attivo.

Questi passaggi assicurano collettivamente che l'applicazione possa essere debuggata e che determinati controlli di sicurezza possano essere bypassati utilizzando il debugger, facilitando un'analisi o una modifica più approfondita del comportamento dell'applicazione.

Il passaggio 2 prevede la modifica di un valore del flag a 814267972, che è rappresentato in binario come 110000101101000000100010100.

Sfruttare una vulnerabilità

È stata fornita una dimostrazione utilizzando un'applicazione vulnerabile contenente un pulsante e un textview. Inizialmente, l'applicazione visualizza "Crack Me". L'obiettivo è modificare il messaggio da "Try Again" a "Hacked" durante l'esecuzione, senza modificare il codice sorgente.

Verifica della vulnerabilità

  • L'applicazione è stata decompilata utilizzando apktool per accedere al file AndroidManifest.xml.

  • La presenza di android_debuggable="true" in AndroidManifest.xml indica che l'applicazione è debuggabile e suscettibile di essere sfruttata.

  • È importante notare che apktool viene utilizzato esclusivamente per verificare lo stato di debuggabilità senza modificare alcun codice.

Preparazione dell'ambiente

  • Il processo ha coinvolto l'avvio di un emulatore, l'installazione dell'applicazione vulnerabile e l'utilizzo di adb jdwp per identificare le porte Dalvik VM in ascolto.

  • JDWP (Java Debug Wire Protocol) consente il debug di un'applicazione in esecuzione in una VM esponendo una porta univoca.

  • È stato necessario l'inoltro delle porte per il debug remoto, seguito dall'attacco di JDB all'applicazione target.

Iniezione di codice in tempo di esecuzione

  • Lo sfruttamento è stato effettuato impostando punti di interruzione e controllando il flusso dell'applicazione.

  • Sono stati utilizzati comandi come classes e methods <nome_classe> per scoprire la struttura dell'applicazione.

  • È stato impostato un punto di interruzione nel metodo onClick, e la sua esecuzione è stata controllata.

  • Sono stati utilizzati i comandi locals, next e set per ispezionare e modificare le variabili locali, in particolare cambiando il messaggio "Try Again" in "Hacked".

  • Il codice modificato è stato eseguito utilizzando il comando run, modificando con successo l'output dell'applicazione in tempo reale.

Questo esempio ha dimostrato come il comportamento di un'applicazione debuggabile possa essere manipolato, evidenziando il potenziale per exploit più complessi come l'accesso alla shell sul dispositivo nel contesto dell'applicazione.

Riferimenti

Last updated