Translated ['mobile-pentesting/android-app-pentesting/android-applicatio

This commit is contained in:
Translator 2024-10-05 13:17:25 +00:00
parent 08f51fa3a2
commit 74b0491469

View file

@ -10,7 +10,7 @@ Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
</details>
{% endhint %}
@ -39,17 +39,17 @@ Od Androida 5.0(L) **SELinux** jest egzekwowany. Zasadniczo, SELinux odmawia wsz
### Uprawnienia
Kiedy instalujesz **aplikację i prosi o uprawnienia**, aplikacja prosi o uprawnienia skonfigurowane w elementach **`uses-permission`** w pliku **AndroidManifest.xml**. Element **uses-permission** wskazuje nazwę żądanego uprawnienia w **atrybucie name**. Ma również atrybut **maxSdkVersion**, który przestaje prosić o uprawnienia w wersjach wyższych niż ta określona.\
Zauważ, że aplikacje na Androida nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
Zauważ, że aplikacje androidowe nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
Kiedy aplikacja ujawnia funkcjonalność, może ograniczyć **dostęp tylko do aplikacji, które mają określone uprawnienie**.\
Element uprawnienia ma trzy atrybuty:
* **nazwa** uprawnienia
* atrybut **permission-group**, który pozwala na grupowanie powiązanych uprawnień.
* **poziom ochrony**, który wskazuje, jak przyznawane są uprawnienia. Istnieją cztery typy:
* **protection-level**, który wskazuje, jak przyznawane są uprawnienia. Istnieją cztery typy:
* **Normalne**: Używane, gdy **nie ma znanych zagrożeń** dla aplikacji. Użytkownik **nie musi ich zatwierdzać**.
* **Niebezpieczne**: Wskazuje, że uprawnienie przyznaje żądającej aplikacji pewien **podwyższony dostęp**. **Użytkownicy są proszeni o ich zatwierdzenie**.
* **Podpis**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienie. To najsilniejszy typ ochrony.
* **Podpisane**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienia. To najsilniejszy typ ochrony.
* **SignatureOrSystem**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent lub **aplikacje działające z dostępem na poziomie systemu** mogą otrzymać uprawnienia.
## Aplikacje wstępnie zainstalowane
@ -82,9 +82,9 @@ Zauważ, że **nie zawsze jest konieczne rootowanie urządzenia**, aby zainstalo
Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako root. Jeśli złośliwa aplikacja go uzyska, będzie miała dostęp do prawie wszystkiego i będzie mogła uszkodzić telefon.
## Podstawy aplikacji na Androida <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
## Podstawy aplikacji Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- Format aplikacji na Androida określany jest jako _format pliku APK_. Jest to zasadniczo **plik ZIP** (zmieniając rozszerzenie pliku na .zip, zawartość można wyodrębnić i przeglądać).
- Format aplikacji Android określany jest jako _format pliku APK_. Jest to zasadniczo **plik ZIP** (zmieniając rozszerzenie pliku na .zip, zawartość można wyodrębnić i przeglądać).
- Zawartość APK (nie wyczerpująca)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
@ -109,13 +109,13 @@ Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako r
W rozwoju Androida, **Java lub Kotlin** jest używane do tworzenia aplikacji. Zamiast używać JVM jak w aplikacjach desktopowych, Android kompiluje ten kod do **bajtkodu Dalvik Executable (DEX)**. Wcześniej, maszyna wirtualna Dalvik obsługiwała ten bajtkod, ale teraz, w nowszych wersjach Androida, przejmuje go Android Runtime (ART).
W inżynierii odwrotnej, **Smali** staje się kluczowy. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
W inżynierii odwrotnej, **Smali** staje się kluczowe. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
## Intencje
Intencje są podstawowym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
Intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
Tak więc intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
Aby uprościć, intencja może być używana:
* Do uruchamiania aktywności, zazwyczaj otwierając interfejs użytkownika dla aplikacji
@ -132,7 +132,7 @@ Jeśli są podatne, **intencje mogą być używane do przeprowadzania różnych
Filtry intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie zachowali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie zachowali te komponenty jako prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Ponadto, deweloperzy mają możliwość dalszego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
```java
@ -146,7 +146,7 @@ Intencje są programowo tworzone za pomocą konstruktora Intent:
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
The **Action** of the previously declared intent is **ACTION\_SEND** and the **Extra** is a mailto **Uri** (the Extra if the extra information the intent is expecting).
The **Action** wcześniej zadeklarowanego zamiaru to **ACTION\_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których oczekuje zamiar).
Ten zamiar powinien być zadeklarowany w manifeście, jak w następującym przykładzie:
```xml
@ -179,18 +179,18 @@ Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikac
### Broadcast Intents
W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jedną aplikację, intencje rozgłoszeniowe **mogą być odbierane przez wiele aplikacji**. Jednak od wersji API 14, **możliwe jest określenie aplikacji, która powinna otrzymać** wiadomość, używając Intent.setPackage.
W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jedną aplikację, intencje broadcast **mogą być odbierane przez wiele aplikacji**. Jednak od wersji API 14, **możliwe jest określenie aplikacji, która powinna otrzymać** wiadomość, używając Intent.setPackage.
Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyłania rozgłoszenia**. Aplikacja odbierająca będzie musiała mieć to uprawnienie.
Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyłania broadcastu**. Aplikacja odbierająca będzie musiała mieć to uprawnienie.
Istnieją **dwa typy** rozgłoszeń: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać rozgłoszenie.**
Istnieją **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
Możliwe jest **wysłanie** **rozgłoszenia** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuszcza aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
### Sticky Broadcasts
Ten rodzaj rozgłoszeń **może być dostępny długo po ich wysłaniu**.\
Ten rodzaj broadcastów **może być dostępny długo po ich wysłaniu**.\
Zostały one wycofane w poziomie API 21 i zaleca się **nie używać ich**.\
**Pozwalają każdej aplikacji na podsłuchiwanie danych, ale także na ich modyfikację.**
@ -212,7 +212,7 @@ Schemat musi być zadeklarowany w pliku **`AndroidManifest.xml`**:
</intent-filter>
[...]
```
Schemat z poprzedniego przykładu to `exampleapp://` (zauważ również **`category BROWSABLE`**)
Schemat z poprzedniego przykładu to `examplescheme://` (zauważ również **`kategoria BROWSABLE`**)
Następnie, w polu danych, możesz określić **host** i **path**:
```xml
@ -231,7 +231,7 @@ Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](./#exploiting-
## AIDL - Android Interface Definition Language
**Android Interface Definition Language (AIDL)** jest zaprojektowany w celu ułatwienia komunikacji między klientem a usługą w aplikacjach Android poprzez **komunikację międzyprocesową** (IPC). Ponieważ bezpośredni dostęp do pamięci innego procesu nie jest dozwolony w Androidzie, AIDL upraszcza ten proces, marshalling obiektów do formatu zrozumiałego dla systemu operacyjnego, co ułatwia komunikację między różnymi procesami.
**Android Interface Definition Language (AIDL)** jest zaprojektowany w celu ułatwienia komunikacji między klientem a usługą w aplikacjach Android poprzez **interprocess communication** (IPC). Ponieważ bezpośredni dostęp do pamięci innego procesu nie jest dozwolony w Androidzie, AIDL upraszcza ten proces, marshalling obiektów do formatu zrozumiałego dla systemu operacyjnego, co ułatwia komunikację między różnymi procesami.
### Kluczowe pojęcia
@ -243,7 +243,7 @@ Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](./#exploiting-
## Komponenty
Należą do nich: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
Obejmują: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
### Aktywność uruchamiająca i inne aktywności
@ -260,7 +260,7 @@ W aplikacjach Android **aktywności** są jak ekrany, pokazujące różne częś
```
Nie wszystkie aplikacje potrzebują aktywności uruchamiającej, szczególnie te bez interfejsu użytkownika, takie jak usługi w tle.
Aktywności mogą być udostępniane innym aplikacjom lub procesom, oznaczając je jako "exported" w manifeście. To ustawienie pozwala innym aplikacjom na uruchomienie tej aktywności:
Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznaczenie ich jako "exported" w manifeście. To ustawienie pozwala innym aplikacjom na uruchomienie tej aktywności:
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
@ -290,7 +290,7 @@ super.onCreate();
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na różne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punktu wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używana jest metoda `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używana jest metoda `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku manifestu Androida:
```xml
@ -308,7 +308,7 @@ Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceiv
### Content Provider
**Content Providers** są niezbędne do **dzielenia się danymi strukturalnymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany za pomocą ustawień **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
**Content Providers** są niezbędne do **dzielenia się danymi strukturalnymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany poprzez ustawienia **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()`, i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
@ -366,7 +366,7 @@ Aby kontrolować dostęp do plików:
### **Mobile Device Management (MDM)**
- **Rozwiązania MDM** zapewniają **nadzór i bezpieczeństwo** dla urządzeń mobilnych poprzez **API administracji urządzeniami**. Wymagają one zainstalowania aplikacji Android, aby skutecznie zarządzać i zabezpieczać urządzenia mobilne. Kluczowe funkcje obejmują **egzekwowanie polityk haseł**, **wymuszanie szyfrowania pamięci** oraz **zezwalanie na zdalne usuwanie danych**, zapewniając kompleksową kontrolę i bezpieczeństwo nad urządzeniami mobilnymi.
- **Rozwiązania MDM** zapewniają **nadzór i bezpieczeństwo** dla urządzeń mobilnych poprzez **API administracji urządzeniami**. Wymagają one zainstalowania aplikacji Android do skutecznego zarządzania i zabezpieczania urządzeń mobilnych. Kluczowe funkcje obejmują **egzekwowanie polityk haseł**, **wymuszanie szyfrowania pamięci** oraz **zezwalanie na zdalne usuwanie danych**, zapewniając kompleksową kontrolę i bezpieczeństwo nad urządzeniami mobilnymi.
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);