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

This commit is contained in:
Translator 2025-02-25 22:35:05 +00:00
parent a7860bd0b4
commit 7d091128f3
5 changed files with 75 additions and 23 deletions

View File

@ -4,14 +4,14 @@
## Task, Back Stack und Vordergrundaktivitäten
In Android ist eine **Task** im Wesentlichen eine Gruppe von Aktivitäten, mit denen Benutzer interagieren, um eine bestimmte Aufgabe abzuschließen, organisiert innerhalb eines **Back Stacks**. Dieser Stack ordnet Aktivitäten basierend darauf, wann sie geöffnet wurden, wobei die aktuellste Aktivität oben als **Vordergrundaktivität** angezeigt wird. Zu jedem Zeitpunkt ist nur diese Aktivität auf dem Bildschirm sichtbar, was sie Teil der **Vordergrund-Task** macht.
In Android ist eine **Task** im Wesentlichen eine Gruppe von Aktivitäten, mit denen Benutzer interagieren, um eine bestimmte Aufgabe zu erledigen, organisiert innerhalb eines **Back Stacks**. Dieser Stack ordnet Aktivitäten basierend darauf, wann sie geöffnet wurden, wobei die aktuellste Aktivität oben als **Vordergrundaktivität** angezeigt wird. Zu jedem Zeitpunkt ist nur diese Aktivität auf dem Bildschirm sichtbar, was sie Teil der **Vordergrund-Task** macht.
Hier ist eine kurze Übersicht über Aktivitätsübergänge:
- **Aktivität 1** beginnt als die einzige Aktivität im Vordergrund.
- Das Starten von **Aktivität 2** schiebt **Aktivität 1** in den Back Stack und bringt **Aktivität 2** in den Vordergrund.
- Das Starten von **Aktivität 3** verschiebt **Aktivität 1** und **Aktivität 2** weiter nach hinten im Stack, wobei **Aktivität 3** jetzt vorne ist.
- Das Schließen von **Aktivität 3** bringt **Aktivität 2** zurück in den Vordergrund und zeigt das optimierte Task-Navigationssystem von Android.
- Das Schließen von **Aktivität 3** bringt **Aktivität 2** zurück in den Vordergrund und zeigt das optimierte Task-Navigationsmechanismus von Android.
![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>)
@ -23,21 +23,27 @@ In Android-Anwendungen gibt die **Task-Affinität** die bevorzugte Task einer Ak
### Startmodi
Das Attribut `launchMode` steuert die Handhabung von Aktivitätsinstanzen innerhalb von Tasks. Der **singleTask**-Modus ist für diesen Angriff entscheidend, da er drei Szenarien basierend auf den vorhandenen Aktivitätsinstanzen und Übereinstimmungen der Task-Affinität diktiert. Der Exploit beruht auf der Fähigkeit der App des Angreifers, die Task-Affinität der Ziel-App zu imitieren, wodurch das Android-System in die Irre geführt wird, die App des Angreifers anstelle der beabsichtigten Ziel-App zu starten.
Das Attribut `launchMode` steuert die Handhabung von Aktivitätsinstanzen innerhalb von Tasks. Der **singleTask**-Modus ist für diesen Angriff entscheidend und diktiert drei Szenarien basierend auf den vorhandenen Aktivitätsinstanzen und Übereinstimmungen der Task-Affinität. Der Exploit beruht auf der Fähigkeit der App des Angreifers, die Task-Affinität der Ziel-App zu imitieren, wodurch das Android-System in die Irre geführt wird, die App des Angreifers anstelle der beabsichtigten Ziel-App zu starten.
### Detaillierte Angriffs Schritte
1. **Installation der bösartigen App**: Das Opfer installiert die App des Angreifers auf seinem Gerät.
2. **Erste Aktivierung**: Das Opfer öffnet zuerst die bösartige App und bereitet das Gerät für den Angriff vor.
3. **Versuch, die Ziel-App zu starten**: Das Opfer versucht, die Ziel-App zu öffnen.
4. **Ausführung des Hijacks**: Aufgrund der übereinstimmenden Task-Affinität wird die bösartige App anstelle der Ziel-App gestartet.
4. **Ausführung der Hijack**: Zu einem bestimmten Zeitpunkt versucht die App, die **singleTask**-Ansicht zu öffnen. Aufgrund der übereinstimmenden Task-Affinität wird die bösartige App anstelle der Ziel-App gestartet.
5. **Täuschung**: Die bösartige App zeigt einen gefälschten Anmeldebildschirm, der der Ziel-App ähnelt, und täuscht den Benutzer, sensible Informationen einzugeben.
Für eine praktische Umsetzung dieses Angriffs verweisen Sie auf das Task Hijacking Strandhogg-Repository auf GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
> [!TIP]
> Beachten Sie, dass für diesen Angriff die verwundbare Ansicht **nicht auf exported true** gesetzt sein muss, noch muss sie die Hauptaktivität sein.
Für eine praktische Implementierung dieses Angriffs verweisen Sie auf das Task Hijacking Strandhogg-Repository auf GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
### Präventionsmaßnahmen
Um solche Angriffe zu verhindern, können Entwickler `taskAffinity` auf einen leeren String setzen und den Startmodus `singleInstance` wählen, um die Isolation ihrer App von anderen zu gewährleisten. Die Anpassung der Funktion `onBackPressed()` bietet zusätzlichen Schutz gegen Task-Hijacking.
Um solche Angriffe zu verhindern, können Entwickler:
- **`taskAffinity`** der **singleTask**-Ansicht auf eine leere Zeichenfolge setzen (`android:taskAffinity=""`)
- Den **`singleInstance`**-Startmodus wählen, um die Isolation ihrer App von anderen zu gewährleisten.
- Die Funktion **`onBackPressed()`** anpassen, um zusätzlichen Schutz gegen Task-Hijacking zu bieten.
## **Referenzen**

