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
5bbf10be49
commit
1af43702fd
@ -10,7 +10,7 @@
|
||||
|
||||
- **Активність 1** починається як єдина активність на передньому плані.
|
||||
- Запуск **Активності 2** переміщує **Активність 1** у стек назад, виводячи **Активність 2** на передній план.
|
||||
- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеку, з **Активністю 3** тепер спереду.
|
||||
- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеці, з **Активністю 3** тепер попереду.
|
||||
- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завданнями в Android.
|
||||
|
||||
.png>)
|
||||
@ -19,25 +19,31 @@
|
||||
|
||||
### Огляд афінності завдання та режимів запуску
|
||||
|
||||
В Android-додатках, **афінність завдання** вказує на переважне завдання активності, зазвичай відповідне назві пакета додатка. Ця настройка є важливою для створення демонстраційного додатка (PoC) для демонстрації атаки.
|
||||
В Android-додатках, **афінність завдання** вказує на переважне завдання активності, зазвичай відповідне назві пакета програми. Ця настройка є важливою для створення демонстраційного додатка (PoC) для демонстрації атаки.
|
||||
|
||||
### Режими запуску
|
||||
|
||||
Атрибут `launchMode` визначає обробку екземплярів активностей у завданнях. Режим **singleTask** є ключовим для цієї атаки, визначаючи три сценарії на основі існуючих екземплярів активностей та відповідностей афінності завдання. Експлуатація базується на здатності додатка зловмисника імітувати афінність завдання цільового додатка, вводячи в оману систему Android, щоб запустити додаток зловмисника замість цільового.
|
||||
Атрибут `launchMode` визначає обробку екземплярів активностей у завданнях. Режим **singleTask** є ключовим для цієї атаки, визначаючи три сценарії на основі існуючих екземплярів активностей та відповідності афінності завдання. Експлуатація базується на здатності додатка зловмисника імітувати афінність завдання цільового додатка, вводячи в оману систему Android, щоб запустити додаток зловмисника замість цільового.
|
||||
|
||||
### Детальні кроки атаки
|
||||
|
||||
1. **Встановлення шкідливого додатка**: Жертва встановлює додаток зловмисника на своєму пристрої.
|
||||
2. **Початкова активація**: Жертва спочатку відкриває шкідливий додаток, готуючи пристрій до атаки.
|
||||
3. **Спроба запуску цільового додатка**: Жертва намагається відкрити цільовий додаток.
|
||||
4. **Виконання захоплення**: Завдяки відповідності афінності завдання, шкідливий додаток запускається замість цільового додатка.
|
||||
4. **Виконання захоплення**: У якийсь момент додаток намагається відкрити вигляд **singleTask**. Завдяки відповідності афінності завдання, шкідливий додаток запускається замість цільового додатка.
|
||||
5. **Оману**: Шкідливий додаток показує фальшивий екран входу, що нагадує цільовий додаток, обманюючи користувача на введення чутливої інформації.
|
||||
|
||||
> [!TIP]
|
||||
> Зверніть увагу, що для успішної атаки вразливий вигляд **не повинен мати експортований в true** і не повинен бути основною активністю.
|
||||
|
||||
Для практичної реалізації цієї атаки зверніться до репозиторію Task Hijacking Strandhogg на GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||
|
||||
### Заходи запобігання
|
||||
|
||||
Щоб запобігти таким атакам, розробники можуть встановити `taskAffinity` на порожній рядок і вибрати режим запуску `singleInstance`, забезпечуючи ізоляцію свого додатка від інших. Налаштування функції `onBackPressed()` пропонує додатковий захист від захоплення завдань.
|
||||
Щоб запобігти таким атакам, розробники можуть:
|
||||
- Встановити **`**taskAffinity`** вигляду **singleTask** на порожній рядок (`android:taskAffinity=""`)
|
||||
- Вибрати режим запуску **`singleInstance`**, забезпечуючи ізоляцію свого додатка від інших.
|
||||
- Налаштувати функцію **`onBackPressed()`**, що пропонує додатковий захист від захоплення завдань.
|
||||
|
||||
## **Посилання**
|
||||
|
||||
|
@ -1,30 +1,38 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Аналіз додатків React Native
|
||||
# Аналіз додатка React Native
|
||||
|
||||
Щоб підтвердити, чи був додаток створений на основі фреймворку React Native, виконайте ці кроки:
|
||||
|
||||
1. Перейменуйте файл APK з розширенням zip і витягніть його в нову папку, використовуючи команду `cp com.example.apk example-apk.zip` та `unzip -qq example-apk.zip -d ReactNative`.
|
||||
1. Перейменуйте файл APK з розширенням zip і витягніть його в нову папку, використовуючи команди `cp com.example.apk example-apk.zip` та `unzip -qq example-apk.zip -d ReactNative`.
|
||||
|
||||
2. Перейдіть до новоствореної папки ReactNative і знайдіть папку assets. Усередині цієї папки ви повинні знайти файл `index.android.bundle`, який містить React JavaScript у мінімізованому форматі.
|
||||
|
||||
3. Використовуйте команду `find . -print | grep -i ".bundle$"` для пошуку файлу JavaScript.
|
||||
|
||||
Щоб далі проаналізувати код JavaScript, створіть файл з назвою `index.html` у тій же директорії з наступним кодом:
|
||||
## Javascript Код
|
||||
|
||||
Якщо перевіряючи вміст `index.android.bundle`, ви знайдете JavaScript код додатка (навіть якщо він мінімізований), ви можете **аналізувати його для виявлення чутливої інформації та вразливостей**.
|
||||
|
||||
Оскільки бандл фактично містить увесь JS код додатка, можливо **поділити його на різні файли** (потенційно спрощуючи його реверс-інжиніринг), використовуючи **інструмент [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
|
||||
### Webpack
|
||||
|
||||
Щоб додатково проаналізувати JavaScript код, ви можете завантажити файл на [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) або виконати ці кроки:
|
||||
|
||||
1. Створіть файл з назвою `index.html` у тій же директорії з наступним кодом:
|
||||
```html
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
Ви можете завантажити файл на [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) або дотримуватися цих кроків:
|
||||
2. Відкрийте файл `index.html` у Google Chrome.
|
||||
|
||||
1. Відкрийте файл `index.html` у Google Chrome.
|
||||
3. Відкрийте панель розробника, натиснувши **Command+Option+J для OS X** або **Control+Shift+J для Windows**.
|
||||
|
||||
2. Відкрийте панель розробника, натиснувши **Command+Option+J для OS X** або **Control+Shift+J для Windows**.
|
||||
4. Клацніть на "Sources" у панелі розробника. Ви повинні побачити файл JavaScript, який розділений на папки та файли, що складають основний пакет.
|
||||
|
||||
3. Клацніть на "Sources" у панелі розробника. Ви повинні побачити файл JavaScript, який розділений на папки та файли, що складають основний пакет.
|
||||
Якщо ви знайдете файл під назвою `index.android.bundle.map`, ви зможете проаналізувати вихідний код у немінімізованому форматі. Файли карт містять відображення виходу, що дозволяє вам відображати мінімізовані ідентифікатори.
|
||||
|
||||
Якщо ви знайдете файл під назвою `index.android.bundle.map`, ви зможете проаналізувати вихідний код у немінімізованому форматі. Файли мап містять відображення виходу, що дозволяє вам відображати мінімізовані ідентифікатори.
|
||||
|
||||
Щоб шукати чутливі облікові дані та кінцеві точки, дотримуйтесь цих кроків:
|
||||
Щоб знайти чутливі облікові дані та кінцеві точки, дотримуйтесь цих кроків:
|
||||
|
||||
1. Визначте чутливі ключові слова для аналізу коду JavaScript. Додатки React Native часто використовують сторонні сервіси, такі як Firebase, кінцеві точки сервісу AWS S3, приватні ключі тощо.
|
||||
|
||||
@ -32,8 +40,42 @@
|
||||
|
||||
3. Було щасливо, що чутливі жорстко закодовані облікові дані були знайдені в коді JavaScript під час процесу розвідки.
|
||||
|
||||
## References
|
||||
### Змінити код JS і перебудувати
|
||||
|
||||
У цьому випадку змінити код легко. Вам просто потрібно перейменувати додаток, щоб використовувати розширення `.zip` і витягти його. Потім ви можете **змінити код JS всередині цього пакету і перебудувати додаток**. Це повинно бути достатньо, щоб дозволити вам **впровадити код** у додаток для тестування.
|
||||
|
||||
## Байткод Hermes
|
||||
|
||||
Якщо пакет містить **байткод Hermes**, ви **не зможете отримати доступ до коду Javascript** додатка (навіть до мінімізованої версії).
|
||||
|
||||
Ви можете перевірити, чи містить пакет байткод Hermes, виконавши наступну команду:
|
||||
```bash
|
||||
file index.android.bundle
|
||||
index.android.bundle: Hermes JavaScript bytecode, version 96
|
||||
```
|
||||
Однак ви можете використовувати інструменти **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** або **[hermes_rs](https://github.com/Pilfer/hermes_rs)** для **дизасемблювання байт-коду** та також для **декомпіляції його в деякий псевдо JS код**. Для цього, наприклад, ці команди:
|
||||
```bash
|
||||
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
```
|
||||
### Зміна коду та перебудова
|
||||
|
||||
Ідеально, ви повинні мати можливість змінити дизасембльований код (змінивши порівняння, або значення, або що б ви не хотіли змінити) і потім **перебудувати байт-код** і потім перебудувати додаток.
|
||||
|
||||
Інструмент **[hbctool](https://github.com/bongtrop/hbctool)** підтримує дизасемблювання пакету та його повторну збірку після внесення змін, однак він **підтримує лише старі версії** байт-коду Hermes.
|
||||
|
||||
Інструмент **[hermes-dec](https://github.com/P1sec/hermes-dec)** не підтримує перебудову байт-коду.
|
||||
|
||||
Інструмент **[hermes_rs](https://github.com/Pilfer/hermes_rs)** підтримує перебудову байт-коду, але насправді це бібліотека, а не CLI інструмент.
|
||||
|
||||
## Динамічний аналіз
|
||||
|
||||
Ви можете спробувати динамічно проаналізувати додаток, використовуючи Frida, щоб увімкнути режим розробника React додатку та використовувати **`react-native-debugger`** для підключення до нього. Однак для цього вам, очевидно, потрібен вихідний код додатку. Ви можете знайти більше інформації про це в [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
|
||||
## Посилання
|
||||
|
||||
- [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,11 +5,13 @@
|
||||
## **Основна інформація**
|
||||
|
||||
**Tapjacking** - це атака, коли **шкідлива** **додаток** запускається і **розташовується поверх додатку жертви**. Як тільки він видимо закриває додаток жертви, його інтерфейс користувача спроектований таким чином, щоб обманути користувача взаємодіяти з ним, в той час як він передає взаємодію до додатку жертви.\
|
||||
Таким чином, він **осліплює користувача, не даючи йому знати, що він насправді виконує дії в додатку жертви**.
|
||||
В результаті, це **осліплює користувача, не даючи йому знати, що він насправді виконує дії в додатку жертви**.
|
||||
|
||||
### Виявлення
|
||||
|
||||
Щоб виявити додатки, вразливі до цієї атаки, вам слід шукати **експортовані активності** в маніфесті android (зверніть увагу, що активність з intent-filter автоматично експортується за замовчуванням). Як тільки ви знайдете експортовані активності, **перевірте, чи потребують вони будь-яких дозволів**. Це пов'язано з тим, що **шкідливий додаток також потребуватиме цього дозволу**.
|
||||
Щоб виявити додатки, вразливі до цієї атаки, ви повинні шукати **експортовані активності** в маніфесті android (зверніть увагу, що активність з intent-filter автоматично експортується за замовчуванням). Як тільки ви знайдете експортовані активності, **перевірте, чи потребують вони будь-яких дозволів**. Це пов'язано з тим, що **шкідливий додаток також потребуватиме цього дозволу**.
|
||||
|
||||
Ви також можете перевірити мінімальну версію SDK додатку, перевіряючи значення **`android:minSdkVersion`** у файлі **`AndroidManifest.xml`**. Якщо значення **менше 30**, додаток вразливий до Tapjacking.
|
||||
|
||||
### Захист
|
||||
|
||||
@ -37,9 +39,9 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
Найбільш **остання Android програма**, що виконує атаку Tapjacking (+ виклик перед експортованою активністю атакованої програми) можна знайти за адресою: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
Найбільш **сучасний Android додаток**, що виконує атаку Tapjacking (+ виклик перед експортованою активністю атакованого додатку) можна знайти за адресою: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
Слідуйте **інструкціям README для використання**.
|
||||
Слідуйте **інструкціям README для його використання**.
|
||||
|
||||
### FloatingWindowApp
|
||||
|
||||
@ -50,13 +52,13 @@ android:filterTouchesWhenObscured="true">
|
||||
> [!CAUTION]
|
||||
> Схоже, що цей проект зараз не підтримується, і ця функціональність більше не працює належним чином
|
||||
|
||||
Ви можете використовувати [**qark**](https://github.com/linkedin/qark) з параметрами `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, щоб створити шкідливу програму для перевірки можливих **Tapjacking** вразливостей.\
|
||||
Ви можете використовувати [**qark**](https://github.com/linkedin/qark) з параметрами `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` для створення шкідливого додатку для тестування на можливі **Tapjacking** вразливості.\
|
||||
|
||||
Пом'якшення є відносно простим, оскільки розробник може вибрати не отримувати події дотику, коли видимість перекрита іншим. Використовуючи [Довідник розробника Android](https://developer.android.com/reference/android/view/View#security):
|
||||
Пом'якшення є відносно простим, оскільки розробник може вибрати не отримувати події дотику, коли видимість перекрита іншим. Використовуючи [Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Іноді важливо, щоб програма могла перевірити, що дія виконується з повним усвідомленням і згодою користувача, наприклад, надання запиту на дозвіл, здійснення покупки або натискання на рекламу. На жаль, шкідлива програма може спробувати обманути користувача, змусивши його виконати ці дії, не усвідомлюючи цього, приховуючи справжню мету вигляду. Як засіб, фреймворк пропонує механізм фільтрації дотиків, який можна використовувати для підвищення безпеки виглядів, що надають доступ до чутливої функціональності.
|
||||
> Іноді важливо, щоб додаток могло перевірити, що дія виконується з повним усвідомленням і згодою користувача, наприклад, надання запиту на дозвіл, здійснення покупки або натискання на рекламу. На жаль, шкідливий додаток може спробувати обманути користувача, змусивши його виконати ці дії, не усвідомлюючи цього, приховуючи справжню мету вигляду. Як засіб вирішення, фреймворк пропонує механізм фільтрації дотиків, який можна використовувати для покращення безпеки виглядів, що надають доступ до чутливої функціональності.
|
||||
>
|
||||
> Щоб увімкнути фільтрацію дотиків, викликайте [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) або встановіть атрибут макета android:filterTouchesWhenObscured в true. Коли це увімкнено, фреймворк відкине дотики, які отримуються, коли вікно вигляду перекривається іншим видимим вікном. В результаті вигляд не отримає дотиків, коли над вікном вигляду з'являється toast, діалог або інше вікно.
|
||||
> Щоб увімкнути фільтрацію дотиків, викликайте [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) або встановіть атрибут макета android:filterTouchesWhenObscured в true. Коли це увімкнено, фреймворк відкине дотики, які отримуються, коли вікно вигляду перекрито іншим видимим вікном. В результаті вигляд не отримає дотики, коли над вікном вигляду з'являється toast, діалог або інше вікно.
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -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