Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h

This commit is contained in:
Translator 2025-02-25 22:34:42 +00:00
parent 19b283abda
commit 87d80bd5e9
5 changed files with 73 additions and 21 deletions

View File

@ -4,12 +4,12 @@
## Attività, Back Stack e Attività in Primo Piano
In Android, un **task** è essenzialmente un insieme di attività con cui gli utenti interagiscono per completare un lavoro specifico, organizzato all'interno di uno **stack di retro**. Questo stack ordina le attività in base a quando sono state aperte, con l'attività più recente visualizzata in cima come **attività in primo piano**. In qualsiasi momento, solo questa attività è visibile sullo schermo, rendendola parte del **task in primo piano**.
In Android, un **task** è essenzialmente un insieme di attività con cui gli utenti interagiscono per completare un lavoro specifico, organizzato all'interno di un **back stack**. Questo stack ordina le attività in base a quando sono state aperte, con l'attività più recente visualizzata in cima come **attività in primo piano**. In qualsiasi momento, solo questa attività è visibile sullo schermo, rendendola parte del **task in primo piano**.
Ecco una rapida panoramica delle transizioni delle attività:
- **Attività 1** inizia come l'unica attività in primo piano.
- L'apertura di **Attività 2** spinge **Attività 1** nello stack di retro, portando **Attività 2** in primo piano.
- L'apertura di **Attività 2** spinge **Attività 1** nel back stack, portando **Attività 2** in primo piano.
- L'avvio di **Attività 3** sposta **Attività 1** e **Attività 2** ulteriormente indietro nello stack, con **Attività 3** ora davanti.
- La chiusura di **Attività 3** riporta **Attività 2** in primo piano, mostrando il meccanismo di navigazione dei task semplificato di Android.
@ -30,14 +30,20 @@ L'attributo `launchMode` dirige la gestione delle istanze delle attività all'in
1. **Installazione dell'App Maligna**: La vittima installa l'app dell'attaccante sul proprio dispositivo.
2. **Attivazione Iniziale**: La vittima apre per prima l'app maligna, preparando il dispositivo per l'attacco.
3. **Tentativo di Lancio dell'App Target**: La vittima tenta di aprire l'app target.
4. **Esecuzione dell'Hijack**: A causa della corrispondenza dell'affinità del task, l'app maligna viene lanciata al posto dell'app target.
5. **Inganno**: L'app maligna presenta una schermata di accesso falsa simile all'app target, ingannando l'utente a inserire informazioni sensibili.
4. **Esecuzione dell'Hijack**: A un certo punto, l'app cerca di aprire la vista **singleTask**. A causa della corrispondenza dell'affinità del task, l'app maligna viene lanciata al posto dell'app target.
5. **Inganno**: L'app maligna presenta una schermata di accesso falsa che somiglia all'app target, ingannando l'utente a inserire informazioni sensibili.
> [!TIP]
> Nota che per questo attacco funzionare la vista vulnerabile **non deve avere esportato a true** né deve essere l'attività principale.
Per un'implementazione pratica di questo attacco, fai riferimento al repository Task Hijacking Strandhogg su GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
### Misure di Prevenzione
Per prevenire tali attacchi, gli sviluppatori possono impostare `taskAffinity` su una stringa vuota e optare per la modalità di lancio `singleInstance`, garantendo l'isolamento della loro app da altre. Personalizzare la funzione `onBackPressed()` offre ulteriore protezione contro l'hijacking del task.
Per prevenire tali attacchi, gli sviluppatori possono:
- Impostare **`**taskAffinity`** della vista **singleTask** su una stringa vuota (`android:taskAffinity=""`)
- Optare per la modalità di lancio **`singleInstance`**, garantendo l'isolamento della loro app da altre.
- Personalizzare la funzione **`onBackPressed()`** offre ulteriore protezione contro l'hijacking del task.
## **Riferimenti**

View File