View File

@ -1,26 +1,34 @@
{{#include ../../banners/hacktricks-training.md}}
# Analyse von React Native-Anwendungen
# Analyse von React Native Anwendungen
Um zu bestätigen, ob die Anwendung auf dem React Native-Framework basiert, befolgen Sie diese Schritte:
Um zu bestätigen, ob die Anwendung auf dem React Native Framework basiert, befolgen Sie diese Schritte:
1. Benennen Sie die APK-Datei mit einer Zip-Erweiterung um und extrahieren Sie sie in einen neuen Ordner mit dem Befehl `cp com.example.apk example-apk.zip` und `unzip -qq example-apk.zip -d ReactNative`.
2. Navigieren Sie zum neu erstellten ReactNative-Ordner und suchen Sie den Ordner assets. In diesem Ordner sollten Sie die Datei `index.android.bundle` finden, die das React JavaScript in minifizierter Form enthält.
3. Verwenden Sie den Befehl `find . -print | grep -i ".bundle$"`, um die JavaScript-Datei zu suchen.
3. Verwenden Sie den Befehl `find . -print | grep -i ".bundle$"`, um nach der JavaScript-Datei zu suchen.
Um den JavaScript-Code weiter zu analysieren, erstellen Sie eine Datei mit dem Namen `index.html` im selben Verzeichnis mit dem folgenden Code:
## Javascript-Code
Wenn Sie beim Überprüfen des Inhalts der `index.android.bundle` den JavaScript-Code der Anwendung finden (auch wenn er minifiziert ist), können Sie **ihn analysieren, um sensible Informationen und Schwachstellen zu finden**.
Da das Bundle tatsächlich den gesamten JS-Code der Anwendung enthält, ist es möglich, **ihn in verschiedene Dateien zu unterteilen** (was die Rückentwicklung potenziell erleichtert) mit dem **Tool [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Um den JavaScript-Code weiter zu analysieren, können Sie die Datei auf [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) hochladen oder diese Schritte befolgen:
1. Erstellen Sie eine Datei namens `index.html` im selben Verzeichnis mit dem folgenden Code:
```html
<script src="./index.android.bundle"></script>
```
Sie können die Datei auf [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) hochladen oder diese Schritte befolgen:
2. Öffnen Sie die `index.html`-Datei in Google Chrome.
1. Öffnen Sie die `index.html`-Datei in Google Chrome.
3. Öffnen Sie die Entwicklertools, indem Sie **Command+Option+J für OS X** oder **Control+Shift+J für Windows** drücken.
2. Öffnen Sie die Entwicklertools, indem Sie **Command+Option+J für OS X** oder **Control+Shift+J für Windows** drücken.
3. Klicken Sie auf "Sources" in den Entwicklertools. Sie sollten eine JavaScript-Datei sehen, die in Ordner und Dateien unterteilt ist und das Hauptbündel bildet.
4. Klicken Sie im Entwicklertool auf "Sources". Sie sollten eine JavaScript-Datei sehen, die in Ordner und Dateien unterteilt ist und das Hauptbündel bildet.
Wenn Sie eine Datei namens `index.android.bundle.map` finden, können Sie den Quellcode in einem unminifizierten Format analysieren. Map-Dateien enthalten Quellzuordnungen, die es Ihnen ermöglichen, minifizierte Bezeichner zuzuordnen.
@ -32,8 +40,42 @@ Um nach sensiblen Anmeldeinformationen und Endpunkten zu suchen, befolgen Sie di
3. Es war günstig, dass während des Recon-Prozesses sensible hartcodierte Anmeldeinformationen im JavaScript-Code gefunden wurden.
### Ändern Sie den JS-Code und bauen Sie neu
In diesem Fall ist es einfach, den Code zu ändern. Sie müssen die App nur umbenennen, um die Erweiterung `.zip` zu verwenden, und sie extrahieren. Dann können Sie **den JS-Code innerhalb dieses Bündels ändern und die App neu bauen**. Das sollte ausreichen, um Ihnen zu ermöglichen, **Code** in die App zu **injizieren** zu Testzwecken.
## Hermes-Bytecode
Wenn das Bündel **Hermes-Bytecode** enthält, **werden Sie nicht auf den JavaScript-Code** der App zugreifen können (nicht einmal auf die minifizierte Version).
Sie können überprüfen, ob das Bündel Hermes-Bytecode enthält, indem Sie den folgenden Befehl ausführen:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Sie können jedoch die Tools **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** oder **[hermes_rs](https://github.com/Pilfer/hermes_rs)** verwenden, um **den Bytecode zu disassemblieren** und auch um **ihn in einen Pseudo-JS-Code zu dekompilieren**. Dazu beispielsweise diese Befehle:
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Code ändern und neu erstellen
Idealerweise sollten Sie in der Lage sein, den disassemblierten Code zu ändern (einen Vergleich, einen Wert oder was auch immer Sie ändern müssen) und dann **den Bytecode neu zu erstellen** und anschließend die App neu zu erstellen.
Das Tool **[hbctool](https://github.com/bongtrop/hbctool)** unterstützt das Disassemblieren des Bundles und das Wiederherstellen nach den Änderungen, jedoch **unterstützt es nur alte Versionen** des Hermes-Bytecodes.
Das Tool **[hermes-dec](https://github.com/P1sec/hermes-dec)** unterstützt nicht das Neuaufbauen des Bytecodes.
Das Tool **[hermes_rs](https://github.com/Pilfer/hermes_rs)** unterstützt das Neuaufbauen des Bytecodes, ist jedoch tatsächlich eine Bibliothek und kein CLI-Tool.
## Dynamische Analyse
Sie könnten versuchen, die App dynamisch zu analysieren, indem Sie Frida verwenden, um den Entwicklermodus der React-App zu aktivieren und **`react-native-debugger`** daran anzuhängen. Allerdings benötigen Sie dafür anscheinend den Quellcode der App. Weitere Informationen dazu finden Sie unter [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## Referenzen
- [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

@ -4,13 +4,15 @@
## **Grundinformationen**
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **über einer Opferanwendung positioniert**. Sobald sie die Opfer-App sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opfer-App weiterleitet.\
In der Tat **blindet es den Benutzer, sodass er nicht weiß, dass er tatsächlich Aktionen auf der Opfer-App ausführt**.
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **oberhalb einer Opferanwendung positioniert**. Sobald sie die Opfer-App sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opfer-App weiterleitet.\
In der Tat **blindet es den Benutzer, sodass er nicht weiß, dass er tatsächlich Aktionen in der Opfer-App ausführt**.
### Erkennung
Um Apps zu erkennen, die anfällig für diesen Angriff sind, sollten Sie nach **exportierten Aktivitäten** im Android-Manifest suchen (beachten Sie, dass eine Aktivität mit einem Intent-Filter standardmäßig automatisch exportiert wird). Sobald Sie die exportierten Aktivitäten gefunden haben, **prüfen Sie, ob sie Berechtigungen benötigen**. Dies liegt daran, dass die **bösartige Anwendung auch diese Berechtigung benötigt**.
Sie können auch die minimale SDK-Version der App überprüfen, indem Sie den Wert von **`android:minSdkVersion`** in der **`AndroidManifest.xml`**-Datei überprüfen. Wenn der Wert **unter 30** liegt, ist die App anfällig für Tapjacking.
### Schutz
#### Android 12 (API 31,32) und höher
@ -23,7 +25,7 @@ Wenn **`android:filterTouchesWhenObscured`** auf **`true`** gesetzt ist, erhält
#### **`setFilterTouchesWhenObscured`**
Das Attribut **`setFilterTouchesWhenObscured`**, das auf true gesetzt ist, kann auch die Ausnutzung dieser Schwachstelle verhindern, wenn die Android-Version niedriger ist.\
Das Attribut **`setFilterTouchesWhenObscured`** kann ebenfalls verhindern, dass diese Schwachstelle ausgenutzt wird, wenn die Android-Version niedriger ist.\
Wenn es auf **`true`** gesetzt ist, kann beispielsweise ein Button automatisch **deaktiviert werden, wenn er verdeckt ist**:
```xml
<Button android:text="Button"
@ -48,15 +50,15 @@ Ein Beispielprojekt, das **FloatingWindowApp** implementiert, welches verwendet
### Qark
> [!CAUTION]
> Es scheint, dass dieses Projekt jetzt nicht mehr gewartet wird und diese Funktionalität nicht mehr richtig funktioniert
> Es scheint, dass dieses Projekt jetzt nicht mehr gewartet wird und diese Funktionalität nicht mehr richtig funktioniert.
Sie können [**qark**](https://github.com/linkedin/qark) mit den Parametern `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` verwenden, um eine bösartige Anwendung zu erstellen, um mögliche **Tapjacking**-Schwachstellen zu testen.\
Die Minderung ist relativ einfach, da der Entwickler wählen kann, ob er keine Touch-Ereignisse empfangen möchte, wenn eine Ansicht von einer anderen überdeckt wird. Mit dem [Android Developers Reference](https://developer.android.com/reference/android/view/View#security):
> Manchmal ist es unerlässlich, dass eine Anwendung überprüfen kann, dass eine Aktion mit vollem Wissen und Einverständnis des Benutzers durchgeführt wird, wie z.B. das Gewähren einer Berechtigungsanfrage, das Tätigen eines Kaufs oder das Klicken auf eine Werbung. Leider könnte eine bösartige Anwendung versuchen, den Benutzer zu täuschen, diese Aktionen unwissentlich auszuführen, indem sie den beabsichtigten Zweck der Ansicht verbirgt. Als Abhilfe bietet das Framework einen Touch-Filtermechanismus, der verwendet werden kann, um die Sicherheit von Ansichten zu verbessern, die Zugang zu sensibler Funktionalität bieten.
> Manchmal ist es wichtig, dass eine Anwendung überprüfen kann, dass eine Aktion mit vollem Wissen und Einverständnis des Benutzers durchgeführt wird, wie z.B. das Gewähren einer Berechtigungsanfrage, das Tätigen eines Kaufs oder das Klicken auf eine Werbung. Leider könnte eine bösartige Anwendung versuchen, den Benutzer zu täuschen, diese Aktionen unwissentlich auszuführen, indem sie den beabsichtigten Zweck der Ansicht verbirgt. Als Abhilfe bietet das Framework einen Touch-Filtermechanismus, der verwendet werden kann, um die Sicherheit von Ansichten zu verbessern, die Zugriff auf sensible Funktionen bieten.
>
> Um die Touch-Filterung zu aktivieren, rufen Sie [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) auf oder setzen Sie das Layoutattribut android:filterTouchesWhenObscured auf true. Wenn aktiviert, wird das Framework Berührungen verwerfen, die empfangen werden, wenn das Fenster der Ansicht von einem anderen sichtbaren Fenster überdeckt wird. Infolgedessen erhält die Ansicht keine Berührungen, wenn ein Toast, Dialog oder ein anderes Fenster über dem Fenster der Ansicht erscheint.
> Um die Touch-Filterung zu aktivieren, rufen Sie [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) auf oder setzen Sie das Layoutattribut android:filterTouchesWhenObscured auf true. Wenn aktiviert, wird das Framework Berührungen ignorieren, die empfangen werden, wenn das Fenster der Ansicht von einem anderen sichtbaren Fenster überdeckt wird. Infolgedessen erhält die Ansicht keine Berührungen, wenn ein Toast, Dialog oder ein anderes Fenster über dem Fenster der Ansicht erscheint.
{{#include ../../banners/hacktricks-training.md}}

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 -->