mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/android-applic
This commit is contained in:
parent
953e5b421e
commit
41695be612
@ -1,32 +1,32 @@
|
||||
# Android Toepassings Basiese Beginsels
|
||||
# Android Applications Basics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Android Sekuriteitsmodel
|
||||
## Android Security Model
|
||||
|
||||
**Daar is twee lae:**
|
||||
|
||||
- Die **OS**, wat geïnstalleerde toepassings van mekaar isoleer.
|
||||
- Die **toepassing self**, wat ontwikkelaars toelaat om **sekere funksionaliteite bloot te stel** en toepassingsvermoëns te konfigureer.
|
||||
|
||||
### UID Skeiding
|
||||
### UID Separation
|
||||
|
||||
**Elke toepassing word aan 'n spesifieke Gebruiker ID toegeken**. Dit gebeur tydens die installasie van die app sodat **die app slegs met lêers wat aan sy Gebruiker ID behoort of gedeelde** lêers kan kommunikeer. Daarom kan slegs die app self, sekere komponente van die OS en die wortelgebruiker toegang tot die toepassingsdata hê.
|
||||
**Elke toepassing word aan 'n spesifieke gebruikers-ID toegeken**. Dit gebeur tydens die installasie van die app sodat **die app slegs met lêers wat aan sy gebruikers-ID behoort of gedeelde** lêers kan kommunikeer. Daarom kan slegs die app self, sekere komponente van die OS en die wortelgebruiker toegang tot die toepassingsdata hê.
|
||||
|
||||
### UID Deel
|
||||
### UID Sharing
|
||||
|
||||
**Twee toepassings kan gekonfigureer word om dieselfde UID te gebruik**. Dit kan nuttig wees om inligting te deel, maar as een daarvan gecompromitteer word, sal die data van beide toepassings gecompromitteer wees. Dit is waarom hierdie gedrag **afgeraadpleeg** word.\
|
||||
**Twee toepassings kan gekonfigureer word om dieselfde UID te gebruik**. Dit kan nuttig wees om inligting te deel, maar as een daarvan gecompromitteer word, sal die data van albei toepassings gecompromitteer wees. Dit is waarom hierdie gedrag **afgeraadsaam** word.\
|
||||
**Om dieselfde UID te deel, moet toepassings dieselfde `android:sharedUserId` waarde in hul manifes definieer.**
|
||||
|
||||
### Sandboxing
|
||||
|
||||
Die **Android Toepassing Sandbox** laat toe om **elke toepassing** as 'n **afsonderlike proses onder 'n afsonderlike gebruiker ID** te laat loop. Elke proses het sy eie virtuele masjien, sodat 'n app se kode in isolasie van ander apps loop.\
|
||||
Die **Android Toepassing Sandbox** laat toe om **elke toepassing** as 'n **afsonderlike proses onder 'n afsonderlike gebruikers-ID** te laat loop. Elke proses het sy eie virtuele masjien, sodat 'n app se kode in isolasie van ander apps loop.\
|
||||
Vanaf Android 5.0(L) word **SELinux** afgedwing. Basies het SELinux alle prosesinteraksies ontken en toe beleide geskep om **slegs die verwagte interaksies tussen hulle toe te laat**.
|
||||
|
||||
### Toestemmings
|
||||
### Permissions
|
||||
|
||||
Wanneer jy 'n **app installeer en dit vra om toestemmings**, vra die app vir die toestemmings wat in die **`uses-permission`** elemente in die **AndroidManifest.xml** lê. Die **uses-permission** element dui die naam van die aangevraagde toestemming binne die **naam** **attribuut aan.** Dit het ook die **maxSdkVersion** attribuut wat stop om vir toestemmings te vra op weergawes hoër as die een wat gespesifiseer is.\
|
||||
Let daarop dat android toepassings nie al die toestemmings aan die begin hoef te vra nie, hulle kan ook **dynamies om toestemmings vra** maar al die toestemmings moet **verklaar** word in die **manifest.**
|
||||
Wanneer jy 'n **app installeer en dit vra om toestemmings**, vra die app vir die toestemmings wat in die **`uses-permission`** elemente in die **AndroidManifest.xml** lêer geconfigureer is. Die **uses-permission** element dui die naam van die aangevraagde toestemming binne die **name** **attribuut aan.** Dit het ook die **maxSdkVersion** attribuut wat stop om vir toestemmings te vra op weergawes hoër as die een wat gespesifiseer is.\
|
||||
Let daarop dat Android-toepassings nie al die toestemmings aan die begin hoef te vra nie, hulle kan ook **dynamies om toestemmings vra**, maar al die toestemmings moet **verklaar** word in die **manifest.**
|
||||
|
||||
Wanneer 'n app funksionaliteit blootstel, kan dit die **toegang beperk tot slegs apps wat 'n gespesifiseerde toestemming het**.\
|
||||
'n Toestemmingselement het drie attribuut:
|
||||
@ -34,14 +34,14 @@ Wanneer 'n app funksionaliteit blootstel, kan dit die **toegang beperk tot slegs
|
||||
- Die **naam** van die toestemming
|
||||
- Die **permission-group** attribuut, wat toelaat om verwante toestemmings te groepeer.
|
||||
- Die **protection-level** wat aandui hoe die toestemmings toegeken word. Daar is vier tipes:
|
||||
- **Normaal**: Gebruik wanneer daar **geen bekende bedreigings** vir die app is nie. Die gebruiker is **nie verplig om dit goed te keur nie**.
|
||||
- **Gevaarlik**: Dui aan dat die toestemming die aansoekende toepassing 'n **verhoogde toegang** gee. **Gebruikers word gevra om dit goed te keur**.
|
||||
- **Handtekening**: Slegs **apps wat deur dieselfde sertifikaat as die een** wat die komponent uitvoer, kan toestemming ontvang. Dit is die sterkste tipe beskerming.
|
||||
- **HandtekeningOfStelsel**: Slegs **apps wat deur dieselfde sertifikaat as die een** wat die komponent uitvoer of **apps wat met stelselniveau toegang loop** kan toestemming ontvang.
|
||||
- **Normal**: Gebruik wanneer daar **geen bekende bedreigings** vir die app is nie. Die gebruiker **word nie vereis om dit goed te keur nie**.
|
||||
- **Dangerous**: Dui aan dat die toestemming die aansoekende toepassing 'n paar **verhoogde toegang** gee. **Gebruikers word gevra om dit goed te keur**.
|
||||
- **Signature**: Slegs **apps wat deur dieselfde sertifikaat as die een** wat die komponent uitvoer, kan toestemming ontvang. Dit is die sterkste tipe beskerming.
|
||||
- **SignatureOrSystem**: Slegs **apps wat deur dieselfde sertifikaat as die een** wat die komponent uitvoer of **apps wat met stelselniveau toegang loop**, kan toestemming ontvang.
|
||||
|
||||
## Vooraf Geïnstalleerde Toepassings
|
||||
## Pre-Installed Applications
|
||||
|
||||
Hierdie apps word gewoonlik in die **`/system/app`** of **`/system/priv-app`** gidse gevind en sommige van hulle is **geoptimaliseer** (jy mag nie eens die `classes.dex` lêer vind nie). Hierdie toepassings is die moeite werd om na te kyk omdat hulle soms **met te veel toestemmings loop** (as wortel).
|
||||
Hierdie apps word gewoonlik in die **`/system/app`** of **`/system/priv-app`** gidse gevind en sommige van hulle is **geoptimaliseer** (jy mag dalk nie eens die `classes.dex` lêer vind nie). Hierdie toepassings is die moeite werd om na te kyk omdat hulle soms **met te veel toestemmings loop** (as wortel).
|
||||
|
||||
- Diegene wat saam met die **AOSP** (Android OpenSource Project) **ROM** verskaf word
|
||||
- Bygevoeg deur die toestel **fabrikant**
|
||||
@ -49,28 +49,28 @@ Hierdie apps word gewoonlik in die **`/system/app`** of **`/system/priv-app`** g
|
||||
|
||||
## Rooting
|
||||
|
||||
Om worteltoegang tot 'n fisiese android toestel te verkry, moet jy gewoonlik 1 of 2 **kwesbaarhede** **ontgin** wat gewoonlik **spesifiek** vir die **toestel** en **weergawe** is.\
|
||||
Om worteltoegang tot 'n fisiese Android-toestel te verkry, moet jy gewoonlik 1 of 2 **kwesbaarhede** **ontgin** wat gewoonlik **spesifiek** vir die **toestel** en **weergawe** is.\
|
||||
Sodra die ontginning gewerk het, word gewoonlik die Linux `su` binêre na 'n plek gekopieer wat in die gebruiker se PATH omgewing veranderlike gespesifiseer is, soos `/system/xbin`.
|
||||
|
||||
Sodra die su binêre geconfigureer is, word 'n ander Android app gebruik om met die `su` binêre te kommunikeer en **versoeke vir worteltoegang te verwerk** soos **Superuser** en **SuperSU** (beskikbaar in die Google Play winkel).
|
||||
Sodra die su binêre geconfigureer is, word 'n ander Android-app gebruik om met die `su` binêre te kommunikeer en **versoeke vir worteltoegang te verwerk** soos **Superuser** en **SuperSU** (beskikbaar in die Google Play winkel).
|
||||
|
||||
> [!CAUTION]
|
||||
> Let daarop dat die rooting proses baie gevaarlik is en die toestel ernstig kan beskadig.
|
||||
|
||||
### ROMs
|
||||
|
||||
Dit is moontlik om die **OS te vervang deur 'n aangepaste firmware te installeer**. Deur dit te doen, is dit moontlik om die nuttigheid van 'n ou toestel uit te brei, sagtewarebeperkings te omseil of toegang tot die nuutste Android kode te verkry.\
|
||||
Dit is moontlik om die **OS te vervang deur 'n pasgemaakte firmware** te installeer. Deur dit te doen, is dit moontlik om die nuttigheid van 'n ou toestel uit te brei, sagtewarebeperkings te omseil of toegang tot die nuutste Android-kode te verkry.\
|
||||
**OmniROM** en **LineageOS** is twee van die gewildste firmware om te gebruik.
|
||||
|
||||
Let daarop dat **dit nie altyd nodig is om die toestel te root** om 'n aangepaste firmware te installeer nie. **Sommige fabrikante laat** die ontsluiting van hul bootloaders op 'n goed gedokumenteerde en veilige manier toe.
|
||||
Let daarop dat **dit nie altyd nodig is om die toestel te root** om 'n pasgemaakte firmware te installeer nie. **Sommige vervaardigers laat** die ontsluiting van hul bootloaders op 'n goed gedokumenteerde en veilige manier toe.
|
||||
|
||||
### Gevolge
|
||||
### Implications
|
||||
|
||||
Sodra 'n toestel ge-root is, kan enige app toegang as wortel vra. As 'n kwaadwillige toepassing dit kry, sal dit toegang tot byna alles hê en dit sal in staat wees om die foon te beskadig.
|
||||
Sodra 'n toestel ge-root is, kan enige app toegang as wortel vra. As 'n kwaadwillige toepassing dit kry, kan dit toegang tot byna alles hê en dit sal in staat wees om die foon te beskadig.
|
||||
|
||||
## Android Toepassing Fundamentele <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
## Android Application Fundamentals <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Die formaat van Android toepassings word verwys na as _APK lêerformaat_. Dit is essensieel 'n **ZIP lêer** (deur die lêer uitbreiding na .zip te hernoem, kan die inhoud onttrek en besigtig word).
|
||||
- Die formaat van Android-toepassings word verwys na as _APK lêerformaat_. Dit is essensieel 'n **ZIP-lêer** (deur die lêernaamuitbreiding na .zip te hernoem, kan die inhoud onttrek en besigtig word).
|
||||
- APK Inhoud (Nie uitputtend nie)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
@ -81,32 +81,32 @@ Sodra 'n toestel ge-root is, kan enige app toegang as wortel vra. As 'n kwaadwil
|
||||
- **classes.dex**
|
||||
- Bevat Dalvik bytecode, wat die gecompileerde Java (of Kotlin) kode verteenwoordig wat die toepassing standaard uitvoer.
|
||||
- lib/
|
||||
- Huisves inheemse biblioteke, gesegregeer volgens CPU argitektuur in subgidse.
|
||||
- Huisves inheemse biblioteke, gesegregeer volgens CPU-argitektuur in subgidse.
|
||||
- `armeabi`: kode vir ARM-gebaseerde verwerkers
|
||||
- `armeabi-v7a`: kode vir ARMv7 en hoër gebaseerde verwerkers
|
||||
- `x86`: kode vir X86 verwerkers
|
||||
- `mips`: kode vir slegs MIPS verwerkers
|
||||
- assets/
|
||||
- Berg miscellaneous lêers wat deur die app benodig word, moontlik insluitend addisionele inheemse biblioteke of DEX lêers, soms deur kwaadwillige outeurs gebruik om addisionele kode te verberg.
|
||||
- Berg miscellaneous lêers wat deur die app benodig word, moontlik insluitend addisionele inheemse biblioteke of DEX-lêers, soms deur kwaadwillige outeurs gebruik om addisionele kode te verberg.
|
||||
- res/
|
||||
- Bevat hulpbronne wat nie in resources.arsc gecompileer is nie.
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
In Android ontwikkeling, **Java of Kotlin** word gebruik om apps te skep. In plaas daarvan om die JVM soos in lessenaar apps te gebruik, compileer Android hierdie kode in **Dalvik Uitvoerbare (DEX) bytecode**. Eerder het die Dalvik virtuele masjien hierdie bytecode hanteer, maar nou neem die Android Runtime (ART) oor in nuwer Android weergawes.
|
||||
In Android-ontwikkeling word **Java of Kotlin** gebruik om apps te skep. In plaas daarvan om die JVM soos in desktop-apps te gebruik, compileer Android hierdie kode in **Dalvik Executable (DEX) bytecode**. Eerder het die Dalvik virtuele masjien hierdie bytecode hanteer, maar nou neem die Android Runtime (ART) oor in nuwer Android-weergawes.
|
||||
|
||||
Vir omgekeerde ingenieurswese, word **Smali** noodsaaklik. Dit is die menslike leesbare weergawe van DEX bytecode, wat soos assembly taal optree deur bronkode in bytecode instruksies te vertaal. Smali en baksmali verwys na die samestelling en ontbinding gereedskap in hierdie konteks.
|
||||
Vir omgekeerde ingenieurswese word **Smali** noodsaaklik. Dit is die menslike leesbare weergawe van DEX bytecode, wat soos assembly-taal optree deur bronkode in bytecode-instruksies te vertaal. Smali en baksmali verwys na die samestelling en ontbinding gereedskap in hierdie konteks.
|
||||
|
||||
## Intents
|
||||
|
||||
Intents is die primêre middel waardeur Android apps tussen hul komponente of met ander apps kommunikeer. Hierdie boodskapobjekte kan ook data tussen apps of komponente dra, soortgelyk aan hoe GET/POST versoeke in HTTP kommunikasies gebruik word.
|
||||
Intents is die primêre middel waardeur Android-apps tussen hul komponente of met ander apps kommunikeer. Hierdie boodskapobjekte kan ook data tussen apps of komponente dra, soortgelyk aan hoe GET/POST versoeke in HTTP-kommunikasie gebruik word.
|
||||
|
||||
So 'n Intent is basies 'n **boodskap wat tussen komponente oorgedra word**. Intents **kan gerig** word aan spesifieke komponente of apps, **of kan sonder 'n spesifieke ontvanger gestuur word**.\
|
||||
Om dit eenvoudig te stel, kan Intent gebruik word:
|
||||
Om dit eenvoudig te stel, kan 'n Intent gebruik word:
|
||||
|
||||
- Om 'n Aktiwiteit te begin, wat tipies 'n gebruikerskoppelvlak vir 'n app oopmaak
|
||||
- As uitsendings om die stelsel en apps van veranderinge in kennis te stel
|
||||
- Om 'n agtergronddiens te begin, stop, en met dit te kommunikeer
|
||||
- Om 'n agtergronddiens te begin, stop, en kommunikeer
|
||||
- Om toegang tot data via ContentProviders te verkry
|
||||
- As terugroep funksies om gebeurtenisse te hanteer
|
||||
|
||||
@ -114,13 +114,13 @@ As kwesbaar, **kan Intents gebruik word om 'n verskeidenheid aanvalle uit te voe
|
||||
|
||||
### Intent-Filter
|
||||
|
||||
**Intent Filters** definieer **hoe 'n aktiwiteit, diens, of Uitsend Receiver met verskillende tipes Intents kan kommunikeer**. Essensieel beskryf hulle die vermoëns van hierdie komponente, soos watter aksies hulle kan uitvoer of die tipes uitsendings wat hulle kan verwerk. Die primêre plek om hierdie filters te verklaar is binne die **AndroidManifest.xml lêer**, hoewel dit ook 'n opsie is om dit vir Uitsend Receivers te kodeer.
|
||||
**Intent Filters** definieer **hoe 'n aktiwiteit, diens, of Uitsend Receiver met verskillende tipes Intents kan interaksie hê**. Essensieel beskryf hulle die vermoëns van hierdie komponente, soos watter aksies hulle kan uitvoer of die tipes uitsendings wat hulle kan verwerk. Die primêre plek om hierdie filters te verklaar is binne die **AndroidManifest.xml lêer**, hoewel dit ook 'n opsie is om dit vir Uitsend Receivers te kodeer.
|
||||
|
||||
Intent Filters bestaan uit kategorieë, aksies, en data filters, met die moontlikheid om addisionele metadata in te sluit. Hierdie opstelling laat komponente toe om spesifieke Intents te hanteer wat aan die verklaarde kriteria voldoen.
|
||||
|
||||
'n Kritieke aspek van Android komponente (aktiwiteite/dienste/inhoud verskaffers/uitsend receivers) is hul sigbaarheid of **publieke status**. 'n Komponent word as publiek beskou en kan met ander apps kommunikeer as dit **`exported`** is met 'n waarde van **`true`** of as 'n Intent Filter vir dit in die manifest verklaar is. Daar is egter 'n manier vir ontwikkelaars om hierdie komponente eksplisiet privaat te hou, wat verseker dat hulle nie onbedoeld met ander apps kommunikeer nie. Dit word bereik deur die **`exported`** attribuut op **`false`** in hul manifest definisies in te stel.
|
||||
'n Kritieke aspek van Android komponente (aktiwiteite/dienste/inhoudverskaffers/uitsend receivers) is hul sigbaarheid of **publieke status**. 'n Komponent word as publiek beskou en kan met ander apps interaksie hê as dit **`exported`** is met 'n waarde van **`true`** of as 'n Intent Filter vir dit in die manifest verklaar is. Daar is egter 'n manier vir ontwikkelaars om hierdie komponente eksplisiet privaat te hou, wat verseker dat hulle nie onbedoeld met ander apps interaksie het nie. Dit word bereik deur die **`exported`** attribuut op **`false`** in hul manifest definisies in te stel.
|
||||
|
||||
Boonop het ontwikkelaars die opsie om toegang tot hierdie komponente verder te beveilig deur spesifieke toestemmings te vereis. Die **`permission`** attribuut kan gestel word om af te dwing dat slegs apps met die aangewese toestemming toegang tot die komponent kan verkry, wat 'n ekstra laag van sekuriteit en beheer oor wie met dit kan kommunikeer, toevoeg.
|
||||
Boonop het ontwikkelaars die opsie om toegang tot hierdie komponente verder te beveilig deur spesifieke toestemmings te vereis. Die **`permission`** attribuut kan gestel word om af te dwing dat slegs apps met die aangewese toestemming toegang tot die komponent kan verkry, wat 'n ekstra laag van sekuriteit en beheer oor wie met dit kan interaksie hê, toevoeg.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
@ -143,13 +143,13 @@ Hierdie intent moet binne die manifest verklaar word soos in die volgende voorbe
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
'n Intent-filter moet die **aksie**, **data** en **kategorie** ooreenstem om 'n boodskap te ontvang.
|
||||
'n intent-filter moet die **aksie**, **data** en **kategorie** ooreenstem om 'n boodskap te ontvang.
|
||||
|
||||
Die "Intent resolusie" proses bepaal watter app elke boodskap moet ontvang. Hierdie proses oorweeg die **prioriteit eienskap**, wat in die **intent-filter verklaring** gestel kan word, en **die een met die hoër prioriteit sal gekies word**. Hierdie prioriteit kan tussen -1000 en 1000 gestel word en toepassings kan die `SYSTEM_HIGH_PRIORITY` waarde gebruik. As 'n **konflik** ontstaan, verskyn 'n "chooser" venster sodat die **gebruiker kan besluit**.
|
||||
|
||||
### Expliciete Intents
|
||||
### Eksplisiete Intents
|
||||
|
||||
'n Expliciete intent spesifiseer die klasnaam wat dit teiken:
|
||||
'n Eksplisiete intent spesifiseer die klasnaam wat dit teiken:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Hierdie laat ander toepassings toe om **aksies namens jou toepassing uit te voer**, met behulp van jou app se identiteit en toestemmings. Om 'n Pending Intent te konstrueer, moet 'n **intent en die aksie wat uitgevoer moet word, gespesifiseer word**. As die **verklaarde intent nie Eksplisiet is nie** (nie verklaar watter intent dit kan oproep nie), kan 'n **kwaadwillige toepassing die verklaarde aksie** namens die slagoffer-app uitvoer. Boonop, **as 'n aksie nie gespesifiseer is nie**, sal die kwaadwillige app in staat wees om **enige aksie namens die slagoffer** uit te voer.
|
||||
Hierdie laat ander toepassings toe om **optrede namens jou toepassing te neem**, met behulp van jou app se identiteit en toestemmings. Om 'n Pending Intent te konstrueer, moet 'n **intent en die aksie wat uitgevoer moet word, gespesifiseer word**. As die **verklaarde intent nie Eksplisiet is nie** (nie verklaar watter intent dit kan oproep nie), kan 'n **kwaadwillige toepassing die verklaarde aksie** namens die slagoffer-app uitvoer. Boonop, **as 'n aksie nie gespesifiseer is nie**, sal die kwaadwillige app in staat wees om **enige aksie namens die slagoffer** te doen.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -206,7 +206,7 @@ Dan kan jy in die data veld die **host** en **path** spesifiseer:
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
Om dit vanaf 'n web te benader, is dit moontlik om 'n skakel soos:
|
||||
Om dit vanaf 'n web te benader, is dit moontlik om 'n skakel soos te stel:
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
@ -217,11 +217,11 @@ Leer hoe om [deep links te bel sonder om HTML-bladsye te gebruik](#exploiting-sc
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
Die **Android Interface Definition Language (AIDL)** is ontwerp om kommunikasie tussen kliënt en diens in Android-toepassings te fasiliteer deur middel van **interprocess communication** (IPC). Aangesien dit nie toegelaat word om 'n ander proses se geheue direk op Android te benader nie, vereenvoudig AIDL die proses deur voorwerpe in 'n formaat te marshall wat deur die bedryfstelsel verstaan word, wat kommunikasie oor verskillende prosesse vergemaklik.
|
||||
Die **Android Interface Definition Language (AIDL)** is ontwerp om kommunikasie tussen kliënt en diens in Android-toepassings te fasiliteer deur middel van **interprocess communication** (IPC). Aangesien dit nie toegelaat word om direk toegang tot 'n ander proses se geheue te verkry nie, vereenvoudig AIDL die proses deur voorwerpe in 'n formaat te marshall wat deur die bedryfstelsel verstaan word, wat kommunikasie oor verskillende prosesse vergemaklik.
|
||||
|
||||
### Sleutelkonsepte
|
||||
|
||||
- **Gekoppelde Dienste**: Hierdie dienste gebruik AIDL vir IPC, wat aktiwiteite of komponente in staat stel om aan 'n diens te bind, versoeke te maak en antwoorde te ontvang. Die `onBind` metode in die diens se klas is krities vir die inisie van interaksie, wat dit 'n belangrike area maak vir sekuriteitsherziening in die soeke na kwesbaarhede.
|
||||
- **Gekoppelde Dienste**: Hierdie dienste gebruik AIDL vir IPC, wat aktiwiteite of komponente in staat stel om aan 'n diens te bind, versoeke te maak en antwoorde te ontvang. Die `onBind` metode in die diens se klas is krities vir die inisiëring van interaksie, wat dit 'n belangrike area maak vir sekuriteitsherziening in die soeke na kwesbaarhede.
|
||||
|
||||
- **Messenger**: As 'n gekoppelde diens, fasiliteer Messenger IPC met 'n fokus op die verwerking van data deur die `onBind` metode. Dit is noodsaaklik om hierdie metode noukeurig te ondersoek vir enige onveilige datahantering of uitvoering van sensitiewe funksies.
|
||||
|
||||
@ -233,7 +233,7 @@ Hierdie sluit in: **Aktiwiteite, Dienste, Uitsendingsontvangers en Verskaffers.*
|
||||
|
||||
### Laaieraktiwiteit en ander aktiwiteite
|
||||
|
||||
In Android-toepassings is **aktiwiteite** soos skerms, wat verskillende dele van die app se gebruikerskoppelvlak vertoon. 'n App kan baie aktiwiteite hê, elkeen wat 'n unieke skerm aan die gebruiker aanbied.
|
||||
In Android-apps is **aktiwiteite** soos skerms, wat verskillende dele van die app se gebruikerskoppelvlak vertoon. 'n App kan baie aktiwiteite hê, elkeen wat 'n unieke skerm aan die gebruiker aanbied.
|
||||
|
||||
Die **laaieraktiwiteit** is die hooftoegangspunt tot 'n app, wat gelaai word wanneer jy op die app se ikoon tik. Dit is gedefinieer in die app se manifeslêer met spesifieke MAIN en LAUNCHER intents:
|
||||
```html
|
||||
@ -246,7 +246,7 @@ Die **laaieraktiwiteit** is die hooftoegangspunt tot 'n app, wat gelaai word wan
|
||||
```
|
||||
Nie alle toepassings benodig 'n lanseeraktiwiteit nie, veral dié sonder 'n gebruikerskoppelvlak, soos agtergronddienste.
|
||||
|
||||
Aktiwiteite kan beskikbaar gestel word aan ander toepassings of prosesse deur dit as "geëxporteer" in die manifest te merk. Hierdie instelling laat ander toepassings toe om hierdie aktiwiteit te begin:
|
||||
Aktiwiteite kan beskikbaar gestel word aan ander toepassings of prosesse deur dit as "geëksporteer" in die manifest te merk. Hierdie instelling laat ander toepassings toe om hierdie aktiwiteit te begin:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
@ -274,9 +274,9 @@ super.onCreate();
|
||||
```
|
||||
### Dienste
|
||||
|
||||
[Dienste](https://developer.android.com/guide/components/services) is **agtergrond operasies** wat in staat is om take uit te voer sonder 'n gebruikerskoppelvlak. Hierdie take kan voortgaan om te loop selfs wanneer gebruikers na verskillende toepassings oorskakel, wat dienste noodsaaklik maak vir **langdurige operasies**.
|
||||
[Dienste](https://developer.android.com/guide/components/services) is **agtergrond operateurs** wat in staat is om take uit te voer sonder 'n gebruikerskoppelvlak. Hierdie take kan voortgaan om te loop selfs wanneer gebruikers na verskillende toepassings oorskakel, wat dienste noodsaaklik maak vir **langdurige operasies**.
|
||||
|
||||
Dienste is veelsydig; hulle kan op verskillende maniere geaktiveer word, met **Intents** as die primêre metode om hulle as 'n toepassing se toegangspunt te begin. Sodra 'n diens begin is met die `startService` metode, begin sy `onStart` metode en hou aan om te loop totdat die `stopService` metode eksplisiet aangeroep word. Alternatiewelik, as 'n diens se rol afhanklik is van 'n aktiewe kliëntverbinding, word die `bindService` metode gebruik om die kliënt aan die diens te bind, wat die `onBind` metode aktiveer vir dataversending.
|
||||
Dienste is veelsydig; hulle kan op verskillende maniere geaktiveer word, met **Intents** as die primêre metode om hulle as 'n toepassing se toegangspunt te begin. Sodra 'n diens begin is met die `startService` metode, begin sy `onStart` metode en hou aan om te loop totdat die `stopService` metode eksplisiet aangeroep word. Alternatiewelik, as 'n diens se rol afhanklik is van 'n aktiewe kliëntverbinding, word die `bindService` metode gebruik om die kliënt aan die diens te bind, wat die `onBind` metode aktiveer vir dataverskuiwing.
|
||||
|
||||
'n Interessante toepassing van dienste sluit agtergrondmusiekafspeel of netwerkdata-ophaal in sonder om die gebruiker se interaksie met 'n toepassing te hindern. Boonop kan dienste beskikbaar gemaak word vir ander prosesse op dieselfde toestel deur **uitvoer**. Dit is nie die standaardgedrag nie en vereis eksplisiete konfigurasie in die Android Manifest-lêer:
|
||||
```xml
|
||||
@ -290,15 +290,15 @@ Dienste is veelsydig; hulle kan op verskillende maniere geaktiveer word, met **I
|
||||
|
||||
Uitsendings kan **asynchrone** wees, wat alle ontvangers sonder volgorde bereik, of **synchronies**, waar ontvangers die uitsending ontvang op grond van ingestelde prioriteite. Dit is egter belangrik om die potensiële sekuriteitsrisiko te noem, aangesien enige app homself kan prioriteer om 'n uitsending te onderskep.
|
||||
|
||||
Om 'n ontvanger se funksionaliteit te verstaan, soek na die **`onReceive`** metode binne sy klas. Hierdie metode se kode kan die ontvangde Intent manipuleer, wat die behoefte aan datavalidatie deur ontvangers beklemtoon, veral in **Bestelde Uitsendings**, wat die Intent kan wysig of laat val.
|
||||
Om 'n ontvanger se funksionaliteit te verstaan, soek na die **`onReceive`** metode binne sy klas. Die kode van hierdie metode kan die ontvangde Intent manipuleer, wat die behoefte aan datavalidatie deur ontvangers beklemtoon, veral in **Geregelde Uitsendings**, wat die Intent kan wysig of laat val.
|
||||
|
||||
### Inhoudverskaffer
|
||||
|
||||
**Inhoudverskaffers** is noodsaaklik vir **die deel van gestruktureerde data** tussen toepassings, wat die belangrikheid van die implementering van **toestemmings** beklemtoon om datasekuriteit te verseker. Hulle laat toepassings toe om toegang te verkry tot data van verskeie bronne, insluitend databasisse, lêerstelsels of die web. Spesifieke toestemmings, soos **`readPermission`** en **`writePermission`**, is van kardinale belang om toegang te beheer. Boonop kan tydelike toegang verleen word deur **`grantUriPermission`** instellings in die app se manifest, wat eienskappe soos `path`, `pathPrefix`, en `pathPattern` benut vir gedetailleerde toegangbeheer.
|
||||
**Inhoudverskaffers** is noodsaaklik vir **die deel van gestruktureerde data** tussen toepassings, wat die belangrikheid van die implementering van **toestemmings** beklemtoon om datasekuriteit te verseker. Hulle laat toepassings toe om toegang te verkry tot data van verskeie bronne, insluitend databasisse, lêerstelsels of die web. Spesifieke toestemmings, soos **`readPermission`** en **`writePermission`**, is noodsaaklik om toegang te beheer. Boonop kan tydelike toegang verleen word deur **`grantUriPermission`** instellings in die app se manifest, wat eienskappe soos `path`, `pathPrefix`, en `pathPattern` benut vir gedetailleerde toegangbeheer.
|
||||
|
||||
Invoervalidasie is van uiterste belang om kwesbaarhede, soos SQL-inspuiting, te voorkom. Inhoudverskaffers ondersteun basiese operasies: `insert()`, `update()`, `delete()`, en `query()`, wat datamanipulasie en -deling tussen toepassings fasiliteer.
|
||||
Invoervalidasie is van kardinale belang om kwesbaarhede, soos SQL-inspuiting, te voorkom. Inhoudverskaffers ondersteun basiese operasies: `insert()`, `update()`, `delete()`, en `query()`, wat datamanipulasie en -deling tussen toepassings fasiliteer.
|
||||
|
||||
**FileProvider**, 'n gespesialiseerde Inhoudverskaffer, fokus op die veilige deel van lêers. Dit word in die app se manifest gedefinieer met spesifieke eienskappe om toegang tot vouers te beheer, aangedui deur `android:exported` en `android:resource` wat na vouer konfigurasies verwys. Versigtigheid word aanbeveel wanneer daar vouers gedeel word om te voorkom dat sensitiewe data per ongeluk blootgestel word.
|
||||
**FileProvider**, 'n gespesialiseerde Inhoudverskaffer, fokus op die veilige deel van lêers. Dit word in die app se manifest gedefinieer met spesifieke eienskappe om toegang tot vouers te beheer, aangedui deur `android:exported` en `android:resource` wat na vouer konfigurasies verwys. Versigtigheid word aanbeveel wanneer daar direkteure gedeel word om te voorkom dat sensitiewe data per ongeluk blootgestel word.
|
||||
|
||||
Voorbeeld manifestverklaring vir FileProvider:
|
||||
```xml
|
||||
@ -346,7 +346,7 @@ Om lêertoegang te beheer:
|
||||
|
||||
### **Digitale Handtekening van Toepassings**
|
||||
|
||||
- **Digitale handtekening** is 'n moet vir Android-apps, wat verseker dat hulle **egte geskryf** is voor installasie. Hierdie proses gebruik 'n sertifikaat vir app-identifikasie en moet deur die toestel se pakketbestuurder geverifieer word tydens installasie. Apps kan **self-onderteken of gesertifiseer deur 'n eksterne CA** wees, wat beskerming bied teen ongemagtigde toegang en verseker dat die app ongeskonde bly tydens sy aflewering aan die toestel.
|
||||
- **Digitale handtekening** is 'n moet vir Android-apps, wat verseker dat hulle **egte geskryf** is voor installasie. Hierdie proses gebruik 'n sertifikaat vir app-identifikasie en moet deur die toestel se pakketbestuurder geverifieer word tydens installasie. Apps kan **self-onderteken of gesertifiseer deur 'n eksterne CA** wees, wat beskerming bied teen ongeoorloofde toegang en verseker dat die app ongeskonde bly tydens sy aflewering aan die toestel.
|
||||
|
||||
### **App-verifikasie vir Verbeterde Sekuriteit**
|
||||
|
||||
@ -354,7 +354,7 @@ Om lêertoegang te beheer:
|
||||
|
||||
### **Mobiele Toestelbestuur (MDM)**
|
||||
|
||||
- **MDM-oplossings** bied **toesig en sekuriteit** vir mobiele toestelle deur middel van **Device Administration API**. Hulle vereis die installasie van 'n Android-app om mobiele toestelle effektief te bestuur en te beveilig. Sleutelfunksies sluit in **afdwinging van wagwoordbeleide**, **verpligte stoor-enkripsie**, en **toestemming vir afstandsdata-wipe**, wat omvattende beheer en sekuriteit oor mobiele toestelle verseker.
|
||||
- **MDM-oplossings** bied **toesig en sekuriteit** vir mobiele toestelle deur middel van **Device Administration API**. Hulle vereis die installasie van 'n Android-app om mobiele toestelle effektief te bestuur en te beveilig. Sleutel funksies sluit in **afdwinging van wagwoordbeleide**, **verpligte stoor-enkripsie**, en **toestemming vir afstandsdata-wipe**, wat omvattende beheer en sekuriteit oor mobiele toestelle verseker.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
@ -365,4 +365,104 @@ if (dpm.isAdminActive(adminComponent)) {
|
||||
dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
}
|
||||
```
|
||||
## Opname en Exploitering van AIDL / Binder Dienste
|
||||
|
||||
Android *Binder* IPC stel baie **stelsels en verskaffer-gelewer dienste** bloot. Daardie dienste word 'n **aanvalsvlak** wanneer hulle sonder 'n behoorlike toestemmingskontrole uitgevoer word (die AIDL-laag self voer *geen* toegangbeheer uit nie).
|
||||
|
||||
### 1. Ontdek lopende dienste
|
||||
```bash
|
||||
# from an adb shell (USB or wireless)
|
||||
service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
1. Android-toepassings is 'n belangrike deel van mobiele toestelle.
|
||||
2. Dit is noodsaaklik om die sekuriteit van hierdie toepassings te verstaan.
|
||||
3. Die meeste Android-toepassings gebruik 'n verskeidenheid API's.
|
||||
4. Ontwikkelaars moet bewus wees van potensiële kwesbaarhede.
|
||||
5. Dit sluit in: onveilige datastoor, swak kodering, en onvoldoende toegangsbeheer.
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
```
|
||||
* Die **indeks** (eerste kolom) word tydens uitvoering toegeken – moenie daarop staatmaak oor herlaai nie.
|
||||
* Die **Binder naam** (bv. `mtkconnmetrics`) is wat aan `service call` oorgedra sal word.
|
||||
* Die waarde binne die hakies is die volledig-gekwalifiseerde **AIDL koppelvlak** waarvan die stub gegenereer is.
|
||||
|
||||
### 2. Verkry die koppelvlak beskrywer (PING)
|
||||
Elke Binder stub implementeer outomaties **transaksie kode `0x5f4e5446`** (`1598968902` desimaal, ASCII "_NTF").
|
||||
```bash
|
||||
# "ping" the service
|
||||
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||
```
|
||||
'n Geldige antwoord keer die koppelvlaknaam terug as 'n UTF-16 string binne 'n `Parcel`.
|
||||
|
||||
### 3. Om 'n transaksie aan te roep
|
||||
Sintaksis: `service call <name> <code> [type value ...]`
|
||||
|
||||
Gewone argument spesifiseerders:
|
||||
* `i32 <int>` – onderteken 32-bit waarde
|
||||
* `i64 <long>` – onderteken 64-bit waarde
|
||||
* `s16 <string>` – UTF-16 string (Android 13+ gebruik `utf16`)
|
||||
|
||||
Voorbeeld – begin netwerkmonitering met uid **1** op 'n MediaTek toestel:
|
||||
```bash
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
### 4. Brute-forcing onbekende metodes
|
||||
Wanneer headerlêers nie beskikbaar is nie, kan jy **die kode herhaal** totdat die fout verander van:
|
||||
```
|
||||
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||
```
|
||||
na 'n normale `Parcel` antwoord of `SecurityException`.
|
||||
```bash
|
||||
for i in $(seq 1 50); do
|
||||
printf "[+] %2d -> " $i
|
||||
service call mtkconnmetrics $i 2>/dev/null | head -1
|
||||
done
|
||||
```
|
||||
As die diens **met proguard** gecompileer is, moet die kaartlegging geraai word – sien volgende stap.
|
||||
|
||||
### 5. Kaartkode ↔ metodes via onTransact()
|
||||
Decompile die jar/odex wat die koppelvlak implementeer (vir AOSP stubs kyk na `/system/framework`; OEMs gebruik dikwels `/system_ext` of `/vendor`).
|
||||
Soek vir `Stub.onTransact()` – dit bevat 'n reuse `switch(transactionCode)`:
|
||||
```java
|
||||
case TRANSACTION_updateCtaAppStatus: // 5
|
||||
data.enforceInterface(DESCRIPTOR);
|
||||
int appId = data.readInt();
|
||||
boolean ok = data.readInt() != 0;
|
||||
updateCtaAppStatus(appId, ok);
|
||||
reply.writeNoException();
|
||||
return true;
|
||||
```
|
||||
Nou is die prototipe en **parameter tipes** kristalhelder.
|
||||
|
||||
### 6. Identifisering van ontbrekende toestemmingskontroles
|
||||
Die implementering (dikwels 'n interne `Impl` klas) is verantwoordelik vir outorisering:
|
||||
```java
|
||||
private void updateCtaAppStatus(int uid, boolean status) {
|
||||
if (!isPermissionAllowed()) {
|
||||
throw new SecurityException("uid " + uid + " rejected");
|
||||
}
|
||||
/* privileged code */
|
||||
}
|
||||
```
|
||||
Die afwesigheid van sulke logika of 'n witlys van bevoorregte UID's (bv. `uid == 1000 /*system*/`) is 'n **kwesbaarheid aanduiding**.
|
||||
|
||||
Gevalstudie – *MediaTek* `startMonitorProcessWithUid()` (transaksie **8**) voer 'n Netlink-boodskap **sonder** enige toestemming hek uit, wat 'n onbevoegde app toelaat om met die kern se Netfilter-module te kommunikeer en die stelsellog te spam.
|
||||
|
||||
### 7. Outomatisering van die assessering
|
||||
Gereedskap / skripte wat Binder verkenning versnel:
|
||||
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) – stel `/dev/binderfs` met per-diens knope bloot
|
||||
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – loop deur die binder tabel en druk ACL's
|
||||
* Frida snelkoppeling: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
|
||||
|
||||
---
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [Android Services 101 – Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
|
||||
- [Android Developer Docs – AIDL](https://developer.android.com/guide/components/aidl)
|
||||
- [Android Developer Docs – IBinder](https://developer.android.com/reference/android/os/IBinder)
|
||||
- [Understanding Binder, Talk @ Google](https://www.youtube.com/watch?v=O-UHvFjxwZ8)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user