@ -6,34 +6,76 @@ Per confermare se l'applicazione è stata costruita sul framework React Native,
1. Rinomina il file APK con un'estensione zip ed estrailo in una nuova cartella usando il comando `cp com.example.apk example-apk.zip` e `unzip -qq example-apk.zip -d ReactNative`.
2. Naviga nella nuova cartella ReactNative e individua la cartella assets. All'interno di questa cartella, dovresti trovare il file `index.android.bundle`, che contiene il JavaScript React in formato minificato.
2. Naviga nella nuova cartella ReactNative e individua la cartella assets. All'interno di questa cartella, dovresti trovare il file `index.android.bundle`, che contiene il JavaScript React in un formato minificato.
3. Usa il comando `find . -print | grep -i ".bundle$"` per cercare il file JavaScript.
Per analizzare ulteriormente il codice JavaScript, crea un file chiamato `index.html` nella stessa directory con il seguente codice:
## Codice Javascript
Se controllando i contenuti di `index.android.bundle` trovi il codice JavaScript dell'applicazione (anche se minificato), puoi **analizzarlo per trovare informazioni sensibili e vulnerabilità**.
Poiché il bundle contiene effettivamente tutto il codice JS dell'applicazione, è possibile **dividerlo in diversi file** (potenzialmente facilitando il suo reverse engineering) utilizzando lo **strumento [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Per analizzare ulteriormente il codice JavaScript, puoi caricare il file su [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o seguire questi passaggi:
1. Crea un file chiamato `index.html` nella stessa directory con il seguente codice:
```html
<script src="./index.android.bundle"></script>
```
Puoi caricare il file su [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o seguire questi passaggi:
2. Apri il file `index.html` in Google Chrome.
1. Apri il file `index.html` in Google Chrome.
3. Apri la Developer Toolbar premendo **Command+Option+J per OS X** o **Control+Shift+J per Windows**.
2. Apri la Developer Toolbar premendo **Command+Option+J per OS X** o **Control+Shift+J per Windows**.
4. Clicca su "Sources" nella Developer Toolbar. Dovresti vedere un file JavaScript suddiviso in cartelle e file, che compongono il bundle principale.
3. Clicca su "Sources" nella Developer Toolbar. Dovresti vedere un file JavaScript suddiviso in cartelle e file, che compongono il bundle principale.
Se trovi un file chiamato `index.android.bundle.map`, potrai analizzare il codice sorgente in un formato non minificato. I file di mappatura contengono mappature sorgente, che ti permettono di mappare identificatori minificati.
Se trovi un file chiamato `index.android.bundle.map`, sarai in grado di analizzare il codice sorgente in un formato non minimizzato. I file di mappatura contengono mappature sorgente, che ti consentono di mappare identificatori minimizzati.
Per cercare credenziali sensibili ed endpoint, segui questi passaggi:
Per cercare credenziali sensibili e endpoint, segui questi passaggi:
1. Identifica parole chiave sensibili per analizzare il codice JavaScript. Le applicazioni React Native spesso utilizzano servizi di terze parti come Firebase, endpoint del servizio AWS S3, chiavi private, ecc.
2. In questo caso specifico, è stato osservato che l'applicazione stava utilizzando il servizio Dialogflow. Cerca un modello relativo alla sua configurazione.
2. In questo caso specifico, è stato osservato che l'applicazione utilizzava il servizio Dialogflow. Cerca un modello relativo alla sua configurazione.
3. È stato fortunato che credenziali sensibili hard-coded siano state trovate nel codice JavaScript durante il processo di ricognizione.
### Cambia il codice JS e ricostruisci
In questo caso cambiare il codice è facile. Devi solo rinominare l'app per utilizzare l'estensione `.zip` ed estrarla. Poi puoi **modificare il codice JS all'interno di questo bundle e ricostruire l'app**. Questo dovrebbe essere sufficiente per permetterti di **iniettare codice** nell'app per scopi di test.
## Bytecode Hermes
Se il bundle contiene **bytecode Hermes**, **non potrai accedere al codice Javascript** dell'app (neanche alla versione minificata).
Puoi controllare se il bundle contiene bytecode Hermes eseguendo il seguente comando:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Tuttavia, puoi utilizzare gli strumenti **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** o **[hermes_rs](https://github.com/Pilfer/hermes_rs)** per **disassemblare il bytecode** e anche per **decompilarlo in un codice JS pseudo**. Per fare ciò, ad esempio, questi comandi:
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Modifica il codice e ricostruisci
Idealmente dovresti essere in grado di modificare il codice disassemblato (cambiando un confronto, un valore o qualsiasi cosa tu debba modificare) e poi **ricostruire il bytecode** e poi ricostruire l'app.
Lo strumento **[hbctool](https://github.com/bongtrop/hbctool)** supporta il disassemblaggio del bundle e la ricostruzione dopo che sono state apportate le modifiche, tuttavia **supporta solo versioni obsolete** del bytecode di Hermes.
Lo strumento **[hermes-dec](https://github.com/P1sec/hermes-dec)** non supporta la ricostruzione del bytecode.
Lo strumento **[hermes_rs](https://github.com/Pilfer/hermes_rs)** supporta la ricostruzione del bytecode, ma è in realtà una libreria e non uno strumento CLI.
## Analisi Dinamica
Potresti provare ad analizzare dinamicamente l'app utilizzando Frida per abilitare la modalità sviluppatore dell'app React e utilizzare **`react-native-debugger`** per collegarti ad essa. Tuttavia, per questo hai apparentemente bisogno del codice sorgente dell'app. Puoi trovare ulteriori informazioni su questo in [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## Riferimenti
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,15 +2,17 @@
{{#include ../../banners/hacktricks-training.md}}
## **Informazioni di Base**
## **Informazioni di base**
**Tapjacking** è un attacco in cui un **applicazione** **maligna** viene lanciata e **si posiziona sopra un'applicazione vittima**. Una volta che oscura visibilmente l'app vittima, la sua interfaccia utente è progettata in modo da ingannare l'utente a interagire con essa, mentre passa l'interazione all'app vittima.\
In effetti, sta **accecando l'utente dal sapere che sta effettivamente eseguendo azioni sull'app vittima**.
In effetti, sta **ciecando l'utente dal sapere che sta effettivamente eseguendo azioni sull'app vittima**.
### Rilevamento
Per rilevare app vulnerabili a questo attacco, dovresti cercare **attività esportate** nel manifest android (nota che un'attività con un intent-filter è automaticamente esportata per impostazione predefinita). Una volta trovate le attività esportate, **controlla se richiedono qualche permesso**. Questo perché l'**applicazione maligna avrà bisogno di quel permesso**.
Puoi anche controllare la versione SDK minima dell'app, verificando il valore di **`android:minSdkVersion`** nel file **`AndroidManifest.xml`**. Se il valore è **inferiore a 30**, l'app è vulnerabile al Tapjacking.
### Protezione
#### Android 12 (API 31,32) e superiori
@ -33,7 +35,7 @@ android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>
```
## Sfruttamento
## Exploitation
### Tapjacking-ExportedActivity
@ -52,7 +54,7 @@ Un progetto di esempio che implementa **FloatingWindowApp**, che può essere uti
Puoi utilizzare [**qark**](https://github.com/linkedin/qark) con i parametri `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` per creare un'applicazione malevola per testare possibili vulnerabilità di **Tapjacking**.\
La mitigazione è relativamente semplice poiché lo sviluppatore può scegliere di non ricevere eventi touch quando una vista è coperta da un'altra. Utilizzando il [Riferimento per gli sviluppatori Android](https://developer.android.com/reference/android/view/View#security):
La mitigazione è relativamente semplice poiché lo sviluppatore può scegliere di non ricevere eventi touch quando una vista è coperta da un'altra. Utilizzando il [Riferimento per sviluppatori Android](https://developer.android.com/reference/android/view/View#security):
> A volte è essenziale che un'applicazione possa verificare che un'azione venga eseguita con la piena conoscenza e il consenso dell'utente, come concedere una richiesta di autorizzazione, effettuare un acquisto o cliccare su un annuncio. Sfortunatamente, un'applicazione malevola potrebbe cercare di ingannare l'utente nel compiere queste azioni, senza che se ne accorga, nascondendo lo scopo previsto della vista. Come rimedio, il framework offre un meccanismo di filtraggio dei tocchi che può essere utilizzato per migliorare la sicurezza delle viste che forniscono accesso a funzionalità sensibili.
>

View File

@ -471,12 +471,13 @@ window.search = window.search || {};
showResults(true);
}
fetch(path_to_root + 'searchindex.json')
var branch = lang === "en" ? "master" : lang
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
.then(response => response.json())
.then(json => init(json))
.catch(error => { // Try to load searchindex.js if fetch failed
var script = document.createElement('script');
script.src = path_to_root + 'searchindex.js';
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
script.onload = () => init(window.search);
document.head.appendChild(script);
});

View File

@ -55,6 +55,7 @@
<!-- Provide site root to javascript -->
<script>
var path_to_root = "{{ path_to_root }}";
var lang = "{{ language }}";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
</script>
<!-- Start loading toc.js asap -->