mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['mobile-pentesting/android-app-pentesting/android-applicatio
This commit is contained in:
parent
a7032c7ad9
commit
d8935aa511
1 changed files with 23 additions and 23 deletions
|
@ -34,7 +34,7 @@
|
|||
### Пісочниця
|
||||
|
||||
**Пісочниця Android-додатків** дозволяє запускати **кожен додаток** як **окремий процес під окремим ідентифікатором користувача**. Кожен процес має свою віртуальну машину, тому код додатка виконується в ізоляції від інших додатків.\
|
||||
З Android 5.0(L) **впроваджено SELinux**. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
|
||||
З Android 5.0(L) **SELinux** є обов'язковим. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
|
||||
|
||||
### Дозволи
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
|||
|
||||
## Попередньо встановлені додатки
|
||||
|
||||
Ці додатки зазвичай знаходяться в каталогах **`/system/app`** або **`/system/priv-app`**, і деякі з них **оптимізовані** (ви навіть можете не знайти файл `classes.dex`). Ці додатки варто перевірити, оскільки іноді вони **працюють з надто багатьма дозволами** (як root).
|
||||
Ці додатки зазвичай знаходяться в каталогах **`/system/app`** або **`/system/priv-app`**, і деякі з них є **оптимізованими** (ви навіть можете не знайти файл `classes.dex`). Ці додатки варто перевірити, оскільки іноді вони **працюють з надто багатьма дозволами** (як root).
|
||||
|
||||
* Ті, що постачаються з **AOSP** (Android OpenSource Project) **ROM**
|
||||
* Додані виробником **пристрою**
|
||||
|
@ -62,7 +62,7 @@
|
|||
|
||||
## Рутування
|
||||
|
||||
Щоб отримати доступ root на фізичному пристрої Android, вам зазвичай потрібно **експлуатувати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
|
||||
Щоб отримати доступ root на фізичному пристрої Android, вам зазвичай потрібно **використати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
|
||||
Після того, як експлуатація спрацювала, зазвичай бінарний файл Linux `su` копіюється в місце, вказане в змінній середовища PATH користувача, наприклад, `/system/xbin`.
|
||||
|
||||
Після налаштування бінарного файлу su використовується інший Android-додаток для взаємодії з бінарним файлом `su` та **обробки запитів на доступ root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
|
||||
|
@ -74,7 +74,7 @@
|
|||
### ROM
|
||||
|
||||
Можливо **замінити ОС, встановивши власне програмне забезпечення**. Це дозволяє розширити корисність старого пристрою, обійти програмні обмеження або отримати доступ до останнього коду Android.\
|
||||
**OmniROM** та **LineageOS** є двома з найпопулярніших прошивок для використання.
|
||||
**OmniROM** та **LineageOS** є двома найпопулярнішими прошивками для використання.
|
||||
|
||||
Зверніть увагу, що **не завжди необхідно рутувати пристрій**, щоб встановити власне програмне забезпечення. **Деякі виробники дозволяють** розблокування своїх завантажувачів у добре задокументований і безпечний спосіб.
|
||||
|
||||
|
@ -97,7 +97,7 @@
|
|||
- lib/
|
||||
- Містить рідні бібліотеки, розділені за архітектурою ЦП в підкаталогах.
|
||||
- `armeabi`: код для процесорів на базі ARM
|
||||
- `armeabi-v7a`: код для процесорів ARMv7 та вище
|
||||
- `armeabi-v7a`: код для процесорів ARMv7 і вище
|
||||
- `x86`: код для процесорів X86
|
||||
- `mips`: код лише для процесорів MIPS
|
||||
- assets/
|
||||
|
@ -107,7 +107,7 @@
|
|||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
У розробці Android використовується **Java або Kotlin** для створення додатків. Замість використання JVM, як у настільних додатках, Android компілює цей код у **Dalvik Executable (DEX) байт-код**. Раніше цим байт-кодом займалася віртуальна машина Dalvik, але тепер Android Runtime (ART) бере на себе цю функцію в новіших версіях Android.
|
||||
У розробці Android використовується **Java або Kotlin** для створення додатків. Замість використання JVM, як у настільних додатках, Android компілює цей код у **Dalvik Executable (DEX) байт-код**. Раніше байт-код обробляв віртуальна машина Dalvik, але тепер Android Runtime (ART) бере на себе цю функцію в новіших версіях Android.
|
||||
|
||||
Для реверс-інжинірингу **Smali** стає критично важливим. Це читабельна людиною версія DEX байт-коду, яка діє як асемблерна мова, перетворюючи вихідний код на інструкції байт-коду. Smali та baksmali відносяться до інструментів асемблювання та розбирання в цьому контексті.
|
||||
|
||||
|
@ -115,7 +115,7 @@
|
|||
|
||||
Інтенти є основним засобом, за допомогою якого Android-додатки спілкуються між своїми компонентами або з іншими додатками. Ці об'єкти повідомлень також можуть переносити дані між додатками або компонентами, подібно до того, як використовуються запити GET/POST у HTTP-комунікаціях.
|
||||
|
||||
Отже, Інтент - це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути спрямовані** на конкретні компоненти або додатки, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Отже, Інтент — це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути надіслані** конкретним компонентам або додаткам, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Простими словами, Інтент можна використовувати:
|
||||
|
||||
* Для запуску Activity, зазвичай відкриваючи інтерфейс користувача для додатку
|
||||
|
@ -128,13 +128,13 @@
|
|||
|
||||
### Фільтр Інтентів
|
||||
|
||||
**Фільтри Інтентів** визначають **як активність, сервіс або приймач трансляцій можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів - це файл **AndroidManifest.xml**, хоча для приймачів трансляцій також є можливість їх кодування.
|
||||
**Фільтри Інтентів** визначають **як Activity, сервіс або Broadcast Receiver можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів — це **файл AndroidManifest.xml**, хоча для Broadcast Receiver також є можливість їх кодування.
|
||||
|
||||
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця конфігурація дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
|
||||
|
||||
Критичним аспектом Android-компонентів (активності/сервіси/постачальники контенту/приймачі трансляцій) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`експортується`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак є спосіб для розробників явно зберегти ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`експортується`** на **`false`** у їхніх визначеннях маніфесту.
|
||||
Критичним аспектом Android-компонентів (активності/сервіси/постачальники контенту/трансляційні приймачі) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак є спосіб для розробників явно зберегти ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їхніх визначеннях маніфесту.
|
||||
|
||||
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити доступ лише для додатків з призначеним дозволом, додаючи додатковий рівень безпеки та контролю над тим, хто може з ним взаємодіяти.
|
||||
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити доступ лише для додатків з призначеним дозволом, додаючи додатковий рівень безпеки та контролю над тим, хто може взаємодіяти з ним.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
|
@ -146,9 +146,9 @@
|
|||
```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** of the previously declared intent is **ACTION\_SEND** and the **Extra** is a mailto **Uri** (додаткова інформація, яку очікує намір).
|
||||
|
||||
Цей намір повинен бути оголошений у маніфесті, як у наступному прикладі:
|
||||
This intent should be declared inside the manifest as in the following example:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
|
@ -167,7 +167,7 @@ The **Action** of the previously declared intent is **ACTION\_SEND** and the **E
|
|||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
В інших додатках, щоб отримати доступ до раніше оголошеного наміру, ви можете використовувати:
|
||||
В інших додатках для доступу до раніше оголошеного наміру ви можете використовувати:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
|
@ -185,7 +185,7 @@ context.startService(intent);
|
|||
|
||||
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, передавати або відхиляти широкомовлення.**
|
||||
|
||||
Можливо **відправити** **широкомовлення** за допомогою функції `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Можна **відправити** **широкомовлення**, використовуючи функцію `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Ви також можете використовувати функцію **`sendBroadcast`** з **`LocalBroadCastManager`**, яка забезпечує, що **повідомлення ніколи не покидає додаток**. Використовуючи це, вам навіть не потрібно експортувати компонент отримувача.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
@ -198,9 +198,9 @@ context.startService(intent);
|
|||
|
||||
## Deep links / URL schemes
|
||||
|
||||
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретної **схеми URL** в межах активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
|
||||
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретного **схеми URL** в межах активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
|
||||
|
||||
Схема повинна бути оголошена в файлі **`AndroidManifest.xml`**:
|
||||
Схема повинна бути оголошена у файлі **`AndroidManifest.xml`**:
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
|
@ -212,9 +212,9 @@ context.startService(intent);
|
|||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
Схема з попереднього прикладу - `exampleapp://` (також зверніть увагу на **`category BROWSABLE`**)
|
||||
Схема з попереднього прикладу - `examplescheme://` (також зверніть увагу на **`категорія BROWSABLE`**)
|
||||
|
||||
Тоді в полі даних ви можете вказати **host** та **path**:
|
||||
Тоді в полі даних ви можете вказати **хост** та **шлях**:
|
||||
```xml
|
||||
<data android:scheme="examplescheme"
|
||||
android:host="example"
|
||||
|
@ -231,7 +231,7 @@ android:host="example"
|
|||
|
||||
## AIDL - Мова визначення інтерфейсу Android
|
||||
|
||||
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення зв'язку між клієнтом і сервісом в Android-додатках через **міжпроцесорну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує зв'язок між різними процесами.
|
||||
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення зв'язку між клієнтом і сервісом в Android-додатках через **міжпроцесорну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує комунікацію між різними процесами.
|
||||
|
||||
### Ключові концепції
|
||||
|
||||
|
@ -243,13 +243,13 @@ android:host="example"
|
|||
|
||||
## Компоненти
|
||||
|
||||
Це включає: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
|
||||
До них відносяться: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
|
||||
|
||||
### Активність запуску та інші активності
|
||||
|
||||
У Android-додатках **активності** подібні до екранів, що показують різні частини інтерфейсу користувача додатку. Додаток може мати багато активностей, кожна з яких представляє унікальний екран для користувача.
|
||||
|
||||
**Активність запуску** є основним шлюзом до додатку, запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
|
||||
**Активність запуску** є основним шлюзом до додатку, який запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -266,7 +266,7 @@ android:host="example"
|
|||
```
|
||||
Однак доступ до активності з іншого додатку не завжди є ризиком для безпеки. Проблема виникає, якщо чутливі дані передаються неналежним чином, що може призвести до витоків інформації.
|
||||
|
||||
Життєвий цикл активності **починається з методу onCreate**, налаштовуючи UI та готуючи активність до взаємодії з користувачем.
|
||||
Життєвий цикл активності **починається з методу onCreate**, налаштовуючи інтерфейс користувача та готуючи активність до взаємодії з користувачем.
|
||||
|
||||
### Підклас додатку
|
||||
|
||||
|
@ -358,7 +358,7 @@ JavaScript "Bridge" дозволяє Java об'єктам взаємодіяти
|
|||
|
||||
### **Цифровий підпис додатків**
|
||||
|
||||
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичне авторство** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, захищаючи від несанкціонованого доступу та забезпечуючи, щоб додаток залишався незмінним під час доставки на пристрій.
|
||||
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичне авторство** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, захищаючи від несанкціонованого доступу та забезпечуючи, щоб додаток залишався незмінним під час його доставки на пристрій.
|
||||
|
||||
### **Перевірка додатків для підвищення безпеки**
|
||||
|
||||
|
|
Loading…
Reference in a new issue