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-task-h
This commit is contained in:
parent
37fae95b79
commit
a1117b5137
@ -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.
|
||||
|
||||
.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)
|
||||
|
@ -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}}
|
||||
|
@ -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):
|
||||
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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 -->
|
||||
|
Loading…
x
Reference in New Issue
Block a user