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

This commit is contained in:
Translator 2025-02-25 22:35:00 +00:00
parent 37fae95b79
commit a1117b5137
5 changed files with 88 additions and 36 deletions

View File

@ -2,44 +2,50 @@
{{#include ../../banners/hacktricks-training.md}}
## Task, Back Stack and Foreground Activities
## Zadania, Stos Wsteczny i Aktywności w Pierwszym Planie
W Androidzie, **task** to zasadniczo zestaw aktywności, z którymi użytkownicy wchodzą w interakcję, aby wykonać określone zadanie, zorganizowane w **back stack**. Ten stos porządkuje aktywności na podstawie momentu ich otwarcia, z najnowszą aktywnością wyświetlaną na górze jako **foreground activity**. W każdej chwili tylko ta aktywność jest widoczna na ekranie, co czyni ją częścią **foreground task**.
W Androidzie, **zadanie** to zasadniczo zestaw aktywności, z którymi użytkownicy wchodzą w interakcję, aby wykonać określone zadanie, zorganizowane w **stos wsteczny**. Stos ten porządkuje aktywności na podstawie momentu ich otwarcia, z najnowszą aktywnością wyświetlaną na górze jako **aktywność w pierwszym planie**. W każdej chwili tylko ta aktywność jest widoczna na ekranie, co czyni ją częścią **zadania w pierwszym planie**.
Oto szybkie podsumowanie przejść między aktywnościami:
- **Activity 1** zaczyna jako jedyna aktywność w foreground.
- Uruchomienie **Activity 2** przesuwa **Activity 1** do back stack, przynosząc **Activity 2** na foreground.
- Rozpoczęcie **Activity 3** przesuwa **Activity 1** i **Activity 2** dalej w stosie, z **Activity 3** teraz na przodzie.
- Zamknięcie **Activity 3** przywraca **Activity 2** na foreground, pokazując uproszczony mechanizm nawigacji zadań w Androidzie.
- **Aktywność 1** zaczyna jako jedyna aktywność w pierwszym planie.
- Uruchomienie **Aktywności 2** przesuwa **Aktywność 1** do stosu wstecznego, przynosząc **Aktywność 2** na pierwszy plan.
- Rozpoczęcie **Aktywności 3** przesuwa **Aktywność 1** i **Aktywność 2** dalej w stosie, z **Aktywnością 3** teraz na przodzie.
- Zamknięcie **Aktywności 3** przywraca **Aktywność 2** na pierwszy plan, pokazując uproszczony mechanizm nawigacji zadań w Androidzie.
![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>)
## Task affinity attack
## Atak na afinity zadania
### Overview of Task Affinity and Launch Modes
### Przegląd afinity zadania i trybów uruchamiania
W aplikacjach Android, **task affinity** określa preferowany task dla aktywności, zazwyczaj zgodny z nazwą pakietu aplikacji. Ta konfiguracja jest kluczowa w tworzeniu aplikacji proof-of-concept (PoC) do demonstrowania ataku.
W aplikacjach Android, **afinity zadania** określa preferowane zadanie aktywności, zazwyczaj zgodne z nazwą pakietu aplikacji. Ta konfiguracja jest kluczowa w tworzeniu aplikacji proof-of-concept (PoC) do demonstrowania ataku.
### Launch Modes
### Tryby uruchamiania
Atrybut `launchMode` kieruje obsługą instancji aktywności w ramach zadań. Tryb **singleTask** jest kluczowy dla tego ataku, dyktując trzy scenariusze w oparciu o istniejące instancje aktywności i dopasowania task affinity. Wykorzystanie polega na zdolności aplikacji atakującego do naśladowania task affinity aplikacji docelowej, wprowadzając system Android w błąd, aby uruchomił aplikację atakującego zamiast zamierzonej.
Atrybut `launchMode` kieruje obsługą instancji aktywności w zadaniach. Tryb **singleTask** jest kluczowy dla tego ataku, dyktując trzy scenariusze w oparciu o istniejące instancje aktywności i dopasowania afinity zadania. Wykorzystanie polega na zdolności aplikacji atakującego do naśladowania afinity zadania aplikacji docelowej, wprowadzając system Android w błąd, aby uruchomił aplikację atakującego zamiast zamierzonej ofiary.
### Detailed Attack Steps
### Szczegółowe kroki ataku
1. **Instalacja złośliwej aplikacji**: Ofiara instaluje aplikację atakującego na swoim urządzeniu.
2. **Początkowa aktywacja**: Ofiara najpierw otwiera złośliwą aplikację, przygotowując urządzenie do ataku.
3. **Próba uruchomienia aplikacji docelowej**: Ofiara próbuje otworzyć aplikację docelową.
4. **Wykonanie przejęcia**: Z powodu dopasowania task affinity, złośliwa aplikacja jest uruchamiana zamiast aplikacji docelowej.
4. **Wykonanie przejęcia**: W pewnym momencie aplikacja próbuje otworzyć widok **singleTask**. Z powodu dopasowania afinity zadania, złośliwa aplikacja jest uruchamiana zamiast aplikacji docelowej.
5. **Oszustwo**: Złośliwa aplikacja wyświetla fałszywy ekran logowania przypominający aplikację docelową, oszukując użytkownika, aby wprowadził wrażliwe informacje.
> [!TIP]
> Zauważ, że aby ten atak zadziałał, wrażliwy widok **nie musi mieć eksportu ustawionego na true** ani nie musi być główną aktywnością.
Aby uzyskać praktyczną implementację tego ataku, zapoznaj się z repozytorium Task Hijacking Strandhogg na GitHubie: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
### Prevention Measures
### Środki zapobiegawcze
Aby zapobiec takim atakom, deweloperzy mogą ustawić `taskAffinity` na pusty ciąg i wybrać tryb uruchamiania `singleInstance`, zapewniając izolację ich aplikacji od innych. Dostosowanie funkcji `onBackPressed()` oferuje dodatkową ochronę przed przejęciem zadań.
Aby zapobiec takim atakom, deweloperzy mogą:
- Ustawić **`taskAffinity`** widoku **singleTask** na pusty ciąg (`android:taskAffinity=""`)
- Wybrać tryb uruchamiania **`singleInstance`**, zapewniając izolację ich aplikacji od innych.
- Dostosować funkcję **`onBackPressed()`**, co oferuje dodatkową ochronę przed przejęciem zadań.
## **References**
## **Referencje**
- [**https://blog.dixitaditya.com/android-task-hijacking/**](https://blog.dixitaditya.com/android-task-hijacking/)
- [**https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html**](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html)

View File

@ -4,36 +4,78 @@
Aby potwierdzić, czy aplikacja została zbudowana na frameworku React Native, wykonaj następujące kroki:
1. Zmień nazwę pliku APK na plik zip i wypakuj go do nowego folderu, używając polecenia `cp com.example.apk example-apk.zip` oraz `unzip -qq example-apk.zip -d ReactNative`.
1. Zmień nazwę pliku APK na plik zip i rozpakuj go do nowego folderu, używając polecenia `cp com.example.apk example-apk.zip` oraz `unzip -qq example-apk.zip -d ReactNative`.
2. Przejdź do nowo utworzonego folderu ReactNative i zlokalizuj folder assets. Wewnątrz tego folderu powinieneś znaleźć plik `index.android.bundle`, który zawiera React JavaScript w zminimalizowanym formacie.
2. Przejdź do nowo utworzonego folderu ReactNative i zlokalizuj folder assets. W tym folderze powinieneś znaleźć plik `index.android.bundle`, który zawiera React JavaScript w zminifikowanym formacie.
3. Użyj polecenia `find . -print | grep -i ".bundle$"` aby wyszukać plik JavaScript.
Aby dalej analizować kod JavaScript, utwórz plik o nazwie `index.html` w tym samym katalogu z następującym kodem:
## Kod Javascript
Jeśli sprawdzając zawartość `index.android.bundle` znajdziesz kod JavaScript aplikacji (nawet jeśli jest zminifikowany), możesz **analizować go w celu znalezienia wrażliwych informacji i luk w zabezpieczeniach**.
Ponieważ bundle zawiera właściwie cały kod JS aplikacji, możliwe jest **podzielenie go na różne pliki** (co potencjalnie ułatwia jego inżynierię wsteczną) przy użyciu **narzędzia [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Aby dalej analizować kod JavaScript, możesz przesłać plik do [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) lub wykonać następujące kroki:
1. Utwórz plik o nazwie `index.html` w tym samym katalogu z następującym kodem:
```html
<script src="./index.android.bundle"></script>
```
Możesz przesłać plik na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) lub postępować zgodnie z tymi krokami:
2. Otwórz plik `index.html` w Google Chrome.
1. Otwórz plik `index.html` w Google Chrome.
3. Otwórz Narzędzie dewelopera, naciskając **Command+Option+J dla OS X** lub **Control+Shift+J dla Windows**.
2. Otwórz Pasek Narzędzi Dewelopera, naciskając **Command+Option+J dla OS X** lub **Control+Shift+J dla Windows**.
4. Kliknij na "Sources" w Narzędziu dewelopera. Powinieneś zobaczyć plik JavaScript podzielony na foldery i pliki, tworzące główny pakiet.
3. Kliknij na "Sources" w Pasek Narzędzi Dewelopera. Powinieneś zobaczyć plik JavaScript podzielony na foldery i pliki, tworzące główny pakiet.
Jeśli znajdziesz plik o nazwie `index.android.bundle.map`, będziesz mógł analizować kod źródłowy w niezmienionej formie. Pliki map zawierają mapowanie źródła, co pozwala na mapowanie zminimalizowanych identyfikatorów.
Jeśli znajdziesz plik o nazwie `index.android.bundle.map`, będziesz mógł analizować kod źródłowy w formacie niezmienionym. Pliki map zawierają mapowanie źródła, co pozwala na mapowanie zminimalizowanych identyfikatorów.
Aby wyszukać wrażliwe dane uwierzytelniające i punkty końcowe, postępuj zgodnie z tymi krokami:
Aby wyszukać wrażliwe dane uwierzytelniające i punkty końcowe, wykonaj następujące kroki:
1. Zidentyfikuj wrażliwe słowa kluczowe do analizy kodu JavaScript. Aplikacje React Native często korzystają z usług stron trzecich, takich jak Firebase, punkty końcowe usługi AWS S3, klucze prywatne itp.
2. W tym konkretnym przypadku zaobserwowano, że aplikacja korzysta z usługi Dialogflow. Wyszukaj wzór związany z jej konfiguracją.
3. Miałeś szczęście, że wrażliwe dane uwierzytelniające zakodowane na stałe zostały znalezione w kodzie JavaScript podczas procesu rekonesansu.
3. Miałeś szczęście, że wrażliwe dane uwierzytelniające zakodowane na sztywno zostały znalezione w kodzie JavaScript podczas procesu rekonesansu.
## References
### Zmień kod JS i odbuduj
W tym przypadku zmiana kodu jest łatwa. Musisz tylko zmienić nazwę aplikacji, aby używała rozszerzenia `.zip` i wyodrębnić ją. Następnie możesz **zmodyfikować kod JS wewnątrz tego pakietu i odbudować aplikację**. To powinno wystarczyć, aby umożliwić ci **wstrzyknięcie kodu** do aplikacji w celach testowych.
## Hermes bytecode
Jeśli pakiet zawiera **Hermes bytecode**, **nie będziesz mógł uzyskać dostępu do kodu Javascript** aplikacji (nawet do wersji zminimalizowanej).
Możesz sprawdzić, czy pakiet zawiera Hermes bytecode, uruchamiając następujące polecenie:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Możesz jednak użyć narzędzi **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** lub **[hermes_rs](https://github.com/Pilfer/hermes_rs)**, aby **zdekompilować bajtkod** i również **zdekompilować go do pseudo kodu JS**. Aby to zrobić, na przykład te polecenia:
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Zmiana kodu i odbudowa
Idealnie powinieneś być w stanie zmodyfikować zdisasemblerowany kod (zmieniając porównanie, wartość lub cokolwiek, co musisz zmodyfikować), a następnie **odbudować bajtkod** i odbudować aplikację.
Narzędzie **[hbctool](https://github.com/bongtrop/hbctool)** wspiera disasemblerowanie pakietu i ponowne budowanie go po wprowadzeniu zmian, jednak **obsługuje tylko stare wersje** bajtkodu Hermes.
Narzędzie **[hermes-dec](https://github.com/P1sec/hermes-dec)** nie wspiera odbudowy bajtkodu.
Narzędzie **[hermes_rs](https://github.com/Pilfer/hermes_rs)** wspiera odbudowę bajtkodu, ale jest to w rzeczywistości biblioteka, a nie narzędzie CLI.
## Analiza dynamiczna
Możesz spróbować dynamicznie analizować aplikację, używając Frida, aby włączyć tryb dewelopera aplikacji React i użyć **`react-native-debugger`**, aby się do niej podłączyć. Jednak do tego potrzebujesz źródła aplikacji. Więcej informacji na ten temat znajdziesz w [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## Odniesienia
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,17 +5,19 @@
## **Podstawowe informacje**
**Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika do interakcji z nią, podczas gdy przekazuje interakcję do aplikacji ofiary.\
W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**.
W efekcie, **oślepia użytkownika, uniemożliwiając mu zrozumienie, że faktycznie wykonuje akcje w aplikacji ofiary**.
### Wykrywanie
Aby wykryć aplikacje podatne na ten atak, powinieneś szukać **eksportowanych aktywności** w manifeście androida (zauważ, że aktywność z intent-filter jest automatycznie eksportowana domyślnie). Gdy znajdziesz eksportowane aktywności, **sprawdź, czy wymagają jakichkolwiek uprawnień**. Dzieje się tak, ponieważ **złośliwa aplikacja również będzie potrzebować tych uprawnień**.
Aby wykryć aplikacje podatne na ten atak, powinieneś szukać **eksportowanych aktywności** w manifeście androida (zauważ, że aktywność z intencją-filtrującą jest automatycznie eksportowana domyślnie). Gdy znajdziesz eksportowane aktywności, **sprawdź, czy wymagają jakichkolwiek uprawnień**. Dzieje się tak, ponieważ **złośliwa aplikacja również będzie potrzebować tych uprawnień**.
Możesz również sprawdzić minimalną wersję SDK aplikacji, sprawdzając wartość **`android:minSdkVersion`** w pliku **`AndroidManifest.xml`**. Jeśli wartość jest **niższa niż 30**, aplikacja jest podatna na Tapjacking.
### Ochrona
#### Android 12 (API 31,32) i wyższe
[**Zgodnie z tym źródłem**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** ataki tapjacking są automatycznie zapobiegane przez Androida od wersji 12 (API 31 i 30) i wyższe. Tak więc, nawet jeśli aplikacja jest podatna, **nie będziesz w stanie jej wykorzystać**.
[**Zgodnie z tym źródłem**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** ataki tapjacking są automatycznie zapobiegane przez Androida od Androida 12 (API 31 i 30) i wyższych. Tak więc, nawet jeśli aplikacja jest podatna, **nie będziesz w stanie jej wykorzystać**.
#### `filterTouchesWhenObscured`
@ -37,9 +39,9 @@ android:filterTouchesWhenObscured="true">
### Tapjacking-ExportedActivity
Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołując przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
Postępuj zgodnie z **instrukcjami README, aby z niej skorzystać**.
Postępuj zgodnie z **instrukcjami w README, aby z niej skorzystać**.
### FloatingWindowApp
@ -50,7 +52,7 @@ Przykładowy projekt implementujący **FloatingWindowApp**, który można użyć
> [!OSTRZEŻENIE]
> Wygląda na to, że ten projekt jest teraz nieutrzymywany i ta funkcjonalność nie działa już poprawnie
Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **vulnerabilities Tapjacking**.\
Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **wrażliwości na Tapjacking**.\
Łagodzenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla deweloperów Androida](https://developer.android.com/reference/android/view/View#security):

View File

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

View File

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