hacktricks/mobile-pentesting/android-app-pentesting/android-applications-basics.md

401 lines
32 KiB
Markdown
Raw Normal View History

2024-02-10 15:36:32 +00:00
# Grundlagen von Android-Anwendungen
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie das Hacken von AWS von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-01-05 11:02:33 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegramm-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>
2023-09-02 23:51:32 +00:00
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
2022-10-27 23:22:18 +00:00
2024-02-10 15:36:32 +00:00
Finden Sie die wichtigsten Sicherheitslücken, damit Sie sie schneller beheben können. Intruder verfolgt Ihre Angriffsfläche, führt proaktive Bedrohungsscans durch und findet Probleme in Ihrer gesamten Technologie-Stack, von APIs über Webanwendungen bis hin zu Cloud-Systemen. [**Probieren Sie es noch heute kostenlos aus**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks).
2023-02-27 09:28:45 +00:00
2023-09-02 23:48:41 +00:00
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
2023-02-27 09:28:45 +00:00
2023-09-02 23:48:41 +00:00
***
2022-10-27 23:22:18 +00:00
2024-02-10 15:36:32 +00:00
## Android-Sicherheitsmodell
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
**Es gibt zwei Ebenen:**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
* Das **Betriebssystem**, das installierte Anwendungen voneinander isoliert.
* Die **Anwendung selbst**, die Entwicklern ermöglicht, bestimmte Funktionen freizugeben und Anwendungsfunktionen zu konfigurieren.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### UID-Trennung
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
**Jede Anwendung erhält eine bestimmte Benutzer-ID**. Dies geschieht während der Installation der App, damit die App nur mit Dateien interagieren kann, die ihrer Benutzer-ID gehören oder gemeinsam genutzte Dateien. Daher können nur die App selbst, bestimmte Komponenten des Betriebssystems und der Root-Benutzer auf die App-Daten zugreifen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### UID-Sharing
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
**Zwei Anwendungen können so konfiguriert werden, dass sie dieselbe UID verwenden**. Dies kann nützlich sein, um Informationen zu teilen, aber wenn eine davon kompromittiert ist, werden die Daten beider Anwendungen kompromittiert. Aus diesem Grund wird dieses Verhalten **nicht empfohlen**.\
**Um dieselbe UID zu teilen, müssen Anwendungen denselben `android:sharedUserId`-Wert in ihren Manifesten definieren.**
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
### Sandboxing
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Die **Android Application Sandbox** ermöglicht das Ausführen **jeder Anwendung** als **eigenständiger Prozess unter einer separaten Benutzer-ID**. Jeder Prozess hat seine eigene virtuelle Maschine, sodass der Code einer App isoliert von anderen Apps ausgeführt wird.\
Ab Android 5.0(L) wird **SELinux** durchgesetzt. Grundsätzlich verweigert SELinux alle Prozessinteraktionen und erstellt dann Richtlinien, um **nur die erwarteten Interaktionen zwischen ihnen zuzulassen**.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Berechtigungen
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Wenn Sie eine **App installieren und sie um Berechtigungen bitten**, fragt die App nach den in den **`uses-permission`**-Elementen in der **AndroidManifest.xml**-Datei konfigurierten Berechtigungen. Das **uses-permission**-Element gibt den Namen der angeforderten Berechtigung im **name**-Attribut an. Es hat auch das **maxSdkVersion**-Attribut, das das Bitten um Berechtigungen in Versionen höher als der angegebenen stoppt.\
Beachten Sie, dass Android-Anwendungen nicht alle Berechtigungen von Anfang an beantragen müssen, sie können auch **dynamisch Berechtigungen beantragen**, aber alle Berechtigungen müssen im Manifest **deklariert** sein.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Wenn eine App Funktionen freigibt, kann sie den **Zugriff nur auf Apps beschränken, die über eine bestimmte Berechtigung verfügen**.\
Ein Berechtigungselement hat drei Attribute:
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
* Der **Name** der Berechtigung
* Das **permission-group**-Attribut, das das Gruppieren verwandter Berechtigungen ermöglicht.
* Das **protection-level**, das angibt, wie die Berechtigungen gewährt werden. Es gibt vier Arten:
* **Normal**: Wird verwendet, wenn für die App **keine bekannten Bedrohungen** bestehen. Der Benutzer muss sie **nicht genehmigen**.
* **Gefährlich**: Gibt an, dass die Berechtigung der anfordernden Anwendung einen **erhöhten Zugriff** gewährt. **Benutzer werden aufgefordert, sie zu genehmigen**.
* **Signature**: Nur **Apps, die mit demselben Zertifikat wie das exportierende** Komponente signiert sind, können Berechtigungen erhalten. Dies ist die stärkste Art des Schutzes.
* **SignatureOrSystem**: Nur **Apps, die mit demselben Zertifikat wie das exportierende** Komponente signiert sind oder **Apps, die mit Systemzugriff ausgeführt werden**, können Berechtigungen erhalten.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
## Vorinstallierte Anwendungen
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Diese Apps befinden sich in der Regel in den Verzeichnissen **`/system/app`** oder **`/system/priv-app`** und einige von ihnen sind **optimiert** (möglicherweise finden Sie nicht einmal die Datei `classes.dex`). Diese Anwendungen sind es wert, überprüft zu werden, da sie manchmal mit zu vielen Berechtigungen (als Root) ausgeführt werden.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
* Diejenigen, die mit dem **AOSP** (Android OpenSource Project) **ROM** ausgeliefert werden
* Hinzugefügt vom Gerätehersteller
* Hinzugefügt vom Mobilfunkanbieter (wenn vom Anbieter gekauft)
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
## Rooting
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Um Root-Zugriff auf ein physisches Android-Gerät zu erhalten, müssen Sie in der Regel 1 oder 2 **Schwachstellen ausnutzen**, die normalerweise **spezifisch** für das **Gerät** und die **Version** sind.\
Sobald der Exploit funktioniert hat, wird normalerweise das Linux `su`-Binär in einen Ort kopiert, der in der PATH-Umgebungsvariable des Benutzers angegeben ist, z. B. `/system/xbin`.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Sobald das su-Binär konfiguriert ist, wird eine andere Android-App verwendet, um mit dem `su`-Binär zu kommunizieren und **Anfragen für Root-Zugriff zu verarbeiten**, wie z. B. **Superuser** und **SuperSU** (im Google Play Store erhältlich).
2021-04-21 14:06:28 +00:00
{% hint style="danger" %}
2024-02-10 15:36:32 +00:00
Beachten Sie, dass der Rooting-Prozess sehr gefährlich ist und das Gerät schwer beschädigen kann.
2021-04-21 14:06:28 +00:00
{% endhint %}
2022-05-01 13:25:53 +00:00
### ROMs
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Es ist möglich, das Betriebssystem durch Installation einer benutzerdefinierten Firmware zu **ersetzen**. Dadurch kann die Nützlichkeit eines alten Geräts erweitert, Softwarebeschränkungen umgangen oder Zugriff auf den neuesten Android-Code erhalten werden.\
**OmniROM** und **LineageOS** sind zwei der beliebtesten Firmware-Versionen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Beachten Sie, dass **nicht immer eine Root-Berechtigung erforderlich ist**, um eine benutzerdefinierte Firmware zu installieren. **Einige Hersteller erlauben** das Entsperren ihrer Bootloader auf dokumentierte und sichere Weise.
### Auswirkungen
Sobald ein Gerät gerootet ist, kann jede App Zugriff als Root anfordern. Wenn eine bösartige Anwendung dies erhält, hat sie Zugriff auf fast alles und kann das Telefon beschädigen.
## Grundlagen von Android-Anwendungen <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- Das Format von Android-Anwendungen wird als _APK-Dateiformat_ bezeichnet. Es handelt sich im Wesentlichen um eine **ZIP-Datei** (durch Umbenennen der Dateierweiterung in .zip können die Inhalte extrahiert und angezeigt werden).
- APK-Inhalte (nicht abschließend)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
- resources.arsc: enthält vorkompilierte Ressour
2022-05-01 13:25:53 +00:00
### **Dalvik & Smali**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
In der Android-Entwicklung werden **Java oder Kotlin** zur Erstellung von Apps verwendet. Anstelle des JVM wie bei Desktop-Apps kompiliert Android diesen Code in **Dalvik Executable (DEX) Bytecode**. Früher wurde dies vom Dalvik-Virtual-Machine-Bytecode behandelt, aber jetzt übernimmt die Android Runtime (ART) in neueren Android-Versionen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Für Reverse Engineering wird **Smali** entscheidend. Es ist die menschenlesbare Version des DEX-Bytecodes und fungiert wie eine Assemblersprache, indem es den Quellcode in Bytecode-Anweisungen übersetzt. Smali und baksmali beziehen sich in diesem Zusammenhang auf die Assembly- und Disassembly-Tools.
2024-02-08 03:06:37 +00:00
***
2021-04-21 14:06:28 +00:00
2023-09-02 23:51:32 +00:00
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
2023-02-27 09:28:45 +00:00
2024-02-10 15:36:32 +00:00
Finden Sie die wichtigsten Schwachstellen, damit Sie sie schneller beheben können. Intruder verfolgt Ihre Angriffsfläche, führt proaktive Bedrohungsscans durch und findet Probleme in Ihrer gesamten Technologie-Stack, von APIs über Web-Apps bis hin zu Cloud-Systemen. [**Probieren Sie es noch heute kostenlos aus**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks).
2023-02-27 09:28:45 +00:00
2023-09-02 23:48:41 +00:00
***
2022-10-27 23:22:18 +00:00
2022-05-01 13:25:53 +00:00
## Intents
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Intents sind das Hauptmittel, mit dem Android-Apps zwischen ihren Komponenten oder mit anderen Apps kommunizieren. Diese Nachrichtenobjekte können auch Daten zwischen Apps oder Komponenten transportieren, ähnlich wie GET/POST-Anfragen in der HTTP-Kommunikation verwendet werden.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Ein Intent ist also eine **Nachricht, die zwischen Komponenten übermittelt wird**. Intents **können an bestimmte Komponenten oder Apps gerichtet werden**, **oder ohne einen bestimmten Empfänger gesendet werden**.\
Um es einfach auszudrücken, kann ein Intent verwendet werden:
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
* Um eine Aktivität zu starten, normalerweise um eine Benutzeroberfläche für eine App zu öffnen
* Als Broadcasts, um das System und Apps über Änderungen zu informieren
* Um einen Hintergrunddienst zu starten, zu stoppen und mit ihm zu kommunizieren
* Um auf Daten über ContentProvider zuzugreifen
* Als Rückrufe, um Ereignisse zu behandeln
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Wenn sie anfällig sind, **können Intents für verschiedene Angriffe verwendet werden**.
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
### Intent-Filter
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
**Intent-Filter** definieren **wie eine Aktivität, ein Dienst oder ein Broadcast Receiver mit verschiedenen Arten von Intents interagieren kann**. Sie beschreiben im Wesentlichen die Fähigkeiten dieser Komponenten, wie z.B. welche Aktionen sie ausführen können oder welche Arten von Broadcasts sie verarbeiten können. Der primäre Ort, um diese Filter zu deklarieren, ist die **AndroidManifest.xml-Datei**, obwohl sie auch für Broadcast Receiver codiert werden können.
2024-02-08 03:06:37 +00:00
2024-02-10 15:36:32 +00:00
Intent-Filter bestehen aus Kategorien, Aktionen und Datenfiltern, mit der Möglichkeit, zusätzliche Metadaten einzuschließen. Diese Einrichtung ermöglicht es Komponenten, spezifische Intents zu verarbeiten, die den deklarierten Kriterien entsprechen.
2024-02-08 03:06:37 +00:00
2024-02-10 15:36:32 +00:00
Ein wesentlicher Aspekt von Android-Komponenten (Aktivitäten/Dienste/Content Provider/Broadcast Receiver) ist ihre Sichtbarkeit oder **öffentlicher Status**. Eine Komponente gilt als öffentlich und kann mit anderen Apps interagieren, wenn sie mit einem Wert von **`true`** als **`exported`** markiert ist oder wenn für sie ein Intent-Filter im Manifest deklariert ist. Es gibt jedoch eine Möglichkeit für Entwickler, diese Komponenten explizit privat zu halten, um sicherzustellen, dass sie nicht unbeabsichtigt mit anderen Apps interagieren. Dies wird erreicht, indem das Attribut **`exported`** in ihren Manifestdefinitionen auf **`false`** gesetzt wird.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Darüber hinaus haben Entwickler die Möglichkeit, den Zugriff auf diese Komponenten weiter abzusichern, indem sie bestimmte Berechtigungen verlangen. Das Attribut **`permission`** kann festgelegt werden, um durchzusetzen, dass nur Apps mit der festgelegten Berechtigung auf die Komponente zugreifen können. Dadurch wird eine zusätzliche Sicherheitsebene und Kontrolle darüber hinzugefügt, wer mit ihr interagieren kann.
2024-02-08 03:06:37 +00:00
```java
<activity android:name=".MyActivity" android:exported="false">
2024-02-10 15:36:32 +00:00
<!-- Intent filters go here -->
2024-02-08 03:06:37 +00:00
</activity>
```
2024-02-10 15:36:32 +00:00
### Implizite Intents
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Intents werden programmatisch mithilfe eines Intent-Konstruktors erstellt:
2021-04-21 15:06:12 +00:00
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
2024-02-10 15:36:32 +00:00
Die **Aktion** des zuvor deklarierten Intents ist **ACTION\_SEND** und das **Extra** ist eine mailto-**Uri** (das Extra ist die zusätzliche Information, die der Intent erwartet).
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Dieser Intent sollte im Manifest wie im folgenden Beispiel deklariert werden:
2024-02-08 03:06:37 +00:00
```xml
2021-04-21 15:06:12 +00:00
<activity android:name="ShareActivity">
2024-02-10 15:36:32 +00:00
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
2021-04-21 15:06:12 +00:00
</activity>
2021-04-21 14:06:28 +00:00
```
2024-02-10 15:36:32 +00:00
Ein Intent-Filter muss mit der **Aktion**, **Daten** und **Kategorie** übereinstimmen, um eine Nachricht zu empfangen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Der "Intent-Auflösungsprozess" bestimmt, welche App jede Nachricht erhalten soll. Dieser Prozess berücksichtigt das **Prioritätsattribut**, das in der **Intent-Filter-Deklaration** festgelegt werden kann, und **diejenige mit der höheren Priorität wird ausgewählt**. Diese Priorität kann zwischen -1000 und 1000 festgelegt werden und Anwendungen können den Wert `SYSTEM_HIGH_PRIORITY` verwenden. Wenn ein **Konflikt** auftritt, erscheint ein "Chooser"-Fenster, damit der **Benutzer entscheiden kann**.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Explizite Intents
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Ein expliziter Intent gibt den Klassennamen an, auf den er abzielt:
2021-04-21 15:06:12 +00:00
```java
Intent downloadIntent = new (this, DownloadService.class):
```
2024-02-10 15:36:32 +00:00
In anderen Anwendungen können Sie auf den zuvor deklarierten Intent zugreifen, indem Sie Folgendes verwenden:
2021-04-21 15:06:12 +00:00
```java
Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName");
context.startService(intent);
```
2024-02-10 15:36:32 +00:00
### Ausstehende Absichten
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Diese ermöglichen es anderen Anwendungen, im Namen Ihrer Anwendung Aktionen auszuführen, unter Verwendung der Identität und Berechtigungen Ihrer App. Beim Erstellen einer ausstehenden Absicht muss eine Absicht und die auszuführende Aktion angegeben werden. Wenn die deklarierte Absicht nicht explizit ist (nicht angibt, welche Absicht sie aufrufen kann), kann eine bösartige Anwendung die deklarierte Aktion im Namen der Opfer-App ausführen. Darüber hinaus, wenn keine Aktion angegeben ist, kann die bösartige App beliebige Aktionen im Namen des Opfers ausführen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Broadcast-Absichten
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Im Gegensatz zu den vorherigen Absichten, die nur von einer App empfangen werden, können Broadcast-Absichten von mehreren Apps empfangen werden. Ab API-Version 14 ist es möglich, die App anzugeben, die die Nachricht erhalten soll, indem Intent.setPackage verwendet wird.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Alternativ ist es auch möglich, beim Senden des Broadcasts eine Berechtigung anzugeben. Die Empfänger-App muss über diese Berechtigung verfügen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Es gibt zwei Arten von Broadcasts: Normal (asynchron) und Ordered (synchron). Die Reihenfolge basiert auf der konfigurierten Priorität innerhalb des Empfängerelements. Jede App kann den Broadcast verarbeiten, weiterleiten oder verwerfen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Es ist möglich, einen Broadcast mithilfe der Funktion `sendBroadcast(intent, receiverPermission)` aus der Klasse `Context` zu senden. Sie können auch die Funktion `sendBroadcast` aus dem `LocalBroadCastManager` verwenden, um sicherzustellen, dass die Nachricht die App nie verlässt. Dadurch müssen Sie nicht einmal einen Empfänger exportieren.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Sticky-Broadcasts
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Diese Art von Broadcasts kann lange nach dem Senden darauf zugegriffen werden. Sie wurden in der API-Ebene 21 veraltet und es wird empfohlen, sie nicht zu verwenden. Sie ermöglichen es jeder Anwendung, die Daten abzufangen, aber auch zu ändern.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Wenn Sie Funktionen finden, die das Wort "sticky" enthalten, wie `sendStickyBroadcast` oder `sendStickyBroadcastAsUser`, überprüfen Sie die Auswirkungen und versuchen Sie, sie zu entfernen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
## Deep Links / URL-Schemas
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
In Android-Anwendungen werden Deep Links verwendet, um eine Aktion (Intent) direkt über eine URL zu initiieren. Dies geschieht durch Deklarieren eines spezifischen URL-Schemas innerhalb einer Aktivität. Wenn ein Android-Gerät versucht, auf eine URL mit diesem Schema zuzugreifen, wird die angegebene Aktivität innerhalb der Anwendung gestartet.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Das Schema muss in der Datei `AndroidManifest.xml` deklariert werden:
2024-02-08 03:06:37 +00:00
```xml
[...]
<activity android:name=".MyActivity">
2024-02-10 15:36:32 +00:00
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="examplescheme" />
</intent-filter>
2024-02-08 03:06:37 +00:00
[...]
```
2024-02-10 15:36:32 +00:00
Das Schema aus dem vorherigen Beispiel ist `exampleapp://` (beachte auch die **`Kategorie BROWSABLE`**)
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Dann kannst du im Datenfeld den **Host** und **Pfad** angeben:
2024-02-08 03:06:37 +00:00
```xml
2024-02-10 15:36:32 +00:00
<data android:scheme="examplescheme"
android:host="example"
2024-02-08 03:06:37 +00:00
/>
```
2024-02-10 15:36:32 +00:00
Um darauf von einer Webseite aus zuzugreifen, ist es möglich, einen Link wie folgt einzurichten:
2024-02-08 03:06:37 +00:00
```xml
<a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
2021-04-21 14:06:28 +00:00
```
2024-02-10 15:36:32 +00:00
Um den **Code, der in der App ausgeführt wird**, zu finden, gehe zur Aktivität, die durch den Deeplink aufgerufen wird, und suche nach der Funktion **`onNewIntent`**.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Erfahre, wie man [Deeplinks aufruft, ohne HTML-Seiten zu verwenden](./#exploiting-schemes-deep-links).
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
## AIDL - Android Interface Definition Language
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Die **Android Interface Definition Language (AIDL)** wurde entwickelt, um die Kommunikation zwischen Client und Service in Android-Anwendungen durch **Interprozesskommunikation** (IPC) zu erleichtern. Da der direkte Zugriff auf den Speicher eines anderen Prozesses auf Android nicht erlaubt ist, vereinfacht AIDL den Prozess, indem es Objekte in ein vom Betriebssystem verstandenes Format umwandelt und so die Kommunikation zwischen verschiedenen Prozessen erleichtert.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Schlüsselkonzepte
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- **Bound Services**: Diese Services nutzen AIDL für IPC und ermöglichen es Aktivitäten oder Komponenten, sich an einen Service zu binden, Anfragen zu stellen und Antworten zu erhalten. Die Methode `onBind` in der Klasse des Services ist entscheidend für die Initiierung der Interaktion und stellt daher einen wichtigen Bereich für die Sicherheitsüberprüfung auf Schwachstellen dar.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- **Messenger**: Als gebundener Service ermöglicht Messenger IPC mit dem Schwerpunkt auf der Verarbeitung von Daten durch die `onBind`-Methode. Es ist wichtig, diese Methode genau auf unsichere Datenverarbeitung oder die Ausführung sensibler Funktionen zu überprüfen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- **Binder**: Obwohl die direkte Verwendung der Binder-Klasse aufgrund der Abstraktion von AIDL weniger häufig vorkommt, ist es hilfreich zu verstehen, dass Binder als Kernel-Treiber fungiert, der den Datentransfer zwischen den Speicherbereichen verschiedener Prozesse ermöglicht. Für ein besseres Verständnis steht eine Ressource unter [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) zur Verfügung.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
## Komponenten
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Diese umfassen: **Aktivitäten, Services, Broadcast Receiver und Provider.**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### Launcher-Aktivität und andere Aktivitäten
2021-04-21 15:06:12 +00:00
2024-02-10 15:36:32 +00:00
In Android-Apps sind **Aktivitäten** wie Bildschirme, die verschiedene Teile der Benutzeroberfläche der App anzeigen. Eine App kann viele Aktivitäten haben, von denen jede einen einzigartigen Bildschirm für den Benutzer darstellt.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Die **Launcher-Aktivität** ist das Haupttor zu einer App und wird gestartet, wenn Sie auf das Symbol der App tippen. Sie wird in der Manifestdatei der App mit spezifischen MAIN- und LAUNCHER-Intents definiert:
2021-04-21 14:06:28 +00:00
```markup
2021-04-21 15:06:12 +00:00
<activity android:name=".LauncherActivity">
2024-02-10 15:36:32 +00:00
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
2021-04-21 14:06:28 +00:00
</activity>
```
2024-02-10 15:36:32 +00:00
Nicht alle Apps benötigen eine Startaktivität, insbesondere solche ohne Benutzeroberfläche wie Hintergrunddienste.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Aktivitäten können für andere Apps oder Prozesse verfügbar gemacht werden, indem sie im Manifest als "exportiert" markiert werden. Diese Einstellung ermöglicht es anderen Apps, diese Aktivität zu starten:
2024-02-08 03:06:37 +00:00
```markdown
2021-04-21 15:06:12 +00:00
<service android:name=".ExampleExportedService" android:exported="true"/>
```
2024-02-10 15:36:32 +00:00
Jedoch ist der Zugriff auf eine Aktivität von einer anderen App nicht immer ein Sicherheitsrisiko. Die Bedenken entstehen, wenn sensible Daten unsachgemäß geteilt werden, was zu Informationslecks führen könnte.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Der Lebenszyklus einer Aktivität **beginnt mit der onCreate-Methode**, die die Benutzeroberfläche einrichtet und die Aktivität auf die Interaktion mit dem Benutzer vorbereitet.
2021-04-22 12:26:30 +00:00
2024-02-10 15:36:32 +00:00
### Anwendungssubklasse
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Bei der Android-Entwicklung hat eine App die Möglichkeit, eine **Unterklasse** der [Application](https://developer.android.com/reference/android/app/Application)-Klasse zu erstellen, obwohl dies nicht obligatorisch ist. Wenn eine solche Unterklasse definiert ist, wird sie als erste Klasse innerhalb der App instanziiert. Die Methode **`attachBaseContext`**, wenn sie in dieser Unterklasse implementiert ist, wird vor der **`onCreate`**-Methode ausgeführt. Diese Einrichtung ermöglicht eine frühe Initialisierung, bevor der Rest der Anwendung startet.
2024-02-08 03:06:37 +00:00
```java
public class MyApp extends Application {
2024-02-10 15:36:32 +00:00
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// Initialization code here
2024-02-08 03:06:37 +00:00
}
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
@Override
public void onCreate() {
super.onCreate();
// More initialization code
}
}
```
### Dienste
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
[Dienste](https://developer.android.com/guide/components/services) sind **Hintergrundoperationen**, die in der Lage sind, Aufgaben ohne Benutzeroberfläche auszuführen. Diese Aufgaben können auch dann weiterlaufen, wenn Benutzer zu anderen Anwendungen wechseln, wodurch Dienste für **lang andauernde Operationen** unerlässlich sind.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Dienste sind vielseitig einsetzbar; sie können auf verschiedene Arten gestartet werden, wobei **Intents** die primäre Methode zum Starten als Einstiegspunkt einer Anwendung sind. Sobald ein Dienst mit der Methode `startService` gestartet wird, wird seine Methode `onStart` aktiviert und läuft weiter, bis die Methode `stopService` explizit aufgerufen wird. Alternativ, wenn die Rolle eines Dienstes von einer aktiven Client-Verbindung abhängt, wird die Methode `bindService` verwendet, um den Client an den Dienst zu binden und die Methode `onBind` für den Datenaustausch zu nutzen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Eine interessante Anwendung von Diensten umfasst das Abspielen von Hintergrundmusik oder das Abrufen von Netzwerkdaten, ohne die Interaktion des Benutzers mit einer App zu beeinträchtigen. Darüber hinaus können Dienste für andere Prozesse auf demselben Gerät über **Exportieren** zugänglich gemacht werden. Dies ist nicht das Standardverhalten und erfordert eine explizite Konfiguration in der Android Manifest-Datei:
2024-02-08 03:06:37 +00:00
```xml
2021-04-21 15:06:12 +00:00
<service android:name=".ExampleExportedService" android:exported="true"/>
```
2024-02-10 15:36:32 +00:00
### Broadcast Receiver
2021-04-21 15:06:12 +00:00
2024-02-10 15:36:32 +00:00
**Broadcast Receiver** fungieren als Zuhörer in einem Messaging-System und ermöglichen es mehreren Anwendungen, auf dieselben Nachrichten vom System zu reagieren. Eine App kann einen Empfänger auf zwei Hauptarten **registrieren**: über das **Manifest** der App oder **dynamisch** im Code der App über die **`registerReceiver`** API. Im Manifest werden Broadcasts mit Berechtigungen gefiltert, während bei dynamisch registrierten Empfängern Berechtigungen auch bei der Registrierung angegeben werden können.
2021-04-21 15:06:12 +00:00
2024-02-10 15:36:32 +00:00
**Intent-Filter** sind in beiden Registrierungsmethoden entscheidend und bestimmen, welche Broadcasts den Empfänger auslösen. Sobald ein passender Broadcast gesendet wird, wird die Methode **`onReceive`** des Empfängers aufgerufen, sodass die App entsprechend reagieren kann, z. B. das Verhalten anpassen, um auf eine niedrige Akkuanzeige zu reagieren.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Broadcasts können entweder **asynchron** sein und alle Empfänger ohne Reihenfolge erreichen oder **synchron**, bei denen Empfänger den Broadcast basierend auf festgelegten Prioritäten erhalten. Es ist jedoch wichtig zu beachten, dass hier ein potenzielles Sicherheitsrisiko besteht, da jede App sich selbst priorisieren kann, um einen Broadcast abzufangen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Um die Funktionalität eines Empfängers zu verstehen, suchen Sie nach der Methode **`onReceive`** innerhalb seiner Klasse. Der Code dieser Methode kann das empfangene Intent manipulieren, was die Notwendigkeit der Datenvalidierung durch Empfänger hervorhebt, insbesondere bei **geordneten Broadcasts**, die das Intent ändern oder verwerfen können.
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
### Content Provider
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
**Content Provider** sind für das **Teilen strukturierter Daten** zwischen Apps unerlässlich und betonen die Bedeutung der Implementierung von **Berechtigungen**, um die Datensicherheit zu gewährleisten. Sie ermöglichen Apps den Zugriff auf Daten aus verschiedenen Quellen, einschließlich Datenbanken, Dateisystemen oder dem Web. Spezifische Berechtigungen wie **`readPermission`** und **`writePermission`** sind entscheidend für die Kontrolle des Zugriffs. Darüber hinaus kann über die Einstellungen **`grantUriPermission`** im Manifest der App ein temporärer Zugriff gewährt werden, wobei Attribute wie `path`, `pathPrefix` und `pathPattern` für eine detaillierte Zugriffskontrolle genutzt werden.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Die Eingabevalidierung ist entscheidend, um Sicherheitslücken wie SQL-Injection zu verhindern. Content Provider unterstützen grundlegende Operationen wie `insert()`, `update()`, `delete()` und `query()`, die die Manipulation und den Austausch von Daten zwischen Anwendungen erleichtern.
2021-04-21 15:42:02 +00:00
2024-02-10 15:36:32 +00:00
**FileProvider**, ein spezialisierter Content Provider, konzentriert sich auf das sichere Teilen von Dateien. Er wird im Manifest der App mit spezifischen Attributen definiert, um den Zugriff auf Ordner zu kontrollieren, die durch `android:exported` und `android:resource` auf Ordnerkonfigurationen verweisen. Es wird empfohlen, Vorsicht walten zu lassen, wenn Verzeichnisse freigegeben werden, um versehentlich sensible Daten preiszugeben.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Beispielhafte Manifestdeklaration für FileProvider:
2024-02-08 03:06:37 +00:00
```xml
2021-04-21 15:06:12 +00:00
<provider android:name="androidx.core.content.FileProvider"
2024-02-10 15:36:32 +00:00
android:authorities="com.example.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
2021-04-21 15:06:12 +00:00
</provider>
```
2024-02-10 15:36:32 +00:00
Und ein Beispiel für die Angabe von freigegebenen Ordnern in `filepaths.xml`:
2024-02-08 03:06:37 +00:00
```xml
2021-04-21 15:06:12 +00:00
<paths>
2024-02-10 15:36:32 +00:00
<files-path path="images/" name="myimages" />
2021-04-21 15:06:12 +00:00
</paths>
```
2024-02-10 15:36:32 +00:00
Für weitere Informationen siehe:
2024-02-08 03:06:37 +00:00
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
2021-04-21 14:06:28 +00:00
2022-05-01 13:25:53 +00:00
## WebViews
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
WebViews sind wie **Mini-Webbrowser** innerhalb von Android-Apps, die Inhalte entweder aus dem Web oder aus lokalen Dateien abrufen. Sie sind ähnlichen Risiken wie reguläre Browser ausgesetzt, aber es gibt Möglichkeiten, diese Risiken durch spezifische **Einstellungen** zu **minimieren**.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Android bietet zwei Haupttypen von WebViews:
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- **WebViewClient** ist gut für grundlegendes HTML, unterstützt jedoch nicht die JavaScript-Alert-Funktion, was sich darauf auswirkt, wie XSS-Angriffe getestet werden können.
- **WebChromeClient** verhält sich eher wie die vollständige Chrome-Browser-Erfahrung.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Ein wichtiger Punkt ist, dass WebView-Browser **keine Cookies** mit dem Hauptbrowser des Geräts teilen.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Für das Laden von Inhalten stehen Methoden wie ````loadUrl````, ````loadData````, und ````loadDataWithBaseURL```` zur Verfügung. Es ist entscheidend sicherzustellen, dass diese URLs oder Dateien **sicher verwendet** werden können. Sicherheitseinstellungen können über die Klasse ````WebSettings```` verwaltet werden. Zum Beispiel kann das Deaktivieren von JavaScript mit ````setJavaScriptEnabled(false)```` XSS-Angriffe verhindern.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Die JavaScript-"Bridge" ermöglicht es Java-Objekten, mit JavaScript zu interagieren. Ab Android 4.2 müssen Methoden mit ````@JavascriptInterface```` markiert werden, um die Sicherheit zu gewährleisten.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Das Zulassen des Zugriffs auf Inhalte (````setAllowContentAccess(true)````) ermöglicht es WebViews, auf Content Provider zuzugreifen, was ein Risiko darstellen kann, es sei denn, die Inhalts-URLs werden als sicher überprüft.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
Um den Dateizugriff zu kontrollieren:
- Das Deaktivieren des Dateizugriffs (````setAllowFileAccess(false)````) beschränkt den Zugriff auf das Dateisystem, mit Ausnahmen für bestimmte Ressourcen, um sicherzustellen, dass sie nur für nicht sensible Inhalte verwendet werden.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
## Andere App-Komponenten und Mobile Device Management
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### **Digitale Signierung von Anwendungen**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- Die **digitale Signierung** ist ein Muss für Android-Apps, um sicherzustellen, dass sie vor der Installation **authentisch erstellt** wurden. Dieser Prozess verwendet ein Zertifikat zur App-Identifizierung und muss vom Paketmanager des Geräts bei der Installation überprüft werden. Apps können **selbst signiert oder von einer externen Zertifizierungsstelle zertifiziert** sein, um unbefugten Zugriff zu verhindern und sicherzustellen, dass die App während der Auslieferung an das Gerät nicht manipuliert wurde.
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
### **App-Verifizierung für erhöhte Sicherheit**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- Ab **Android 4.2** ermöglicht eine Funktion namens **Verify Apps** Benutzern, Apps vor der Installation auf Sicherheit zu überprüfen. Dieser **Verifizierungsprozess** kann Benutzer vor potenziell schädlichen Apps warnen oder sogar die Installation besonders bösartiger Apps verhindern und die Sicherheit der Benutzer erhöhen.
2021-04-21 14:06:28 +00:00
2024-02-08 03:06:37 +00:00
### **Mobile Device Management (MDM)**
2021-04-21 14:06:28 +00:00
2024-02-10 15:36:32 +00:00
- **MDM-Lösungen** bieten Überwachung und Sicherheit für mobile Geräte über die **Device Administration API**. Sie erfordern die Installation einer Android-App, um mobile Geräte effektiv zu verwalten und zu sichern. Zu den wichtigsten Funktionen gehören die **Durchsetzung von Passwortrichtlinien**, die **Verpflichtung zur Speicherung von Verschlüsselung** und die **Ermöglichung des Remote-Datenlöschens**, um umfassende Kontrolle und Sicherheit über mobile Geräte zu gewährleisten.
2024-02-08 03:06:37 +00:00
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(context, AdminReceiver.class);
if (dpm.isAdminActive(adminComponent)) {
2024-02-10 15:36:32 +00:00
// Set minimum password length
dpm.setPasswordMinimumLength(adminComponent, 8);
2024-02-08 03:06:37 +00:00
}
```
***
2022-04-28 16:01:33 +00:00
2023-09-02 23:51:32 +00:00
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
2023-02-27 09:28:45 +00:00
2024-02-10 15:36:32 +00:00
Finden Sie die wichtigsten Sicherheitslücken, damit Sie sie schneller beheben können. Intruder verfolgt Ihre Angriffsfläche, führt proaktive Bedrohungsscans durch und findet Probleme in Ihrer gesamten Technologie-Stack, von APIs über Webanwendungen bis hin zu Cloud-Systemen. [**Probieren Sie es noch heute kostenlos aus**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks).
2023-02-27 09:28:45 +00:00
2023-09-02 23:48:41 +00:00
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
2023-02-27 09:28:45 +00:00
2023-09-02 23:48:41 +00:00
***
2022-10-27 23:22:18 +00:00
2024-02-05 02:29:11 +00:00
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-01-05 11:02:33 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>