Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an

This commit is contained in:
Translator 2025-09-08 01:51:32 +00:00
parent 4a86d2398e
commit 43ab4d0498
5 changed files with 607 additions and 397 deletions

View File

@ -1,10 +1,10 @@
# Додатки Android Pentesting
# Pentesting додатків Android
{{#include ../../banners/hacktricks-training.md}}
## Основи додатків Android
Рекомендується почати з цієї сторінки, щоб дізнатися про **найважливіші компоненти, пов'язані з безпекою Android, та найбільш небезпечні складові в Android-додатку**:
Рекомендується почати з цієї сторінки, щоб дізнатися про **найважливіші аспекти, пов'язані з безпекою Android, та найбільш небезпечні компоненти в Android-додатку**:
{{#ref}}
@ -13,23 +13,23 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
This is the main tool you need to connect to an android device (emulated or physical).\
**ADB** дозволяє керувати пристроями по **USB** або **Network** з комп'ютера. Ця утиліта дозволяє **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** apps, **виконувати** shell-команди, **резервно зберігати** дані, **читати** logs, та інші функції.
Це основний інструмент, який потрібен для підключення до Android-пристрою (емульований або фізичний).\
**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дає змогу **копіювання** файлів у обох напрямках, **встановлення** та **видалення** додатків, **виконання** shell-команд, **резервного копіювання** даних, **читання** логів та інші функції.
Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як використовувати adb.
## Smali
Іноді буває цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (можливо добре обфусцовані паролі або flags). Тоді може бути цікаво декомпілювати the apk, змінити код і перекомпілювати його.\
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, що будуть представлені. Тому **завжди майте на увазі цю можливість**.
Іноді цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (наприклад, сильно обфусковані паролі або flags). Тоді може бути цікаво декомпілювати the apk, змінити код і рекомпілювати його.\
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисним як **альтернатива для деяких тестів під час dynamic analysis**, які будуть представлені. Тому завжди пам'ятайте про цю можливість.
## Інші цікаві трюки
## Інші цікаві прийоми
- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
- **Завантажити APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Витягнути APK з пристрою:
```bash
adb shell pm list packages
@ -63,39 +63,40 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
## Статичний аналіз
По-перше, для аналізу APK слід **переглянути Java-код** за допомогою decompiler.\
Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні decompilers**](apk-decompilers.md).
По-перше, для аналізу APK слід **переглянути Java код** за допомогою декомпілятора.\
Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні декомпілятори**](apk-decompilers.md).
### Пошук цікавої інформації
Просто переглянувши **strings** у APK, можна шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** та все, що може бути цікавим... шукайте навіть code execution **backdoors** або authentication backdoors (жорстко вбудовані admin credentials у додатку).
Просто переглянувши **strings** APK, ви можете шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API** keys, **encryption**, **bluetooth uuids**, **tokens** та все, що здається цікавим... шукайте навіть code execution **backdoors** або authentication backdoors (hardcoded admin credentials to the app).
**Firebase**
Зверніть особливу увагу на **firebase URLs** і перевірте, чи вони неправильно налаштовані. [Більше інформації про те, що таке Firebase і як його експлуатувати тут.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
Зверніть особливу увагу на **firebase URLs** та перевірте, чи вони не неправильно налаштовані. [Більше інформації про те, що таке Firebase і як це експлуатувати тут.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### Базове розуміння застосунку - Manifest.xml, strings.xml
### Базове розуміння додатку - Manifest.xml, strings.xml
Дослідження файлів застосунку _Manifest.xml_ та _strings.xml_ може виявити потенційні вразливості. Ці файли можна отримати за допомогою decompilers або перейменувавши розширення APK на .zip і розпакувавши його.
Огляд файлів _Manifest.xml_ і _strings.xml_ додатку може виявити потенційні вразливості безпеки. Ці файли можна отримати за допомогою декомпілятора або перейменувавши розширення файлу APK на .zip та розпакувавши його.
**Вразливості**, які можна виявити в **Manifest.xml**, включають:
**Вразливості**, виявлені у **Manifest.xml**, включають:
- **Debuggable Applications**: Застосунки, які мають `debuggable="true"` у _Manifest.xml_, становлять ризик, оскільки вони дозволяють підключення, що може призвести до експлуатації. Для подальшого розуміння того, як експлуатувати debuggable застосунки, зверніться до керівництва з пошуку та експлуатації debuggable застосунків на пристрої.
- **Backup Settings**: Атрибут `android:allowBackup="false"` слід явно встановлювати для застосунків, що працюють з чутливою інформацією, щоб запобігти несанкціонованому резервному копіюванню даних через adb, особливо коли увімкнено usb debugging.
- **Network Security**: Користувацькі налаштування network security (`android:networkSecurityConfig="@xml/network_security_config"`) у _res/xml/_ можуть вказувати параметри безпеки, як-от certificate pins та налаштування HTTP traffic. Наприклад, дозволи для HTTP-трафіку для певних доменів.
- **Exported Activities and Services**: Виявлення exported activities і services у manifest може вказати на компоненти, які можна зловживати. Подальший аналіз під час динамічного тестування може показати, як експлуатувати ці компоненти.
- **Content Providers and FileProviders**: Відкриті content providers можуть дозволити несанкціонований доступ або зміну даних. Слід ретельно перевірити конфігурацію FileProviders.
- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації, особливо звертайте увагу на те, як обробляються URL schemes для можливих вразливостей вводу.
- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion` і `maxSdkVersion` вказують підтримувані версії Android, підкреслюючи важливість уникнення підтримки застарілих, уразливих версій Android.
- **Debuggable Applications**: Додатки, встановлені як debuggable (`debuggable="true"`) у файлі _Manifest.xml_, становлять ризик, оскільки дозволяють підключення, які можуть призвести до експлуатації. Для детальнішого розуміння того, як експлуатувати debuggable-додатки, зверніться до керівництва з пошуку та експлуатації debuggable-додатків на пристрої.
- **Backup Settings**: Атрибут `android:allowBackup="false"` повинен бути явно встановлений для додатків, які працюють з чутливою інформацією, щоб запобігти несанкціонованому створенню бекапів через adb, особливо коли увімкнено usb debugging.
- **Network Security**: Користувацькі конфігурації мережевої безпеки (`android:networkSecurityConfig="@xml/network_security_config"`) в _res/xml/_ можуть визначати деталі безпеки, такі як certificate pins та налаштування HTTP-трафіку. Приклад — дозволення HTTP-трафіку для конкретних доменів.
- **Exported Activities and Services**: Виявлення exported activities та services у маніфесті може вказати на компоненти, якими можна зловживати. Подальший аналіз під час динамічного тестування може показати, як експлуатувати ці компоненти.
- **Content Providers and FileProviders**: Відкриті content providers можуть дозволити несанкціонований доступ або модифікацію даних. Конфігурацію FileProviders також слід ретельно перевірити.
- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації; зверніть особливу увагу на те, як обробляються URL schemes щодо вразливостей при прийомі вводу.
- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion`, та `maxSdkVersion` вказують підтримувані версії Android, що підкреслює важливість не підтримувати застарілі, вразливі версії Android з міркувань безпеки.
З файлу **strings.xml** можна знайти чутливу інформацію, таку як API keys, custom schemas та інші примітки розробників, що підкреслює необхідність ретельного перегляду цих ресурсів.
З файлу **strings.xml** можна виявити чутливу інформацію, таку як API keys, custom schemas та інші нотатки розробників, що підкреслює необхідність ретельного перегляду цих ресурсів.
### Tapjacking
**Tapjacking** — це атака, коли **зловмисний додаток** запускається й **розміщується поверх додатку-жертви**. Коли воно візуально затуляє жертву, його інтерфейс спроектовано так, щоб обдурити користувача і змусити його взаємодіяти з ним, тоді як взаємодія передається до додатку-жертви.\
Фактично, це **позбавляє користувача можливості знати, що він насправді виконує дії у додатку-жертві**.
**Tapjacking** — це атака, коли **malicious** **application** запускається і **розміщується поверх додатку-жертви**. Коли воно візуально перекриває додаток-жертву, його інтерфейс користувача спроектовано так, щоб обдурити користувача і змусити його взаємодіяти з ним, при цьому взаємодія передається додатку-жертві.\
Внаслідок цього користувач **не бачить, що фактично виконує дії в додатку-жертві**.
Детальніше у:
Детальніше в:
{{#ref}}
tapjacking.md
@ -103,54 +104,55 @@ tapjacking.md
### Task Hijacking
Activity з `launchMode`, встановленим у `singleTask` без визначеного `taskAffinity`, уразлива до Task Hijacking. Це означає, що шкідливий додаток може бути встановлений і, якщо його запустити перед реальним додатком, він може **перехопити task реального додатку** (тому користувач взаємодіятиме зі **зловмисним додатком, думаючи, що використовує реальний**).
Активність (**activity**) з **`launchMode`**, встановленим у **`singleTask` без визначеного `taskAffinity`**, вразлива до task Hijacking. Це означає, що шкідливий **application** може бути встановлений і, якщо його запустити перед справжнім додатком, він може **перехопити task справжнього додатку** (тобто користувач буде взаємодіяти зі **malicious application, думаючи, що використовує справжній**).
Детальніше у:
Детальніше в:
{{#ref}}
android-task-hijacking.md
{{#endref}}
### Небезпечне збереження даних
### Ненадійне зберігання даних
**Internal Storage**
**Внутрішнє сховище**
У Android файли, що зберігаються у внутрішньому сховищі, призначені бути доступними виключно для додатку, який їх створив. Цей захід безпеки примусово застосовується операційною системою Android і загалом відповідає потребам безпеки більшості додатків. Проте розробники іноді використовують режими на кшталт `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE`, щоб дозволити спільний доступ до файлів між різними додатками. Однак ці режими **не обмежують доступ** до цих файлів іншими додатками, у тому числі потенційно шкідливими.
В Android файли, **збережені** у **внутрішньому** сховищі, **створені** так, щоб бути **доступними** виключно для **додатку**, який їх **створив**. Цей механізм безпеки **забезпечується** операційною системою Android і зазвичай достатній для потреб більшості додатків. Проте розробники іноді використовують режими на кшталт `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** спільний доступ до файлів між різними додатками. Ці режими, однак, **не обмежують доступ** до цих файлів з боку інших додатків, включно з потенційно шкідливими.
1. **Static Analysis:**
- **Переконайтеся**, що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` ретельно перевіряється. Ці режими **можуть потенційно зробити файли доступними** для небажаного або несанкціонованого доступу.
2. **Dynamic Analysis:**
- **Перевірте** дозволи на файли, створені додатком. Зокрема, **перевірте**, чи встановлені які-небудь файли як доступні для читання або запису для всіх. Це може становити значний ризик безпеки, оскільки дозволяє **будь-якому додатку**, встановленому на пристрої, незалежно від його походження чи намірів, **читати або змінювати** ці файли.
1. **Статичний аналіз:**
- **Переконайтесь**, що використання `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE` **ретельно проаналізовано**. Ці режими **можуть потенційно піддавати** файли небажаному або несанкціонованому доступу.
2. **Динамічний аналіз:**
- **Перевірте** права доступу до файлів, створених додатком. Зокрема, **перевірте**, чи будь-які файли не встановлені як доступні для читання або запису для всіх. Це може становити серйозний ризик безпеки, оскільки дозволяє **будь-якому додатку**, встановленому на пристрої, незалежно від його походження чи намірів, **читати або змінювати** ці файли.
**External Storage**
**Зовнішнє сховище**
При роботі з файлами на external storage, таких як SD Cards, слід врахувати такі застереження:
Працюючи з файлами на **external storage**, наприклад SD-карті, слід дотримуватися певних застережень:
1. **Доступність**:
- Файли на external storage зазвичай **загально доступні для читання і запису**. Це означає, що будь-який додаток або користувач може отримати до них доступ.
2. **Питання безпеки**:
- Через простоту доступу не рекомендується зберігати на external storage чутливу інформацію.
- External storage можна вийняти або до нього може отримати доступ будь-який додаток, що робить його менш безпечним.
3. **Обробка даних з external storage**:
- Завжди **виконуйте валідацію вводу** для даних, отриманих з external storage. Це критично, оскільки дані походять з ненадійного джерела.
- Не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження.
- Якщо ваш додаток все ж має отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед динамічним завантаженням. Цей крок є важливим для збереження цілісності безпеки вашого додатку.
- Файли на external storage **загально доступні для читання і запису**. Це означає, що будь-який додаток або користувач може отримати доступ до цих файлів.
2. **Проблеми безпеки**:
- Через легкість доступу не рекомендується **зберігати чутливу інформацію** на external storage.
- External storage може бути видалене або доступне будь-якому додатку, що робить його менш безпечним.
3. **Опрацювання даних із external storage**:
- Завжди **виконуйте валідацію вводу** для даних, отриманих із external storage. Це критично, оскільки дані походять з ненадійного джерела.
- Категорично не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження.
- Якщо ваш додаток все ж має отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед динамічним завантаженням. Цей крок важливий для збереження цілісності безпеки додатку.
External storage можна **знайти** в `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`
> [!TIP]
> Починаючи з Android 4.4 (**API 17**), структура директорій на SD-карті **обмежує доступ додатка лише до каталогу, призначеного конкретно для цього додатка**. Це запобігає тому, щоб шкідливий додаток отримав доступ для читання або запису файлів іншого додатку.
> Починаючи з Android 4.4 (**API 17**), SD-карта має структуру директорій, яка **обмежує доступ додатку до директорії, що призначена саме для цього додатку**. Це запобігає отриманню шкідливим додатком прав на читання або запис файлів іншого додатку.
**Чутливі дані, збережені у відкритому вигляді**
**Чутливі дані, збережені у відкритому тексті**
- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли за шляхом `/data/data/<packagename>/shared_prefs/`, і іноді у цій папці можна знайти чутливу інформацію у відкритому вигляді.
- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite бази даних за шляхом `/data/data/<packagename>/databases/`, і іноді у цій папці можна знайти чутливу інформацію у відкритому вигляді.
- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли в шляху `/data/data/<packagename>/shared_prefs/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці.
- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite databases в шляху `/data/data/<packagename>/databases/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці.
### Проблеми з TLS
### Broken TLS
**Accept All Certificates**
З якоїсь причини іноді розробники приймають усі сертифікати, навіть якщо, наприклад, hostname не збігається, з рядками коду на кшталт наступного:
З якоїсь причини іноді розробники приймають усі сертифікати, навіть якщо, наприклад, hostname не відповідає, з рядками коду на кшталт наведеного нижче:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -159,34 +161,34 @@ A good way to test this is to try to capture the traffic using some proxy like B
### Неправильна криптографія
**Погані процеси управління ключами**
**Погане управління ключами**
Деякі розробники зберігають конфіденційні дані у локальному сховищі й шифрують їх ключем, який закодовано в коді або є передбачуваним (hardcoded/predictable). Так не слід робити, оскільки деякий reversing може дозволити атакувальникам витягти конфіденційну інформацію.
Деякі розробники зберігають конфіденційні дані в локальному сховищі й шифрують їх ключем, жорстко захардкодженим/передбачуваним у коді. Так робити не слід, оскільки reversing може дозволити атаці витягти конфіденційну інформацію.
**Використання небезпечних і/або застарілих алгоритмів**
Розробникам не слід використовувати **deprecated algorithms** для виконання авторизаційних перевірок, збереження або відправки даних. Деякі з таких алгоритмів: RC4, MD4, MD5, SHA1... Якщо для збереження паролів використовуються **hashes**, слід застосовувати стійкі до **brute-force** hashes з salt.
Розробники не повинні використовувати **deprecated algorithms** для виконання authorisation **checks**, зберігання або відправки даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо, наприклад, для зберігання паролів використовуються **hashes**, слід застосовувати brute-force **resistant** hashes з salt.
### Інші перевірки
- Рекомендується **obfuscate the APK**, щоб ускладнити роботу reverse engineer для атакувальників.
- Якщо додаток є критичним (наприклад банківський), він має виконувати власні перевірки, щоб визначити, чи мобільний пристрій rooted, і діяти відповідно.
- Якщо додаток є критичним (наприклад банківський), він має перевіряти, чи використовується **emulator**.
- Якщо додаток є критичним (наприклад банківський), він має **check it's own integrity before executing** щоб перевірити, чи не було його змінено.
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD), щоб перевірити, який compiler/packer/obfuscator був використаний для збірки APK
- Рекомендується **obfuscate the APK**, щоб ускладнити reverse engineer-ам роботу атакуючих.
- Якщо додаток чутливий (наприклад банківські додатки), він повинен виконувати власні перевірки, щоб визначити, чи mobile is rooted, і діяти відповідно.
- Якщо додаток чутливий (наприклад банківські додатки), він має перевіряти, чи використовується **emulator**.
- Якщо додаток чутливий (наприклад банківські додатки), він має перевіряти власну цілісність перед виконанням, щоб перевірити, чи не був змінений.
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD) щоб перевірити, який compiler/packer/obfuscator був використаний для збірки APK
### React Native Application
### Додатки React Native
Read the following page to learn how to easily access javascript code of React applications:
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до javascript коду React додатків:
{{#ref}}
react-native-application.md
{{#endref}}
### Xamarin Applications
### Додатки Xamarin
Read the following page to learn how to easily access C# code of a xamarin applications:
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до C# коду додатків Xamarin:
{{#ref}}
@ -195,17 +197,17 @@ Read the following page to learn how to easily access C# code of a xamarin appli
### Superpacked Applications
According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.**
Згідно з цим [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked — це Meta algorithm, який стискає вміст додатка в один файл. У блозі йдеться про можливість створити додаток, що розпаковує такого роду додатки... і про швидший спосіб, який полягає в **виконанні додатка і зборі розпакованих файлів із файлової системи.**
### Automated Static Code Analysis
### Автоматизований статичний аналіз коду
The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability.
Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатний знаходити **vulnerabilities** шляхом **scanning** **code** додатка. Цей інструмент містить набір **known sources** (що вказують інструменту **місця**, де **input** контролюється користувачем), **sinks** (що вказують **dangerous** **місця**, де шкідливий input користувача може завдати шкоди) та **rules**. Ці правила вказують **комбінації sources-sinks**, які позначають vulnerability.
With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**.
Завдяки цьому **mariana-trench перевіряє код і знаходить можливі vulnerabilities.**
### Secrets leaked
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
Додаток може містити secrets (API keys, passwords, hidden urls, subdomains...) всередині, які ви можете виявити. Ви можете використати інструмент, такий як [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
### Bypass Biometric Authentication
@ -219,7 +221,7 @@ bypass-biometric-authentication-android.md
- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage`
- **Native functions** declared as `native`: `public native, System.loadLibrary, System.load`
- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md)
- [Прочитайте це, щоб дізнатися **how to reverse native functions**](reversing-native-libraries.md)
### **Other tricks**
@ -232,47 +234,47 @@ content-protocol.md
---
## Динамічний Аналіз
## Динамічний аналіз
> Перш за все, вам потрібне середовище, де можна встановити додаток та всі інструменти (Burp CA cert, Drozer and Frida головним чином). Тому настійно рекомендується rooted пристрій (емулятор чи ні).
> По‑перше, вам потрібне середовище, де можна встановити додаток і всі компоненти (Burp CA cert, Drozer і Frida головним чином). Тому настійно рекомендується rooted device (емулятор або реальний пристрій).
### Онлайн динамічний аналіз
Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io). Ця платформа дозволяє вам **upload** і **execute** APKs, тому корисна, щоб подивитися, як apk поводиться.
Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io/). Ця платформа дозволяє **upload** та **execute** APK, тому корисна для спостереження за поведінкою apk.
Ви навіть можете **see the logs of your application** в вебі та підключитися через **adb**.
Ви навіть можете переглядати логи вашого додатку в вебі й підключатися через **adb**.
![](<../../images/image (831).png>)
Завдяки ADB-з'єднанню ви можете використовувати **Drozer** і **Frida** всередині емуляторів.
Завдяки ADB-з'єднанню ви можете використовувати **Drozer** та **Frida** в емуляторах.
### Локальний динамічний аналіз
#### Використання емулятора
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
- Learn to set it up in this page:
- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і, згідно з [**this**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) **latest x86** версії **support ARM libraries** без необхідності повільного arm емулятора).
- Дізнайтеся, як його налаштувати на цій сторінці:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, потрібно створити акаунт. _Рекомендується **download** версію **WITH**_ _**VirtualBox**, щоб уникнути потенційних помилок._)
- [**Nox**](https://es.bignox.com) (Безкоштовно, але не підтримує Frida або Drozer).
> [!TIP]
> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
> Коли створюєте новий емулятор на будь‑якій платформі, пам’ятайте: чим більший екран, тим повільніше працюватиме емулятор. Тому по можливості обирайте менші екрани.
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
Щоб **install google services** (наприклад AppStore) в Genymotion, потрібно натиснути на червоного марковану кнопку на зображенні:
![](<../../images/image (277).png>)
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
Також зверніть увагу, що в **configuration of the Android VM in Genymotion** можна вибрати **Bridge Network mode** (це буде корисно, якщо ви підключатиметесь до Android VM з іншої VM з інструментами).
#### Use a physical device
#### Використання фізичного пристрою
You need to activate the **debugging** options and it will be cool if you can **root** it:
Потрібно активувати **debugging** опції, і бажано, щоб пристрій був **root**:
1. **Settings**.
2. (FromAndroid 8.0) Select **System**.
@ -280,129 +282,135 @@ You need to activate the **debugging** options and it will be cool if you can **
4. Press **Build number** 7 times.
5. Go back and you will find the **Developer options**.
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
> Після встановлення додатку перше, що слід зробити — це спробувати його, дослідити, що він робить, як працює і звикнути до нього.\
> Рекомендую виконати цю початкову динамічну перевірку з використанням MobSF dynamic analysis + pidcat, щоб ми могли **дізнатися, як працює додаток**, поки MobSF **збирає** багато **цікавих** **даних**, які ви зможете переглянути пізніше.
### Unintended Data Leakage
Короткі нотатки про Magisk/Zygisk (рекомендується на Pixel-пристроях)
- Patch boot.img з використанням додатку Magisk і прошити через fastboot для отримання systemless root
- Увімкнути Zygisk + DenyList для приховування root; розгляньте LSPosed/Shamiko для більш потужного приховування
- Зберігайте оригінальний boot.img, щоб відновитися після OTA; повторно патчіть після кожного OTA
- Для віддзеркалення екрана використовуйте scrcpy на хості
### Ненавмисні витоки даних
**Logging**
Розробникам слід остерігатися публічного розкриття **debugging information**, оскільки це може призвести до чутливих data leak. Для моніторингу логів додатку та виявлення і захисту чутливої інформації рекомендовано використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) і `adb logcat`. **Pidcat** цінується за простоту використання та читабельність.
Розробникам слід бути обережними з публічним розголошенням **debugging information**, оскільки це може призвести до витоку чутливої інформації. Рекомендовано використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу логів додатку та виявлення/захисту чутливої інформації. **Pidcat** зручніший у використанні та більш читабельний.
> [!WARNING]
> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\
> Anyway, it's still recommended to **not log sensitive information**.
> Зауважте, що починаючи з **пізніших версій, ніж Android 4.0**, **додатки можуть отримувати доступ тільки до власних логів**. Тому додатки не можуть читати логи інших додатків.\
> В будь‑якому випадку, все одно не рекомендовано логувати чутливу інформацію.
**Copy/Paste Buffer Caching**
**Кеш буфера копіювання/вставки**
Android's **clipboard-based** framework enables copy-paste functionality in apps, yet poses a risk as **other applications** can **access** the clipboard, potentially exposing sensitive data. It's crucial to **disable copy/paste** functions for sensitive sections of an application, like credit card details, to prevent data leak.
Android‑фреймворк на основі буфера обміну дозволяє функції copy-paste у додатках, проте є ризик, що **інші додатки** можуть отримати доступ до clipboard і, потенційно, викрити чутливі дані. Важливо вимикати функції copy/paste для чутливих секцій додатку, як-от дані кредитної картки, щоб запобігти витокам.
**Crash Logs**
If an application **crashes** and **saves logs**, these logs can assist attackers, particularly when the application cannot be reverse-engineered. To mitigate this risk, avoid logging on crashes, and if logs must be transmitted over the network, ensure they are sent via an SSL channel for security.
Якщо додаток падає і зберігає логи, ці логи можуть допомогти атакуючим, особливо коли додаток важко відремонтувати реверсингом. Щоб зменшити ризик, уникайте логування на крашах, а якщо логи мають передаватися мережею — переконайтесь, що вони йдуть по SSLканалу.
As pentester, **try to take a look to these logs**.
Як pentester, **спробуйте подивитися ці логи**.
**Analytics Data Sent To 3rd Parties**
Applications often integrate services like Google Adsense, which can inadvertently **leak sensitive data** due to improper implementation by developers. To identify potential data leaks, it's advisable to **intercept the application's traffic** and check for any sensitive information being sent to third-party services.
Додатки часто інтегрують сервіси на кшталт Google Adsense, які можуть ненавмисно **leak** чутливі дані через неправильне впровадження розробниками. Щоб виявити можливі витоки даних, рекомендовано **intercept the application's traffic** і перевірити, чи не надсилається чутлива інформація до third-party сервісів.
### SQLite DBs
Most of the applications will use **internal SQLite databases** to save information. During the pentest take a **look** to the **databases** created, the names of **tables** and **columns** and all the **data** saved because you could find **sensitive information** (which would be a vulnerability).\
Databases should be located in `/data/data/the.package.name/databases` like `/data/data/com.mwr.example.sieve/databases`
Більшість додатків використовують **internal SQLite databases** для збереження інформації. Під час pentest перегляньте **databases**, імена **tables** і **columns** та всі **data**, що зберігається, оскільки ви можете знайти **sensitive information** (що буде вразливістю).\
Бази даних зазвичай знаходяться в `/data/data/the.package.name/databases`, наприклад `/data/data/com.mwr.example.sieve/databases`
If the database is saving confidential information and is **encrypted b**ut you can **find** the **password** inside the application it's still a **vulnerability**.
Якщо база даних зберігає конфіденційну інформацію і вона **encrypted**, але ви можете **find** пароль у додатку — це все одно **vulnerability**.
Enumerate the tables using `.tables` and enumerate the columns of the tables doing `.schema <table_name>`
Перелічте таблиці за допомогою `.tables` і перелічте схему таблиці командою `.schema <table_name>`
### Drozer (Exploit Activities, Content Providers and Services)
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Androids Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\
Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections.
Згідно з [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **взяти на себе роль Android app** і взаємодіяти з іншими додатками. Він може робити **все, що може робити встановлений додаток**, наприклад використовувати Androids Inter-Process Communication (IPC) та взаємодіяти з underlying operating system. .\
Drozer — корисний інструмент для **експлуатації exported activities, exported services та Content Providers**, як ви дізнаєтесь у наступних розділах.
### Exploiting exported Activities
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Also remember that the code of an activity starts in the **`onCreate`** method.
Також пам'ятайте, що код activity починається в методі **`onCreate`**.
**Authorisation bypass**
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.**
Коли Activity exported, ви можете викликати її екран з зовнішнього додатка. Якщо activity з **sensitive information** є **exported**, ви можете **bypass** механізми аутентифікації, щоб потрапити до неї.
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
You can also start an exported activity from adb:
Ви також можете запустити exported activity з adb:
- PackageName is com.example.demo
- Exported ActivityName is com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21).
**ПРИМІТКА**: MobSF визначатиме як шкідливе використання _**singleTask/singleInstance**_ як `android:launchMode` в activity, але через [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, це небезпечно лише на старих версіях (API versions < 21).
> [!TIP]
> Зверніть увагу, що an authorisation bypass не завжди є вразливістю — це залежить від того, як bypass працює і яка інформація розкривається.
> Зверніть увагу, що authorisation bypass не завжди є вразливістю — це залежатиме від того, як bypass працює і яка інформація розкривається.
**Витік чутливої інформації**
**Sensitive information leakage**
**Activities can also return results**. Якщо вам вдасться знайти exported і unprotected activity, яка викликає метод **`setResult`** і повертає чутливу інформацію, це призводить до витоку чутливої інформації.
Activities також можуть повертати результати. Якщо вам вдасться знайти exported і unprotected activity, яка викликає метод **`setResult`** і **повертає конфіденційну інформацію**, це призводить до витоку конфіденційної інформації.
#### Tapjacking
Якщо Tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити користувача виконати unexpected дії. For more info about [**what is Tapjacking follow the link**](#tapjacking).
Якщо tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити **користувача виконати непередбачені дії**. Для детальнішої інформації про [**what is Tapjacking follow the link**](#tapjacking).
### Exploiting Content Providers - Accessing and manipulating sensitive information
### Exploiting Content Providers - Доступ та маніпулювання конфіденційною інформацією
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
Content providers, в основному, використовуються для **обміну даними**. Якщо в додатку доступні content providers, ви можете змогли б **отримати чутливі** дані з них. Також варто перевірити можливі **SQL injections** і **Path Traversals**, оскільки вони можуть бути вразливими.
[**Прочитайте це, якщо хочете освіжити уявлення про Content Provider.**](android-applications-basics.md#content-provider)\
Content providers здебільшого використовуються для **обміну даними**. Якщо додаток має доступні content providers, ви можете **витягти конфіденційні** дані з них. Також варто протестувати можливі **SQL injections** та **Path Traversals**, оскільки вони можуть бути вразливими.
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
[**Дізнайтеся, як експлуатувати Content Providers за допомогою Drozer.**](drozer-tutorial/index.html#content-providers)
### **Exploiting Services**
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
[**Прочитайте це, якщо хочете освіжити уявлення про Service.**](android-applications-basics.md#services)\
Пам'ятайте, що дії Service починаються в методі `onStartCommand`.
Сервіс по суті — це те, що **може отримувати дані**, **обробляти** їх і **повертати** (або ні) відповідь. Тому, якщо додаток експортує якісь сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **протестувати** його **динамічно** для отримання конфіденційної інформації, обходу механізмів автентифікації тощо.\
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
Service по суті може **отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тому, якщо додаток експортує якісь services, слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** це **динамічно** для витягання конфіденційної інформації, обходу заходів авторизації тощо...\
[**Дізнайтеся, як експлуатувати Services за допомогою Drozer.**](drozer-tutorial/index.html#services)
### **Exploiting Broadcast Receivers**
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
[**Прочитайте це, якщо хочете освіжити уявлення про Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
Пам'ятайте, що дії Broadcast Receiver починаються в методі `onReceive`.
Broadcast receiver очікує певний тип повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
[**Дізнайтеся, як експлуатувати Broadcast Receivers за допомогою Drozer.**](#exploiting-broadcast-receivers)
### **Exploiting Schemes / Deep links**
You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
You can **open** a declared **scheme** using **adb** or a **browser**:
Ви можете шукати deep links вручну, використовуючи інструменти на кшталт MobSF або скрипти, як-от [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
Ви можете **відкрити** задекларований **scheme** за допомогою **adb** або **browser**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_Note that you can **omit the package name** and the mobile will automatically call the app that should open that link._
_ерніть увагу, що ви можете **omit the package name**, і мобільний пристрій автоматично викличе додаток, який має відкрити це посилання._
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
```
**Код, що виконається**
**Код, що виконується**
Щоб знайти **код, який буде виконаний в App**, перейдіть до activity, викликаної deeplink, і знайдіть функцію **`onNewIntent`**.
Щоб знайти **код, який виконуватиметься в додатку**, перейдіть до activity, викликаної deeplink, і знайдіть функцію **`onNewIntent`**.
![](<../../images/image (436) (1) (1) (1).png>)
**Чутлива інформація**
**Конфіденційні дані**
Кожного разу, коли ви знаходите deep link, перевіряйте, чи i**t's not receiving sensitive data (like passwords) via URL parameters**, тому що будь-який інший додаток може **імітувати deep link і вкрасти ці дані!**
Кожного разу, коли ви знаходите deep link, перевіряйте, що **вона не отримує конфіденційних даних (наприклад паролів) через URL-параметри**, оскільки будь-який інший додаток може **імітувати deep link і вкрасти ці дані!**
**Parameters in path**
**Параметри в path**
Ви **також повинні перевірити, чи якийсь deep link не використовує параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете примусити path traversal, звернувшись, наприклад, до: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
Зверніть увагу, що якщо ви знайдете правильні endpoints всередині додатку, ви можете спричинити **Open Redirect** (якщо частина шляху використовується як домен), **account takeover** (якщо ви можете змінити деталі користувача без CSRF token і вразливий endpoint використовував правильний метод) та будь-яку іншу vuln. Більше [info about this here](http://dphoeniixx.com/2020/12/13-2/).
Ви **також повинні перевіряти, чи який-небудь deep link не використовує параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете змусити path traversal, звернувшись до чогось на кшталт: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
Зверніть увагу, що якщо ви знайдете правильні endpoints всередині застосунку, ви можете викликати **Open Redirect** (якщо частина шляху використовується як домен), **account takeover** (якщо можна змінити деталі користувача без CSRF token і вразливий endpoint використовував правильний метод) та інші вразливості. Більше [info about this here](http://dphoeniixx.com/2020/12/13-2/).
**More examples**
@ -410,34 +418,34 @@ An [interesting bug bounty report](https://hackerone.com/reports/855618) about l
### Transport Layer Inspection and Verification Failures
- **Certificates are not always inspected properly** by Android applications. Часто такі додатки ігнорують попередження й приймають self-signed certificates або, в деяких випадках, повертаються до використання HTTP-з’єднань.
- **Negotiations during the SSL/TLS handshake are sometimes weak**, застосовуючи небезпечні cipher suites. Ця вразливість робить з’єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи атакуючим розшифровувати дані.
- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. Такий підхід не захищає чутливі дані, наприклад session cookies або відомості користувачів, від перехоплення зловмисниками.
- **Certificates are not always inspected properly** у Android-додатках. Часто такі додатки ігнорують попередження і приймають self-signed certificates або, в деяких випадках, повертаються до використання HTTP-з’єднань.
- **Negotiations during the SSL/TLS handshake are sometimes weak**, застосовуються ненадійні cipher suites. Ця вразливість робить з’єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи зловмисникам розшифрувати дані.
- **Leakage of private information** являє собою ризик, коли додатки автентифікуються через захищені канали, але потім для інших транзакцій використовують незахищені канали. Такий підхід не захищає конфіденційні дані, наприклад session cookies або деталі користувача, від перехоплення зловмисниками.
#### Certificate Verification
Ми зосередимося на **certificate verification**. Необхідно перевіряти цілісність сертифіката сервера для підвищення безпеки. Це критично, оскільки ненадійні налаштування TLS та передача чутливих даних по незашифрованих каналах можуть становити значні ризики. Для детальних кроків з перевірки сертифікатів сервера та усунення вразливостей [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) містить вичерпні вказівки.
Ми зосередимось на **certificate verification**. Необхідно перевіряти цілісність сертифіката сервера для підвищення безпеки. Це важливо, оскільки ненадійні TLS-конфігурації та передача конфіденційних даних по незашифрованих каналах можуть створювати серйозні ризики. Для детальних кроків щодо перевірки сертифікатів сервера та усунення вразливостей [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) надає вичерпні рекомендації.
#### SSL Pinning
SSL Pinning — це захід безпеки, коли додаток перевіряє сертифікат сервера проти відомої копії, збереженої всередині самого додатку. Цей метод є важливим для запобігання MITM-атакам. Рекомендовано реалізувати SSL Pinning для додатків, що працюють з чутливою інформацією.
SSL Pinning — це захід безпеки, коли додаток порівнює сертифікат сервера з відомою копією, збереженою всередині додатку. Цей метод є критичним для запобігання MITM-атак. Рекомендується реалізувати SSL Pinning для додатків, що оперують конфіденційною інформацією.
#### Traffic Inspection
Для інспекції HTTP-трафіку необхідно **встановити сертифікат проксі-інструмента** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Інструкцію зі встановлення кастомного CA-сертифіката дивіться [**тут**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Щоб інспектувати HTTP-трафік, необхідно **встановити сертифікат proxy tool** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Для інструкції зі встановлення custom CA certificate дивіться [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Додатки, що таргетять **API Level 24 and above**, вимагають змін у Network Security Config, щоб приймати CA-сертифікат проксі. Це критичний крок для інспекції зашифрованого трафіку. Інструкції зі зміни Network Security Config дивіться [**туторіал**](make-apk-accept-ca-certificate.md).
Додатки, що таргетять **API Level 24 and above**, потребують змін у Network Security Config, щоб прийняти CA-сертифікат проксі. Це критичний крок для інспекції зашифрованого трафіку. Для інструкцій щодо зміни Network Security Config дивіться [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
Якщо використовується **Flutter**, потрібно слідувати інструкціям на [**цій сторінці**](flutter.md). Просто додати сертифікат у сховище може бути недостатньо, оскільки Flutter має власний список дійсних CA.
Якщо використовується **Flutter**, потрібно слідувати інструкціям на [**this page**](flutter.md). Це тому, що просте додавання сертифіката в store не спрацює — Flutter має власний список валідних CA.
#### Static detection of SSL/TLS pinning
Перед тим як намагатися runtime bypasses, швидко знайдіть, де саме в APK запроваджено pinning. Статичне виявлення допомагає спланувати hooks/patches і зосередитися на потрібних code paths.
Перед спробами runtime bypasses швидко промапте, де всередині APK застосовується pinning. Статичне виявлення допомагає спланувати hooks/patches і зосередитись на потрібних кодових шляхах.
Tool: SSLPinDetect
- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за курованими regex-патернами реалізацій SSL/TLS pinning.
- Повертає точний file path, номер рядка та фрагмент коду для кожного збігу.
- Покриває поширені фреймворки та кастомні шляхи: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, та Network Security Config XML pins.
- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за підготовленими regex patterns реалізацій SSL/TLS pinning.
- Reports exact file path, line number, and a code snippet for each match.
- Охоплює поширені frameworks та кастомні кодові шляхи: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, та Network Security Config XML pins.
Install
- Prereqs: Python >= 3.8, Java on PATH, apktool
@ -454,8 +462,8 @@ python sslpindetect.py -f app.apk -a apktool.jar
# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
```
Приклад правил шаблонів (JSON)
Використовуйте або розширюйте signatures для виявлення proprietary/custom pinning стилів. Ви можете завантажити власний JSON і виконувати масштабне сканування.
Приклад правил pattern (JSON)
Використовуйте або розширюйте signatures для виявлення пропрієтарних/власних стилів pinning. Ви можете завантажити власний JSON і scan at scale.
```json
{
"OkHttp Certificate Pinning": [
@ -470,42 +478,42 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
}
```
Поради та підказки
- Швидке сканування великих додатків через multi-threading та memory-mapped I/O; pre-compiled regex зменшує накладні витрати/хибні спрацьовування.
- Швидке сканування великих додатків через мультипоточність та memory-mapped I/O; попередньо скомпільовані regex зменшують накладні витрати/помилкові спрацьовування.
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
- Типові цілі для виявлення та подальшої триажі:
- Типові цілі для подальшої перевірки:
- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references
- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides
- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers
- Declarative pins in res/xml network security config and manifest references
- Використовуйте знайдені локації для планування Frida hooks, static patches або перевірки конфігурацій перед динамічним тестуванням.
- Використовуйте знайдені місця відповідності для планування Frida hooks, статичних патчів або перевірки конфігурацій перед dynamic testing.
#### Bypassing SSL Pinning
#### Обхід SSL Pinning
Коли реалізовано SSL Pinning, його необхідно обійти для інспекції HTTPS-трафіку. Існують різні методи для цього:
Коли реалізований SSL Pinning, обхід цього механізму необхідний для інспектування HTTPS-трафіку. Існують різні методи для цього:
- Автоматично **modify** the **apk** щоб **bypass** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Головна перевага цього варіанту в тому, що вам не знадобиться root для обходу SSL Pinning, але доведеться видалити додаток і перевстановити змінений, і це не завжди працює.
- Можна використовувати **Frida** (описана нижче) для обходу цього захисту. Ось гайд для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Також можна спробувати **automatically bypass SSL Pinning** використовуючи [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Також можна спробувати **automatically bypass SSL Pinning** використовуючи **MobSF dynamic analysis** (пояснено нижче)
- Якщо ви все ще вважаєте, що якийсь трафік не захоплюється, можна спробувати **forward the traffic to burp using iptables**. Читайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
- Автоматично **змінити** **apk** щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Головна перевага цього варіанту — вам не потрібен root для обходу SSL Pinning, проте доведеться видалити застосунок і перевстановити модифікований, і це не завжди працює.
- Можна використовувати **Frida** (обговорюється нижче) щоб обійти цей захист. Ось гайду для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Також можна спробувати **автоматично обійти SSL Pinning** за допомогою [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Можна також спробувати **автоматично обійти SSL Pinning** за допомогою **MobSF dynamic analysis** (пояснено нижче)
- Якщо ви все ще вважаєте, що частину трафіку не перехоплюєте, можна спробувати **перенаправити трафік до burp за допомогою iptables**. Читайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Looking for Common Web Vulnerabilities
#### Пошук загальних веб-уразливостей
Важливо також шукати загальні web-вразливості всередині додатка. Детальна інформація про виявлення та пом'якшення цих вразливостей виходить за рамки цього огляду, але широко описана в інших джерелах.
Також важливо шукати загальні веб-уразливості всередині додатку. Детальна інформація про ідентифікацію та пом’якшення цих уразливостей виходить за рамки цього резюме, але детально розглянута в інших джерелах.
### Frida
[Frida](https://www.frida.re) — це тулкіт для динамічної інструментації для розробників, реверс-інженерів і security researcher-ів.\
**Ви можете отримати доступ до запущеного додатка і hook методи під час виконання, щоб змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\
Якщо ви хочете pentest Android додатки, ви повинні вміти користуватись Frida.
[Frida](https://www.frida.re) — це dynamic instrumentation toolkit для розробників, реверс-інженерів та дослідників з безпеки.\
**Ви можете отримати доступ до запущеного застосунку та hook methods під час виконання, змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\
Якщо ви хочете робити pentesting Android-додатків, вам потрібно вміти користуватися Frida.
- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html)
- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Спробуйте обійти anti-debugging / anti-frida механізми, завантаживши Frida як вказано тут [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs))
- Спробуйте обійти anti-debugging / anti-frida механізми, завантаживши Frida як описано в [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (інструмент [linjector](https://github.com/erfur/linjector-rs))
#### Anti-instrumentation & SSL pinning bypass workflow
@ -515,9 +523,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md
### **Dump Memory - Fridump**
Перевірте, чи додаток не зберігає в пам'яті конфіденційну інформацію, яку не повинен зберігати, наприклад паролі або мнемоніки.
Перевірте, чи зберігає застосунок конфіденційну інформацію в пам’яті, що не повинен зберігати — наприклад паролі або мнемоніки.
Використовуючи [**Fridump3**](https://github.com/rootbsd/fridump3) ви можете зробити dump пам'яті додатка за допомогою:
Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -526,122 +534,120 @@ python3 fridump3.py -u <PID>
frida-ps -Uai
python3 fridump3.py -u "<Name>"
```
Це вивантажить пам'ять у папку ./dump, і там ви можете виконати grep за допомогою чогось на кшталт:
Це вивантажить пам'ять у папку ./dump, і там ви можете виконати grep приблизно так:
```bash
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
```
### **Чутливі дані в Keystore**
В Android Keystore — найкраще місце для зберігання чутливих даних, однак при наявності достатніх привілеїв все ще **можна отримати до нього доступ**.
В Android Keystore — найкраще місце для зберігання чутливих даних; однак за наявності достатніх привілеїв до нього все ще **можна отримати доступ**. Оскільки додатки схильні зберігати тут **sensitive data in clear text**, pentests повинні перевіряти це, оскільки root user або особа з фізичним доступом до пристрою може викрасти ці дані.
Оскільки додатки схильні зберігати тут **sensitive data in clear text**, pentests мають перевіряти це під root або особою з фізичним доступом до пристрою, яка може вкрасти ці дані.
Навіть якщо додаток зберігав дані в keystore, вони мають бути зашифровані.
Навіть якщо додаток зберіг дані в Keystore, ці дані повинні бути зашифровані.
Щоб отримати доступ до даних у Keystore, можна використати цей Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
Щоб отримати доступ до даних у keystore, можна використати цей Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **Fingerprint/Biometrics Bypass**
Використовуючи наступний Frida-скрипт, можливо виконати **bypass fingerprint authentication**, яке Android-додатки можуть використовувати для **захисту певних чутливих областей:**
Використовуючи наведений Frida-скрипт, можливо здійснити **bypass fingerprint authentication**, що Android-застосунки можуть виконувати з метою **захисту певних чутливих областей:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **Фонові зображення**
Коли ви переводите застосунок у фон, Android зберігає **snapshot of the application**, тож при поверненні на передній план система спочатку завантажує це зображення перед самим застосунком, щоб здавалося, ніби застосунок відкрився швидше.
Коли ви відправляєте додаток у фон, Android зберігає **знімок додатка**, тож під час відновлення на передній план він починає завантажувати це зображення перед самим додатком, щоб здавалося, ніби додаток завантажився швидше.
Однак, якщо цей snapshot містить **чутливу інформацію**, людина з доступом до snapshot може **вкрасти ці дані** (зверніть увагу, що для доступу потрібен root).
Однак, якщо цей знімок містить **чутливу інформацію**, той, хто має доступ до знімка, може **вкрасти цю інформацію** (зауважте, що для доступу потрібен root).
Snapshots зазвичай зберігаються за шляхом: **`/data/system_ce/0/snapshots`**
Зазвичай знімки зберігаються за адресою: **`/data/system_ce/0/snapshots`**
Android надає можливість **запобігти захопленню знімків екрана, встановивши параметр макета FLAG_SECURE**. Використовуючи цей флаг, вміст вікна вважається захищеним, що запобігає його появі у знімках екрана або перегляду на ненадійних дисплеях.
Android надає спосіб **запобігти захопленню скриншотів шляхом встановлення параметра макета FLAG_SECURE**. Використовуючи цей флаг, вміст вікна вважається захищеним, що перешкоджає його появі у скриншотах або перегляду на незахищених дисплеях.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
### **Android Application Analyzer**
### **Аналізатор Android-застосунків**
Цей інструмент може допомогти вам керувати різними інструментами під час dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
Цей інструмент може допомогти у керуванні різними інструментами під час динамічного аналізу: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
### Intent Injection
Розробники часто створюють proxy components, такі як activities, services і broadcast receivers, які обробляють ці Intents і передають їх у методи, такі як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано.
Розробники часто створюють проксі-компоненти, такі як activities, services і broadcast receivers, які обробляють ці Intents і передають їх у методи, такі як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано.
Небезпека полягає в тому, що атака може змусити виконати non-exported app components або отримати доступ до чутливих content providers, неправильно скерувавши ці Intents. Помітний приклад — компонент `WebView`, який перетворює URL у `Intent` об'єкти через `Intent.parseUri(...)` і потім виконує їх, що потенційно може призвести до malicious Intent injections.
Небезпека полягає в тому, що дозволяється атакуючим тригерити non-exported app components або отримувати доступ до чутливих content providers, перенаправивши ці Intents. Помітний приклад — компонент `WebView`, який перетворює URL на об'єкти `Intent` за допомогою `Intent.parseUri(...)` і потім виконує їх, що може призвести до malicious Intent injections.
### Essential Takeaways
- **Intent Injection** схоже на Open Redirect у web.
- Експлойти включають передачу `Intent` об'єктів як extras, які можуть бути перенаправлені для виконання небезпечних операцій.
- Це може відкрити non-exported components та content providers для атакуючих.
- Конвертація URL у `Intent` компонентом `WebView` може сприяти небажаним діям.
- **Intent Injection** схоже на веб-проблему Open Redirect.
- Експлойти передбачають передачу об'єктів `Intent` як extras, які можуть бути перенаправлені для виконання небезпечних операцій.
- Це може відкрити non-exported components і content providers для атакуючих.
- Конвертація URL у `Intent` у `WebView` може сприяти небажаним діям.
### Android Client Side Injections and others
### Клієнтські ін'єкції в Android та інше
Ймовірно, ви знайомі з цими типами вразливостей з Web. У Android application необхідно бути особливо уважним щодо таких вразливостей:
Ймовірно, ви знайомі з таким типом вразливостей з Web. У Android-застосунку потрібно бути особливо уважним щодо цих вразливостей:
- **SQL Injection:** When dealing with dynamic queries or Content-Providers ensure you are using parameterized queries.
- **JavaScript Injection (XSS):** Переконайтеся, що підтримка JavaScript та Plugin вимкнена для будь-яких WebViews (disabled by default). [Детальніше тут](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViews повинні мати доступ до файлової системи вимкненим (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [Детальніше тут](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: У ряді випадків, коли android application завершує сесію, cookie не відкликається або може навіть зберігатися на диску
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
- **SQL Injection:** При роботі з динамічними запитами або Content-Providers переконайтеся, що ви використовуєте параметризовані запити.
- **JavaScript Injection (XSS):** Переконайтеся, що підтримка JavaScript і плагінів вимкнена для всіх WebView (вимкнено за замовчуванням). [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** Доступ WebView до файлової системи має бути відключений (увімкнено за замовчуванням) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: У кількох випадках, коли Android-застосунок завершує сесію, cookie не відкликається або навіть може зберігатися на диску
- [**Secure Flag** у cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
## Automatic Analysis
## Автоматичний аналіз
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
**Static analysis**
**Статичний аналіз**
![](<../../images/image (866).png>)
**Vulnerability assessment of the application** using a nice web-based frontend. You can also perform dynamic analysis (but you need to prepare the environment).
**Оцінка вразливостей застосунку** з використанням зручного веб-інтерфейсу. Також можна виконувати динамічний аналіз (але потрібно підготувати середовище).
```bash
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```
Зверніть увагу, що MobSF може аналізувати **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
Також, якщо ви створите **ZIP** файл зі вихідним кодом якщо **Android** або **IOS** app (перейдіть у кореневу папку застосунку, виділіть усе і створіть ZIPfile), воно також зможе його аналізувати.
Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also.
MobSF також дозволяє робити **diff/Compare** аналізи та інтегрувати **VirusTotal** (вам потрібно встановити ваш API key у _MobSF/settings.py_ і увімкнути його: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` у `False`, тоді **hash** буде **upload** замість файлу.
MobSF також дозволяє виконувати **diff/Compare** аналіз і інтегрувати **VirusTotal** (вам потрібно встановити ваш API key у _MobSF/settings.py_ та увімкнути його: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` в `False`, тоді **hash** буде **upload** замість файлу.
### Асистований динамічний аналіз з MobSF
### Assisted Dynamic analysis with MobSF
**MobSF** також може бути дуже корисним для **dynamic analysis** в **Android**, але в цьому випадку вам потрібно встановити MobSF та **genymotion** на вашому хості (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
**MobSF** також дуже корисний для **dynamic analysis** в **Android**, але в цьому випадку вам потрібно встановити MobSF і **genymotion** на вашому хості (VM або Docker не працюватиме). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
**MobSF dynamic analyser** може:
- **Dump application data** (URLs, логи, clipboard, скриншоти, зроблені вами, скриншоти зроблені "**Exported Activity Tester**", emails, SQLite бази даних, XML файли і інші створені файли). Усе це робиться автоматично, окрім скриншотів — їх потрібно робити вручну або натиснути "**Exported Activity Tester**", щоб отримати скриншоти всіх exported activities.
- Перехоплювати **HTTPS traffic**
- Використовувати **Frida** для отримання **runtime** **information**
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Усе це робиться автоматично, крім знімків екрана — їх потрібно робити вручну або натиснути "**Exported Activity Tester**", щоб отримати знімки всіх exported activities.
- Capture **HTTPS traffic**
- Use **Frida** to obtain **runtime** **information**
Для android **versions > 5**, воно **automatically start Frida** і встановить глобальні налаштування **proxy** для **capture** трафіку. Воно перехоплюватиме трафік лише від тестованого застосунку.
From android **versions > 5**, it will **automatically start Frida** and will set global **proxy** settings to **capture** traffic. It will only capture traffic from the tested application.
**Frida**
За замовчуванням також використовуються деякі Frida Scripts для **bypass SSL pinning**, **root detection** та **debugger detection**, а також для **monitor interesting APIs**.\
MobSF також може **invoke exported activities**, захоплювати **screenshots** цих активностей і **save** їх у звіті.
За замовчуванням MobSF також використовує деякі Frida Scripts щоб **bypass SSL pinning**, **root detection** та **debugger detection** і для **monitor interesting APIs**.\
MobSF також може **invoke exported activities**, робити **screenshots** цих активностей і **save** їх для звіту.
Щоб **start** динамічне тестування натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, і "**Live API Monitor**", щоб побачити всі виклики до hooked methods, передані аргументи та повернуті значення (це з'явиться після натискання "Start Instrumentation").\
MobSF також дозволяє завантажувати власні **Frida scripts** (щоб надіслати результати ваших Friday scripts до MobSF використовуйте функцію `send()`). Воно також має **several pre-written scripts**, які ви можете завантажити (можете додати більше у `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **select them**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити логи тих скриптів всередині "**Frida Live Logs**").
Щоб **start** dynamic testing натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, та "**Live API Monitor**", щоб побачити всі виклики до hooked methods, передані аргументи та returned values (це з’явиться після натискання "Start Instrumentation").\
MobSF також дозволяє завантажувати власні **Frida scripts** (щоб відправити результати ваших Frida скриптів до MobSF використовуйте функцію `send()`). Також є **several pre-written scripts**, які можна завантажити (можна додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **select them**, натисніть "**Load**" і потім "**Start Instrumentation**" (логи цих скриптів будуть відображатися в "**Frida Live Logs**").
![](<../../images/image (419).png>)
Крім того, у вас є кілька допоміжних функцій Frida:
Крім того, доступні деякі допоміжні Frida функції:
- **Enumerate Loaded Classes**: Виведе всі завантажені класи
- **Capture Strings**: Виводитиме всі захоплені рядки під час використання застосунку (дуже шумно)
- **Capture String Comparisons**: Може бути дуже корисним. Воно **показуватиме 2 рядки, що порівнюються**, і чи був результат True або False.
- **Enumerate Class Methods**: Введіть назву класу (наприклад "java.io.File") і воно виведе всі методи класу.
- **Enumerate Loaded Classes**: Друкує всі завантажені класи
- **Capture Strings**: Друкує всі захоплені рядки під час використання додатку (дуже шумно)
- **Capture String Comparisons**: Може бути дуже корисно. Показує дві строки, що порівнюються, і чи був результат True або False.
- **Enumerate Class Methods**: Введіть ім’я класу (наприклад "java.io.File"), і воно виведе всі методи класу.
- **Search Class Pattern**: Шукає класи за шаблоном
- **Trace Class Methods**: **Trace** цілий клас (див. входи та виходи всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих Android Api методів.
- **Trace Class Methods**: **Trace** весь **class** (дивиться inputs і outputs всіх методів класу). Пам’ятайте, що за замовчуванням MobSF трасує декілька цікавих Android Api methods.
Після того, як ви обрали допоміжний модуль, який хочете використати, потрібно натиснути "**Start Intrumentation**" і ви побачите всі виводи в "**Frida Live Logs**".
Після вибору потрібного auxiliary module потрібно натиснути "**Start Intrumentation**", і всі виводи з’являться у "**Frida Live Logs**".
**Shell**
MobSF також надає shell з деякими **adb** командами, **MobSF commands**, та поширеними **shell commands** внизу сторінки динамічного аналізу. Декілька цікавих команд:
MobSF також надає shell з деякими **adb** командами, **MobSF commands**, та загальними **shell** **commands** у нижній частині сторінки dynamic analysis. Декілька цікавих команд:
```bash
help
shell ls
@ -650,15 +656,15 @@ exported_activities
services
receivers
```
**HTTP tools**
**HTTP інструменти**
Коли HTTP-трафік перехоплено, ви можете побачити неохайний вигляд перехопленого трафіку у нижній частині "**HTTP(S) Traffic**" або приємніший вигляд у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете **відправити** **перехоплені запити** до **proxies**, наприклад Burp або Owasp ZAP.\
Для цього: _увімкніть Burp -->_ _вимкніть Intercept --> в MobSB HTTPTools виберіть запит_ --> натисніть "**Send to Fuzzer**" --> _виберіть адресу проксі_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Коли HTTP-трафік захоплено, ви можете побачити неохайне представлення захопленого трафіку внизу в "**HTTP(S) Traffic**" або більш приємне представлення у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете надіслати **захоплені запити** на **proxies** такі як Burp або Owasp ZAP.\
Для цього: _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> натисніть "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Після завершення dynamic analysis з MobSF можна натиснути "**Start Web API Fuzzer**", щоб **fuzz http requests** і шукати вразливості.
Після завершення dynamic analysis з MobSF ви можете натиснути на "**Start Web API Fuzzer**", щоб **fuzz http requests** і шукати вразливості.
> [!TIP]
> Після виконання dynamic analysis з MobSF налаштування proxy settings можуть бути некоректними, і ви не зможете виправити їх через GUI. Ви можете виправити proxy settings, виконавши:
> Після виконання dynamic analysis з MobSF налаштування proxy можуть бути неправильно сконфігуровані, і ви не зможете виправити їх через GUI. Ви можете виправити налаштування proxy, виконавши:
>
> ```
> adb shell settings put global http_proxy :0
@ -666,18 +672,18 @@ receivers
### Assisted Dynamic Analysis with Inspeckage
Ви можете отримати інструмент з [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
Цей інструмент використовує деякі **Hooks**, щоб повідомляти **що відбувається в додатку** під час виконання **dynamic analysis**.
You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
Цей інструмент використовує деякі **Hooks**, щоб показувати, що відбувається в додатку, поки ви виконуєте **dynamic analysis**.
### [Yaazhini](https://www.vegabird.com/yaazhini/)
Це **чудовий інструмент для виконання static analysis з GUI**
This is a **great tool to perform static analysis with a GUI**
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
Цей інструмент призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **capable of creating a "Proof-of-Concept" deployable APK** та **ADB commands** для експлуатації деяких знайдених вразливостей (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби root тестового пристрою.
Цей інструмент призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **capable of creating a "Proof-of-Concept" deployable APK** та **ADB commands**, щоб експлуатувати деякі з знайдених вразливостей (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби root-ити тестовий пристрій.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -687,9 +693,9 @@ qark --java path/to/specific/java/file.java
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
- Відображає всі витягнуті файли для зручного перегляду
- Автоматично декомпілює APK файли у Java та Smali формат
- Аналізує AndroidManifest.xml на наявність типових вразливостей та поведінки
- Статичний аналіз вихідного коду на типові вразливості та поведінку
- Автоматично декомпілює APK-файли в Java та Smali формати
- Аналізує AndroidManifest.xml на предмет поширених вразливостей і поведінки
- Статичний аналіз вихідного коду на предмет поширених вразливостей і поведінки
- Інформація про пристрій
- та інше
```bash
@ -697,11 +703,11 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER — це програма командного рядка, яка може використовуватись на Windows, MacOS X і Linux, і аналізує _.apk_ файли у пошуках вразливостей. Вона робить це шляхом розпакування APKs та застосування набору правил для виявлення цих вразливостей.
SUPER — це застосунок командного рядка, який можна використовувати у Windows, MacOS X та Linux; він аналізує _.apk_ файли в пошуках вразливостей. Він робить це, розпаковуючи APK та застосовуючи набір правил для виявлення цих вразливостей.
Всі правила зберігаються у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно.
Усі правила зосереджені у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно.
Завантажте останні бінарні файли зі сторінки [download page](https://superanalyzer.rocks/download.html)
Завантажте останні бінарні файли на [download page](https://superanalyzer.rocks/download.html)
```
super-analyzer {apk_file}
```
@ -709,9 +715,9 @@ super-analyzer {apk_file}
![](<../../images/image (297).png>)
StaCoAn — це **crossplatform** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) на мобільних додатках.
StaCoAn is a **кросплатформний** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers у проведенні [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) у мобільних додатках.
Ідея полягає в тому, що ви перетягуєте файл вашого мобільного додатку (an .apk or .ipa file) у застосунок StaCoAn, і він згенерує для вас візуальний та портативний звіт. Ви можете налаштувати налаштування та wordlists для отримання персоналізованого досвіду.
The concept is that you drag and drop your mobile application file (an .apk or .ipa file) on the StaCoAn application and it will generate a visual and portable report for you. You can tweak the settings and wordlists to get a customized experience.
Завантажити[ latest release](https://github.com/vincentcox/StaCoAn/releases):
```
@ -719,7 +725,7 @@ StaCoAn — це **crossplatform** інструмент, який допомаг
```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
AndroBugs Framework — система аналізу вразливостей Android, яка допомагає розробникам або hackers знаходити потенційні вразливості в Android-застосунках.\
AndroBugs Framework — це система аналізу вразливостей для Android, яка допомагає розробникам або hackers знаходити потенційні вразливості безпеки в додатках Android.\
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
```
python androbugs.py -f [APK file]
@ -727,11 +733,11 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn** — інструмент, основна мета якого — виявляти та попереджати користувача про потенційно шкідливу поведінку, реалізовану Android-додатком.
**Androwarn** — це інструмент, основна мета якого — виявляти і попереджати користувача про потенційно шкідливу поведінку, розроблену Android-застосунком.
Виявлення виконується за допомогою **static analysis** байткоду Dalvik додатка, представленого як **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard).
Виявлення здійснюється за допомогою **static analysis** Dalvik bytecode застосунку, представленого у вигляді **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard).
Цей інструмент шукає **поширені ознаки "шкідливих" додатків**, такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
Цей інструмент шукає **common behavior of "bad" applications** такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
```
@ -739,30 +745,30 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Це інструмент, який об'єднує поширені mobile application reverse engineering and analysis tools, щоб допомогти у тестуванні мобільних додатків проти OWASP mobile security threats. Мета — зробити це завдання простішим і зручнішим для розробників мобільних додатків та фахівців із безпеки.
**MARA** — це фреймворк для **M**obile **A**pplication **R**everse engineering and **A**nalysis. Це інструмент, який збирає разом поширені інструменти для зворотного інжинірингу та аналізу мобільних додатків, щоб допомогти в тестуванні мобільних додатків проти загроз мобільної безпеки OWASP. Його мета — зробити це завдання простішим і зручнішим для розробників мобільних додатків та фахівців з безпеки.
Він може:
Фреймворк дозволяє:
- Витягувати Java та Smali код за допомогою різних інструментів
- Extract Java and Smali code using different tools
- Аналізувати APK за допомогою: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
- Витягувати приватну інформацію з APK за допомогою regexps.
- Extract private information from the APK using regexps.
- Аналізувати Manifest.
- Аналізувати знайдені домени за допомогою: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) та [whatweb](https://github.com/urbanadventurer/WhatWeb)
- Deobfuscate APK через [apk-deguard.com](http://www.apk-deguard.com)
- Deobfuscate APK via [apk-deguard.com]
### Koodous
Корисно для виявлення malware: [https://koodous.com/](https://koodous.com/)
Корисно для виявлення malware: [https://koodous.com/](https://koodous.com)
## Obfuscating/Deobfuscating code
Зверніть увагу, що залежно від сервісу та конфігурації, яку ви використовуєте для обфускації коду, секрети можуть залишатися або не залишатися обфускованими.
Зауважте, що залежно від сервісу та конфігурації, які ви використовуєте для обфускації коду, секрети можуть бути обфусцовані або ні.
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Він може оптимізувати байткод, а також виявляти та видаляти невикористовувані інструкції. ProGuard є вільним програмним забезпеченням і розповсюджується під ліцензією GNU General Public License, version 2.
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2.
ProGuard розповсюджується як частина Android SDK і запускається при збірці додатка у release mode.
ProGuard розповсюджується як частина Android SDK і запускається при збірці додатка в режимі release.
### [DexGuard](https://www.guardsquare.com/dexguard)
@ -778,9 +784,9 @@ Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexgu
### [DeGuard](http://apk-deguard.com)
**DeGuard відновлює код після обфускації, виконаної інструментами обфускації для Android. Це дозволяє проводити численні аналізи безпеки, включно з перевіркою коду та виявленням бібліотек.**
**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.**
Ви можете завантажити обфускований APK на їх платформу.
Ви можете завантажити обфускований APK на їхню платформу.
### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
@ -788,11 +794,11 @@ This is a LLM tool to find any potential security vulnerabilities in android app
### [Simplify](https://github.com/CalebFenton/simplify)
It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used.
Це **generic android deobfuscator.** Simplify **virtually executes an app** щоб зрозуміти її поведінку, а потім **прагне оптимізувати код**, щоб він поводився ідентично, але був легшим для розуміння людиною. Кожен тип оптимізації простий і загальний, тому не має значення, який саме тип обфускації використовується.
### [APKiD](https://github.com/rednaga/APKiD)
APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android.
APKiD дає інформацію про **how an APK was made**. Він ідентифікує багато **compilers**, **packers**, **obfuscators**, та інші дивні речі. Це [_PEiD_](https://www.aldeid.com/wiki/PEiD) для Android.
### Manual
@ -802,19 +808,20 @@ APKiD gives you information about **how an APK was made**. It identifies many **
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis.
AndroL4b — це віртуальна машина для Android security на базі ubuntu-mate, яка включає збірку останніх фреймворків, туторіалів і лабораторій від різних ентузіастів і дослідників для reverse engineering та malware analysis.
## References
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Це чудовий список ресурсів
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Короткий курс по Android
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Це відмінний список ресурсів
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course
- [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
- [SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis](https://petruknisme.medium.com/sslpindetect-advanced-ssl-pinning-detection-for-android-security-analysis-1390e9eca097)
- [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect)
- [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns)
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
## Yet to try

View File

@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}}
Ця сторінка надає практичний робочий процес для відновлення динамічного аналізу проти Android-додатків, які виявляють/блокують інструментування через root або застосовують TLS pinning. Вона фокусується на швидкій триажі, поширених детекціях та копіюваних hooks/тактиках для їх обходу без репакування, коли це можливо.
This page provides a practical workflow to regain dynamic analysis against Android apps that detect/rootblock instrumentation or enforce TLS pinning. It focuses on fast triage, common detections, and copypasteable hooks/tactics to bypass them without repacking when possible.
## Detection Surface (що перевіряють додатки)
## Detection Surface (what apps check)
- Перевірки root: su binary, Magisk paths, getprop values, common root packages
- Root checks: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
@ -14,18 +14,18 @@
## Step 1 — Quick win: hide root with Magisk DenyList
- Увімкнути Zygisk в Magisk
- Увімкнути DenyList, додати цільовий пакет
- Перезавантажити та повторно протестувати
- Enable Zygisk in Magisk
- Enable DenyList, add the target package
- Reboot and retest
Багато додатків перевіряють лише очевидні індикатори (su/Magisk paths/getprop). DenyList часто нейтралізує наївні перевірки.
Many apps only look for obvious indicators (su/Magisk paths/getprop). DenyList often neutralizes naive checks.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests
Спробуйте поширені dropin скрипти перед глибоким аналізом:
Try common dropin scripts before deep diving:
- anti-root-bypass.js
- anti-frida-detection.js
@ -35,27 +35,44 @@ Example:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Ці методи зазвичай підмінюють Java root/debug checks, process/service scans та native ptrace(). Корисні для слабо захищених додатків; для жорстко захищених цілей можуть знадобитися індивідуальні hooks.
Вони зазвичай підміняють Java root/debug перевірки, сканування процесів/сервісів та native ptrace(). Корисно для слабо захищених додатків; для жорстко захищених цілей можуть знадобитися індивідуальні hooks.
- Codeshare: https://codeshare.frida.re/
## Step 3 — Обійти init-time detectors, приєднавшись пізніше
## Автоматизація з Medusa (Frida framework)
Багато детекцій виконуються лише під час process spawn/onCreate(). Spawntime injection (-f) або gadgets потрапляють у вир; приєднання після завантаження UI може пройти непоміченим.
Medusa надає понад 90 готових модулів для SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, та ін.
```bash
git clone https://github.com/Ch0pin/medusa
cd medusa
pip install -r requirements.txt
python medusa.py
# Example interactive workflow
show categories
use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app
```
Порада: Medusa чудово підходить для швидких перемог перед написанням custom hooks. Ви також можете cherry-pick modules і комбінувати їх зі своїми власними scripts.
## Крок 3 — Обійти детектори часу ініціалізації, приєднавшись пізніше
Багато детекцій запускаються лише під час process spawn/onCreate(). Spawntime injection (-f) або gadgets потрапляють у виявлення; приєднання після завантаження UI може уникнути виявлення.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
If this works, keep the session stable and proceed to map and stub checks.
Якщо це спрацює, утримуйте сесію стабільною та переходьте до картування і перевірок stub.
## Крок 4 — Картографування логіки виявлення через Jadx та пошук рядків
## Крок 4 — Картування логіки виявлення через Jadx та пошук рядків
Статичні ключові слова для триажу в Jadx:
Статичні ключові слова для тріажу в Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Типові Java патерни:
Типові Java-патерни:
```java
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
@ -64,13 +81,13 @@ return getRunningServices().contains("frida");
Поширені API для перегляду/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
- java.lang.System.loadLibrary / System.load (нативний міст)
- java.lang.Runtime.exec / ProcessBuilder (перевірочні команди)
- android.os.SystemProperties.get (евристики root/emulator)
## Крок 5 — Замінювання поведінки на час виконання з Frida (Java)
## Крок 5 — Runtime stubbing з Frida (Java)
Перевизначте користувацькі перевірки (guards), щоб повертати безпечні значення без перепакування:
Перевизначте кастомні guards, щоб повертати безпечні значення без repacking:
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -85,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
```
Тріаж ранніх крашів? Dump classes одразу перед тим, як додаток падає, щоб виявити ймовірні detection namespaces:
Робите триаж ранніх збоїв? Dump classes безпосередньо перед падінням, щоб виявити ймовірні detection namespaces:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -94,7 +111,15 @@ onComplete: () => console.log('Done')
});
});
```
Реєструйте та нейтралізуйте підозрілі методи, щоб підтвердити потік виконання:
// Quick root detection stub example (adapt to target package/class names)
Java.perform(() => {
try {
const RootChecker = Java.use('com.target.security.RootCheck');
RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Залогувати та нейтралізувати підозрілі методи, щоб підтвердити хід виконання:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -104,20 +129,60 @@ return false;
};
});
```
## Крок 6 — Дотримуйтесь сліду JNI/native, коли Java hooks не працюють
## Обхід emulator/VM detection (Java stubs)
Відстежте точки входу JNI, щоб знайти native loaders і detection init:
Типові евристики: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE containing generic/goldfish/ranchu/sdk; QEMU artifacts like /dev/qemu_pipe, /dev/socket/qemud; default MAC 02:00:00:00:00:00; 10.0.2.x NAT; missing telephony/sensors.
Швидка підміна полів Build:
```js
Java.perform(function(){
var Build = Java.use('android.os.Build');
Build.MODEL.value = 'Pixel 7 Pro';
Build.MANUFACTURER.value = 'Google';
Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Доповніть заготовками (stubs) перевірки існування файлів та ідентифікаторів (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList), щоб повертати реалістичні значення.
## SSL pinning bypass quick hook (Java)
Нейтралізуйте кастомні TrustManagers та примусово встановіть дозволяючі SSL contexts:
```js
Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var SSLContext = Java.use('javax.net.ssl.SSLContext');
// No-op validations
X509TrustManager.checkClientTrusted.implementation = function(){ };
X509TrustManager.checkServerTrusted.implementation = function(){ };
// Force permissive TrustManagers
var TrustManagers = [ X509TrustManager.$new() ];
var SSLContextInit = SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;','[Ljavax.net.ssl.TrustManager;','java.security.SecureRandom');
SSLContextInit.implementation = function(km, tm, sr){
return SSLContextInit.call(this, km, TrustManagers, sr);
};
});
```
Примітки
- Розширте для OkHttp: hook okhttp3.CertificatePinner і HostnameVerifier за потреби, або використайте universal unpinning script з CodeShare.
- Приклад запуску: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Step 6 — Слідуйте JNI/native слідом, коли Java hooks не спрацьовують
Прослідкуйте точки входу JNI, щоб знайти native loaders та detection init:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
Швидкий нативний триаж упакованих .so-файлів:
Швидка первинна перевірка упакованих .so файлів:
```bash
# List exported symbols & JNI
nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
Інтерактивний/нативний реверсинг:
Інтерактивний/нативний reversing:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
@ -137,26 +202,28 @@ reversing-native-libraries.md
## Крок 7 — Objection patching (embed gadget / strip basics)
Коли ви віддаєте перевагу repacking замість runtime hooks, спробуйте:
Якщо ви віддаєте перевагу repacking над runtime hooks, спробуйте:
```bash
objection patchapk --source app.apk
```
Примітки:
- Потребує apktool; переконайтесь, що у вас актуальна версія згідно офіційного керівництва, щоб уникнути проблем зі збіркою: https://apktool.org/docs/install
- Gadget injection дозволяє instrumentation без root, але все ще може бути виявлений сильнішими inittime перевірками.
- Requires apktool; ensure a current version from the official guide to avoid build issues: https://apktool.org/docs/install
- Gadget injection enables instrumentation without root but can still be caught by stronger inittime checks.
Опційно додайте модулі LSPosed та Shamiko для кращого приховування root у середовищах Zygisk, а також відредагуйте DenyList, щоб покрити дочірні процеси.
Посилання:
- Objection: https://github.com/sensepost/objection
## Крок 8 — Запасний варіант: Запатчити TLS pinning для огляду мережевого трафіку
## Step 8 — Запасний варіант: Патч TLS pinning для мережевої видимості
Якщо instrumentation заблоковано, ви все одно можете переглянути трафік, статично видаливши pinning:
Якщо instrumentation заблоковано, ви все одно можете інспектувати трафік, видаливши pinning статично:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
```
- Інструмент: https://github.com/shroudedcode/apk-mitm
- Для трюків із network config CAtrust (та Android 7+ user CA trust), див.:
- Для хитрощів з конфігурацією мережі й CAtrust (та user CA trust в Android 7+), див.:
{{#ref}}
make-apk-accept-ca-certificate.md
@ -166,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Зручна шпаргалка команд
## Корисна шпаргалка команд
```bash
# List processes and attach
frida-ps -Uai
@ -186,12 +253,12 @@ apk-mitm app.apk
```
## Поради та застереження
- Краще attach пізніше, ніж spawn, якщо apps падають при запуску
- Деякі detections rerun в критичних потоках (наприклад, payment, auth) — тримайте hooks активними під час navigation
- Поєднуйте static та dynamic: string hunt в Jadx, щоб звузити список класів; потім hook methods, щоб перевірити під час runtime
- Hardened apps можуть використовувати packers та native TLS pinning — очікуйте reverse native code
- Краще виконувати attaching пізніше, ніж spawning, якщо додатки падають під час запуску
- Деякі механізми виявлення повторно запускаються в критичних потоках (наприклад, payment, auth) — тримайте hooks активними під час навігації
- Комбінуйте static та dynamic: string hunt у Jadx, щоб скоротити список класів; потім hook methods для перевірки під час runtime
- Hardened apps можуть використовувати packers та native TLS pinning — очікуйте реверсу native code
## Посилання
## References
- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/)
- [Frida Codeshare](https://codeshare.frida.re/)
@ -202,5 +269,7 @@ apk-mitm app.apk
- [r2frida](https://github.com/nowsecure/r2frida)
- [Apktool install guide](https://apktool.org/docs/install)
- [Magisk](https://github.com/topjohnwu/Magisk)
- [Medusa (Android Frida framework)](https://github.com/Ch0pin/medusa)
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,33 +2,33 @@
{{#include ../../banners/hacktricks-training.md}}
Дуже дякую [**@offsecjay**](https://twitter.com/offsecjay) за його допомогу під час створення цього контенту.
Щиро дякую [**@offsecjay**](https://twitter.com/offsecjay) за допомогу при створенні цього контенту.
## Що таке
Android Studio дозволяє **запускати віртуальні машини Android, які ви можете використовувати для тестування APK**. Щоб їх використовувати, вам знадобиться:
Android Studio дозволяє **запускати віртуальні машини Android, які ви можете використовувати для тестування APK**. Щоб ними користуватися, вам знадобиться:
- **Інструменти Android SDK** - [Завантажити тут](https://developer.android.com/studio/releases/sdk-tools).
- Або **Android Studio**інструментами Android SDK) - [Завантажити тут](https://developer.android.com/studio).
- The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools).
- Або **Android Studio**Android SDK tools) - [Download here](https://developer.android.com/studio).
У Windows (в моєму випадку) **після встановлення Android Studio** я мав **інструменти SDK, встановлені в**: `C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
У Windows (в моєму випадку) **після встановлення Android Studio** у мене **SDK Tools були встановлені в**: `C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
У mac ви можете **завантажити інструменти SDK** і додати їх у PATH, запустивши:
У mac ви можете **завантажити SDK tools** і додати їх у PATH, виконавши:
```bash
brew tap homebrew/cask
brew install --cask android-sdk
```
Або з **Android Studio GUI**, як вказано в [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a), що встановить їх у `~/Library/Android/sdk/cmdline-tools/latest/bin/` та `~/Library/Android/sdk/platform-tools/` та `~/Library/Android/sdk/emulator/`
Або через **Android Studio GUI** як зазначено в [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a), інструменти будуть встановлені в `~/Library/Android/sdk/cmdline-tools/latest/bin/` і `~/Library/Android/sdk/platform-tools/` і `~/Library/Android/sdk/emulator/`
Щодо проблем з Java:
Для проблем із Java:
```java
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
```
## GUI
### Підготовка віртуальної машини
### Prepare Virtual Machine
Якщо ви встановили Android Studio, ви можете просто відкрити основний вигляд проекту та отримати доступ до: _**Інструменти**_ --> _**AVD Manager.**_
Якщо ви встановили Android Studio, просто відкрийте головний вигляд проекту та перейдіть: _**Tools**_ --> _**AVD Manager.**_
<div align="center" data-full-width="false">
@ -36,38 +36,38 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
</div>
Потім натисніть на _**Створити віртуальний пристрій**_
Потім натисніть _**Create Virtual Device**_
<figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure>
_**виберіть** телефон, який ви хочете використовувати_ і натисніть на _**Далі.**_
_**виберіть** телефон, який ви хочете використовувати_ та натисніть _**Next.**_
> [!WARNING]
> Якщо вам потрібен телефон з встановленим Play Store, виберіть один з іконкою Play Store на ньому!
> Якщо вам потрібен телефон із встановленим Play Store — оберіть пристрій з іконкою Play Store!
>
> <img src="../../images/image (1144).png" alt="" data-size="original">
У поточному вигляді ви зможете **вибрати та завантажити образ Android**, який буде використовувати телефон:
У поточному вікні ви зможете **вибрати та завантажити образ Android**, який буде запускатися на телефоні:
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
Отже, виберіть його, і якщо він не завантажений, натисніть на символ _**Завантажити**_ поруч з назвою (**тепер чекайте, поки образ буде завантажено).**\
Після завантаження образу просто виберіть **`Далі`** і **`Готово`**.
Отже, оберіть його, і якщо він не завантажений — натисніть на символ _**Download**_ поруч із назвою (тепер почекайте, поки образ не завантажиться).\
Після завантаження просто оберіть **`Next`** та **`Finish`**.
Віртуальна машина буде створена. Тепер **кожного разу, коли ви отримуєте доступ до AVD manager, вона буде присутня**.
Віртуальна машина буде створена. Тепер **кожного разу, коли ви відкриватимете AVD Manager, вона буде доступна**.
### Запуск віртуальної машини
### Run Virtual Machine
Щоб **запустити** її, просто натисніть на _**Кнопку старт**_.
Щоб **запустити** її, просто натисніть _**Start button**_.
![](<../../images/image (518).png>)
## Інструмент командного рядка
## Command Line tool
> [!WARNING]
> Для macOS ви можете знайти інструмент `avdmanager` у `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager`, а `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо ви їх встановили.
> Для macOS ви можете знайти інструмент `avdmanager` у `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони встановлені.
Перш за все, вам потрібно **вирішити, який телефон ви хочете використовувати**, щоб побачити список можливих телефонів, виконайте:
Спочатку потрібно **вирішити, який телефон ви хочете використовувати** — щоб побачити список доступних телефонів виконайте:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
@ -95,16 +95,16 @@ Name: Nexus 10
OEM : Google
[...]
```
Якщо ви вирішили назву пристрою, який хочете використовувати, вам потрібно **вирішити, який образ Android ви хочете запустити на цьому пристрої.**\
Ви можете перерахувати всі варіанти, використовуючи `sdkmanager`:
Після того, як ви визначите назву пристрою, який хочете використовувати, потрібно **вирішити, який образ Android ви хочете запускати на цьому пристрої.**\
Ви можете перелічити всі варіанти за допомогою `sdkmanager`:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```
І **завантажте** той (або всі), який ви хочете використовувати за допомогою:
І **завантажте** той (або всі), які ви хочете використовувати разом із:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
```
Після того, як ви завантажили зображення Android, яке хочете використовувати, ви можете **переглянути всі завантажені зображення Android** за допомогою:
Після того як ви завантажили Android image, який хочете використовувати, ви можете **перелічити всі завантажені Android images** за допомогою:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
----------
@ -120,12 +120,12 @@ Type: Platform
API level: 29
Revision: 4
```
На даний момент ви вирішили, який пристрій хочете використовувати, і завантажили образ Android, тому **ви можете створити віртуальну машину, використовуючи**:
На цьому етапі ви визначилися з пристроєм, який хочете використовувати, і завантажили Android-образ, тож **ви можете створити віртуальну машину, використовуючи**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
```
В останній команді **я створив ВМ з ім'ям** "_AVD9_" за допомогою **пристрою** "_Nexus 5X_" та **образу Android** "_system-images;android-28;google_apis;x86_64_".\
Тепер ви можете **переглянути список віртуальних машин**, які ви створили за допомогою:
У останній команді **я створив VM з ім'ям** "_AVD9_" використавши **пристрій** "_Nexus 5X_" та **Android image** "_system-images;android-28;google_apis;x86_64_".\
Тепер ви можете **перелічити віртуальні машини** які ви створили за допомогою:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
@ -140,75 +140,131 @@ Name: Pixel_2_API_27
Path: C:\Users\cpolo\.android\avd\Pixel_2_API_27_1.avd
Error: Google pixel_2 no longer exists as a device
```
### Запустіть віртуальну машину
### Запуск віртуальної машини
> [!WARNING]
> Для macOS ви можете знайти інструмент `avdmanager` у `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони у вас встановлені.
> Для macOS ви можете знайти інструмент `avdmanager` у `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони встановлені.
Ми вже бачили, як ви можете перерахувати створені віртуальні машини, але **ви також можете перерахувати їх, використовуючи**:
Ми вже бачили, як можна перелічити створені віртуальні машини, але **також їх можна перелічити за допомогою**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9
Pixel_2_API_27
```
Ви можете просто **запустити будь-яку віртуальну машину, створену** за допомогою:
Ви можете просто **запустити будь-яку створену віртуальну машину** за допомогою:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
```
Або, використовуючи більш просунуті опції, ви можете запустити віртуальну машину, таку як:
Або, використовуючи більш просунуті параметри, ви можете запустити віртуальну машину, наприклад:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
```
### Command line options
### Параметри командного рядка
Однак є **багато різних корисних параметрів командного рядка**, які ви можете використовувати для ініціації віртуальної машини. Нижче ви можете знайти деякі цікаві параметри, але ви можете [**знайти повний список тут**](https://developer.android.com/studio/run/emulator-commandline)
Однак існує **a lot of different command line useful options**, які ви можете використовувати для запуску віртуальної машини. Нижче наведені деякі цікаві опції, проте ви можете [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline)
**Boot**
- `-snapshot name` : Запустити знімок VM
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Переглянути всі записані знімки
- `-snapshot name` : Запустити snapshot віртуальної машини
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Перелічити всі записані snapshots
**Network**
- `-dns-server 192.0.2.0, 192.0.2.255` : Дозволити вказати через кому DNS-сервери для VM.
- **`-http-proxy 192.168.1.12:8080`** : Дозволити вказати HTTP-проксі для використання (дуже корисно для захоплення трафіку за допомогою Burp)
- Якщо налаштування проксі не працюють з якоїсь причини, спробуйте налаштувати їх внутрішньо або за допомогою програми, такої як "Super Proxy" або "ProxyDroid".
- `-netdelay 200` : Встановити емуляцію затримки мережі в мілісекундах.
- `-port 5556` : Встановити номер TCP порту, який використовується для консолі та adb.
- `-ports 5556,5559` : Встановити TCP порти, що використовуються для консолі та adb.
- **`-tcpdump /path/dumpfile.cap`** : Захопити весь трафік у файл
- `-dns-server 192.0.2.0, 192.0.2.255` : Дозволяє вказати через кому DNS-сервери для VM.
- **`-http-proxy 192.168.1.12:8080`** : Дозволяє вказати HTTP-проксі для використання (дуже корисно для перехоплення трафіку за допомогою Burp)
- Якщо налаштування проксі з якоїсь причини не працюють, спробуйте налаштувати їх всередині системи або використовуючи додаток на кшталт "Super Proxy" або "ProxyDroid".
- `-netdelay 200` : Встановлює емуляцію затримки мережі в мілісекундах.
- `-port 5556` : Встановлює TCP-порт, який використовується для консолі і adb.
- `-ports 5556,5559` : Встановлює TCP-порти, які використовуються для консолі і adb.
- **`-tcpdump /path/dumpfile.cap`** : Записує весь трафік у файл
**System**
- `-selinux {disabled|permissive}` : Встановити модуль безпеки Security-Enhanced Linux в режим або вимкнено, або дозволено на операційній системі Linux.
- `-selinux {disabled|permissive}` : Встановлює модуль безпеки Security-Enhanced Linux у режим disabled або permissive на ОС Linux.
- `-timezone Europe/Paris` : Встановити часовий пояс для віртуального пристрою
- `-screen {touch(default)|multi-touch|o-touch}` : Встановити емуляцію режиму сенсорного екрану.
- **`-writable-system`** : Використовуйте цю опцію, щоб мати записуваний образ системи під час вашої сесії емуляції. Вам також потрібно буде виконати `adb root; adb remount`. Це дуже корисно для встановлення нового сертифіката в систему.
- `-screen {touch(default)|multi-touch|o-touch}` : Встановити режим емуляції сенсорного екрану.
- **`-writable-system`** : Використайте цю опцію, щоб зробити системний образ змінним під час сесії емуляції. Також потрібно виконати `adb root; adb remount`. Це дуже корисно для встановлення нового сертифіката в систему.
## Rooting a Play Store device
## Linux CLI setup (SDK/AVD quickstart)
Якщо ви завантажили пристрій з Play Store, ви не зможете отримати root безпосередньо, і ви отримаєте це повідомлення про помилку
Офіційні CLI-інструменти полегшують створення швидких, налагоджуваних емуляторів без Android Studio.
```bash
# Directory layout
mkdir -p ~/Android/cmdline-tools/latest
# Download commandline tools (Linux)
wget https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/cmdline-tools.zip
unzip /tmp/cmdline-tools.zip -d ~/Android/cmdline-tools/latest
rm /tmp/cmdline-tools.zip
# Env vars (add to ~/.bashrc or ~/.zshrc)
export ANDROID_HOME=$HOME/Android
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH
# Install core SDK components
sdkmanager --install "platform-tools" "emulator"
# Install a debuggable x86_64 system image (Android 11 / API 30)
sdkmanager --install "system-images;android-30;google_apis;x86_64"
# Create an AVD and run it with a writable /system & snapshot name
avdmanager create avd -n PixelRootX86 -k "system-images;android-30;google_apis;x86_64" -d "pixel"
emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap
# Verify root (debuggable images allow `adb root`)
adb root
adb shell whoami # expect: root
```
Примітки
- Варіанти образів системи: google_apis (debuggable, allows adb root), google_apis_playstore (not rootable), aosp/default (lightweight).
- Типи збірок: userdebug часто дозволяє `adb root` на образах з підтримкою debug. Play Store images — це production збірки і блокують root.
- На хостах x86_64 повноцінна емуляція ARM64 на рівні системи не підтримується починаючи з API 28+. Для Android 11+ використовуйте Google APIs/Play образи, що включають переклад ARM->x86 для окремих додатків, щоб швидко запускати багато ARM-only apps.
### Знімки з CLI
```bash
# Save a clean snapshot from the running emulator
adb -s emulator-5554 emu avd snapshot save my_clean_setup
# Boot from a named snapshot (if it exists)
emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup
```
## ARM→x86 бінарна трансляція (Android 11+)
Google APIs і Play Store images на Android 11+ можуть транслювати ARM app binaries на рівні процесу, залишаючи решту системи рідною x86/x86_64. Це зазвичай достатньо для тестування багатьох ARM-only apps на настільному комп'ютері.
> Порада: Віддавайте перевагу Google APIs x86/x86_64 images під час pentests. Play images зручні, але блокують `adb root`; використовуйте їх тільки коли вам конкретно потрібні Play services і ви погоджуєтесь на відсутність root.
## Отримання root на пристрої з Play Store
Якщо ви завантажили пристрій з Play Store, ви не зможете безпосередньо отримати root, і отримаєте це повідомлення про помилку
```
$ adb root
adbd cannot run as root in production builds
```
Використовуючи [rootAVD](https://github.com/newbit1/rootAVD) з [Magisk](https://github.com/topjohnwu/Magisk), я зміг отримати root-доступ (слідкуйте, наприклад, за [**цим відео**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **або** [**цим**](https://www.youtube.com/watch?v=qQicUW0svB8)).
Використовуючи [rootAVD](https://github.com/newbit1/rootAVD) з [Magisk](https://github.com/topjohnwu/Magisk) мені вдалося отримати root (наприклад, див. [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) або [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)).
## Встановлення сертифіката Burp
Перегляньте наступну сторінку, щоб дізнатися, як встановити власний сертифікат CA:
Перегляньте наступну сторінку, щоб дізнатися, як встановити кастомний CA cert:
{{#ref}}
install-burp-certificate.md
{{#endref}}
## Гарні параметри AVD
## Корисні опції AVD
### Зробити знімок
### Зробити Snapshot
Ви можете **використовувати GUI** для створення знімка віртуальної машини в будь-який час:
Ви можете **використовувати GUI**, щоб у будь-який момент зробити snapshot VM:
![](<../../images/image (234).png>)
## Посилання
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Android Emulator command line](https://developer.android.com/studio/run/emulator-commandline)
- [Run ARM apps on the Android Emulator (x86 translation)](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,7 +1,8 @@
# Frida Tutorial
# Frida Посібник
{{#include ../../../banners/hacktricks-training.md}}
## Встановлення
Встановіть **frida tools**:
@ -9,43 +10,97 @@
pip install frida-tools
pip install frida
```
**Завантажте та встановіть** на Android **frida server** ([Завантажте останнє випуск](https://github.com/frida/frida/releases)).\
Однорядковий команд для перезапуску adb в режимі root, підключення до нього, завантаження frida-server, надання прав виконання та запуску в фоновому режимі:
**Завантажте та встановіть** на Android **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
Однорядкова команда, щоб перезапустити adb у режимі root, підключитися до нього, завантажити frida-server, встановити права виконання та запустити його у фоновому режимі:
```bash
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
```
**Перевірте**, чи **працює**:
**Перевірте**, чи це **працює**:
```bash
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
```
## Туторіали
## Frida server проти Gadget (root проти no-root)
### [Туторіал 1](frida-tutorial-1.md)
Два поширені способи інструментувати Android-додатки за допомогою Frida:
**З**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
- Frida server (rooted devices): Push і запустіть native daemon, який дозволяє підключитися до будь-якого процесу.
- Frida Gadget (no root): Вбудуйте Frida як shared library всередині APK і автозавантажуйте її в цільовий процес.
Frida server (rooted)
```bash
# Download the matching frida-server binary for your device's arch
# https://github.com/frida/frida/releases
adb root
adb push frida-server-<ver>-android-<arch> /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server & # run at boot via init/magisk if desired
# From host, list processes and attach
frida-ps -Uai
frida -U -n com.example.app
```
Frida Gadget (no-root)
1) Розпакуйте APK, додайте gadget .so та config:
- Помістіть libfrida-gadget.so у lib/<abi>/ (наприклад, lib/arm64-v8a/)
- Створіть assets/frida-gadget.config з налаштуваннями завантаження ваших скриптів
Приклад frida-gadget.config
```json
{
"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" },
"runtime": { "logFile": "/sdcard/frida-gadget.log" }
}
```
2) Підключіть/завантажте gadget так, щоб він ініціалізувався на ранньому етапі:
- Найпростіше: Додайте невеликий Java-стаб, який викликає System.loadLibrary("frida-gadget") в Application.onCreate(), або використайте вже наявне завантаження нативної бібліотеки.
3) Перепакуйте та підпишіть APK, потім встановіть:
```bash
apktool d app.apk -o app_m
# ... add gadget .so and config ...
apktool b app_m -o app_gadget.apk
uber-apk-signer -a app_gadget.apk -o out_signed
adb install -r out_signed/app_gadget-aligned-debugSigned.apk
```
4) Приєднатися з host до процесу gadget:
```bash
frida-ps -Uai
frida -U -n com.example.app
```
Примітки
- Gadget виявляється деякими захисними механізмами; тримайте імена/шляхи непомітними і завантажуйте пізніше/умовно, якщо потрібно.
- У захищених додатках краще використовувати rooted тестування з server + late attach, або комбінувати з приховуванням Magisk/Zygisk.
## Tutorials
### [Tutorial 1](frida-tutorial-1.md)
**Джерело**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Джерело коду**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
**Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
**Слідуйте за [посиланням, щоб прочитати це](frida-tutorial-1.md).**
**Перейдіть за [link to read it](frida-tutorial-1.md).**
### [Туторіал 2](frida-tutorial-2.md)
### [Tutorial 2](frida-tutorial-2.md)
**З**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Частини 2, 3 та 4)\
**APK та джерело коду**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**Джерело**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\
**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**Слідуйте за [посиланням, щоб прочитати це.](frida-tutorial-2.md)**
**Перейдіть за[ link to read it.](frida-tutorial-2.md)**
### [Туторіал 3](owaspuncrackable-1.md)
### [Tutorial 3](owaspuncrackable-1.md)
**З**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**Джерело**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
**Слідуйте за [посиланням, щоб прочитати це](owaspuncrackable-1.md).**
**Перейдіть за [link to read it](owaspuncrackable-1.md).**
**Ви можете знайти більше чудових скриптів Frida тут:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
## Швидкі приклади
## Quick Examples
### Виклик Frida з командного рядка
```bash
@ -60,7 +115,7 @@ frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
#frozen so that the instrumentation can occur, and the automatically
#continue execution with our modified code.
```
### Основний скрипт Python
### Базовий Python-скрипт
```python
import frida, sys
@ -71,9 +126,9 @@ print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
```
### Хукання функцій без параметрів
### Hooking functions без параметрів
Хукніть функцію `a()` класу `sg.vantagepoint.a.c`
Hook the function `a()` of the class `sg.vantagepoint.a.c`
```javascript
Java.perform(function () {
; rootcheck1.a.overload().implementation = function() {
@ -83,14 +138,14 @@ return false;
};
});
```
Перехоплення java `exit()`
Перехопити java `exit()`
```javascript
var sysexit = Java.use("java.lang.System")
sysexit.exit.overload("int").implementation = function (var_0) {
send("java.lang.System.exit(I)V // We avoid exiting the application :)")
}
```
Підключіть MainActivity `.onStart()` та `.onCreate()`
Hook MainActivity `.onStart()` & `.onCreate()`
```javascript
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity")
mainactivity.onStart.overload().implementation = function () {
@ -104,7 +159,7 @@ send("MainActivity.onCreate() HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
Підключення android `.onCreate()`
Hook android `.onCreate()`
```javascript
var activity = Java.use("android.app.Activity")
activity.onCreate.overload("android.os.Bundle").implementation = function (
@ -114,9 +169,9 @@ send("Activity HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
### Хукання функцій з параметрами та отримання значення
### Hooking functions з параметрами та отриманням значення
Хукання функції розшифровки. Виведіть вхідні дані, викличте оригінальну функцію для розшифровки вхідних даних, а потім виведіть відкриті дані:
Hooking a decryption function. Вивести вхідні дані, викликати оригінальну функцію, decrypt вхідні дані і, нарешті, вивести plain data:
```javascript
function getString(data) {
var ret = ""
@ -141,9 +196,9 @@ send("Decrypted flag: " + flag)
return ret //[B
}
```
### Хукання функцій та виклик їх з нашим введенням
### Hooking функцій і викликати їх із нашим input
Хукніть функцію, яка отримує рядок, і викличте її з іншим рядком (з [тут](https://11x256.github.io/Frida-hooking-android-part-2/))
Hook функцію, яка отримує string, і викличте її з іншим string (from [here](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript
var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class
@ -158,9 +213,9 @@ return ret
```
### Отримання вже створеного об'єкта класу
Якщо ви хочете витягти деякий атрибут створеного об'єкта, ви можете використовувати це.
Якщо ви хочете витягти деякий атрибут створеного об'єкта, ви можете скористатися цим.
У цьому прикладі ви побачите, як отримати об'єкт класу my_activity і як викликати функцію .secret(), яка виведе приватний атрибут об'єкта:
У цьому прикладі ви побачите, як отримати об'єкт класу my_activity і як викликати функцію .secret(), яка виведе приватний атрибут цього об'єкта:
```javascript
Java.choose("com.example.a11x256.frida_test.my_activity", {
onMatch: function (instance) {
@ -171,10 +226,16 @@ console.log("Result of secret func: " + instance.secret())
onComplete: function () {},
})
```
## Інші навчання Frida
## Інші підручники з Frida
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
- [Частина 1 серії блогів про розширене використання Frida: Бібліотеки шифрування IOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
## Посилання
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Frida Gadget documentation](https://frida.re/docs/gadget/)
- [Frida releases (server binaries)](https://github.com/frida/frida/releases)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,19 +1,32 @@
# Встановлення сертифіката Burp
# Встановлення сертифікату Burp
{{#include ../../banners/hacktricks-training.md}}
## Системний проксі через ADB
Налаштуйте глобальний HTTP-проксі, щоб усі додатки спрямовували трафік через ваш interceptor (Burp/mitmproxy):
```bash
# Set proxy (device/emulator must reach your host IP)
adb shell settings put global http_proxy 192.168.1.2:8080
# Clear proxy
adb shell settings put global http_proxy :0
```
Порада: У Burp зв'яжіть свій listener з 0.0.0.0, щоб пристрої в LAN могли підключатися (Proxy -> Options -> Proxy Listeners).
## На віртуальній машині
По-перше, вам потрібно завантажити сертифікат Der з Burp. Ви можете зробити це в _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
По-перше, вам потрібно завантажити Der сертифікат з Burp. Ви можете зробити це в _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
![](<../../images/image (367).png>)
**Експортуйте сертифікат у форматі Der** і давайте **перетворимо** його в форму, яку **Android** зможе **зрозуміти.** Зверніть увагу, що **для налаштування сертифіката burp на Android машині в AVD** вам потрібно **запустити** цю машину **з** опцією **`-writable-system`**.\
Наприклад, ви можете запустити її так:
**Експортуйте сертифікат у формат Der** і давайте **перетворимо** його у формат, який **Android** зможе **зрозуміти.** Зверніть увагу, що **щоб налаштувати burp сертифікат на машині Android в AVD** вам потрібно **запустити** цю машину **з** опцією **`-writable-system`**.\
Наприклад, її можна запустити так:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
```
Тоді, щоб **налаштувати сертифікат burp, зробіть**:
Тоді, щоб **налаштувати сертифікат burps**, виконайте:
```bash
openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
@ -24,39 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
adb reboot #Now, reboot the machine
```
Як тільки **машина завершить перезавантаження**, сертифікат burp буде використовуватися!
Як тільки **машина завершить перезавантаження**, сертифікат Burp почне використовуватися!
## Використання Magisc
## Using Magisc
Якщо ви **отримали root доступ до вашого пристрою за допомогою Magisc** (можливо, емулятора), і ви **не можете виконати** попередні **кроки** для встановлення сертифіката Burp, оскільки **файлова система є тільки для читання** і ви не можете змонтувати її для запису, є інший спосіб.
Якщо ви **rooted your device with Magisc** (наприклад емулатор), і ви **не можете виконати** попередні **кроки** для встановлення Burp cert через те, що **filesystem is read-only** і ви не можете remount it writable, є інший спосіб.
У [**цьому відео**](https://www.youtube.com/watch?v=qQicUW0svB8) вам потрібно:
Пояснено в [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8): потрібно:
1. **Встановити сертифікат CA**: Просто **перетягніть** DER сертифікат Burp, **змінивши розширення** на `.crt` на мобільному, щоб він зберігся в папці Завантаження, і перейдіть до `Встановити сертифікат` -> `CA сертифікат`
1. **Install a CA certificate**: Просто **drag&drop** DER Burp certificate, **змінивши розширення** на `.crt` в мобільному пристрої так, щоб він зберігся в папці Downloads, і перейдіть до `Install a certificate` -> `CA certificate`
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
- Перевірте, що сертифікат був правильно збережений, перейшовши до `Довірені облікові дані` -> `КОРИСТУВАЧ`
- Перевірте, що сертифікат правильно збережений, перейшовши до `Trusted credentials` -> `USER`
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
2. **Зробіть його довіреним для системи**: Завантажте модуль Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (файл .zip), **перетягніть його** на телефон, перейдіть до **додатку Magics** на телефоні в розділ **`Модулі`**, натисніть **`Встановити з пам'яті`**, виберіть модуль `.zip`, і після встановлення **перезавантажте** телефон:
2. **Make it System trusted**: Завантажте Magisc модуль [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (файл .zip), **drag&drop** його в телефон, відкрийте **Magics app** на телефоні в розділі **`Modules`**, натисніть **`Install from storage`**, виберіть `.zip` модуль і після встановлення **перезавантажте** телефон:
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
- Після перезавантаження перейдіть до `Довірені облікові дані` -> `СИСТЕМА` і перевірте, що сертифікат Postswigger там
- Після перезавантаження перейдіть до `Trusted credentials` -> `SYSTEM` і перевірте, що Postswigger cert там є
<figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure>
## Після Android 14
### Learn how to create a Magisc module
У останньому випуску Android 14 спостерігається значна зміна в обробці сертифікатів органів сертифікації (CA), яким довіряє система. Раніше ці сертифікати зберігалися в **`/system/etc/security/cacerts/`**, доступні та змінювані користувачами з правами root, що дозволяло негайне застосування по всій системі. Однак з Android 14 місце зберігання було переміщено до **`/apex/com.android.conscrypt/cacerts`**, каталогу в межах шляху **`/apex`**, який за своєю природою є незмінним.
Див. [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437)
Спроби змонтувати **шлях APEX cacerts** як записуваний зазнають невдачі, оскільки система не дозволяє такі операції. Навіть спроби демонтувати або накласти тимчасову файлову систему (tmpfs) на каталог не обходять незмінність; програми продовжують отримувати доступ до оригінальних даних сертифіката, незважаючи на зміни на рівні файлової системи. Ця стійкість зумовлена тим, що **монтаж `/apex`** налаштований з PRIVATE пропагандою, що забезпечує, щоб будь-які зміни в каталозі **`/apex`** не впливали на інші процеси.
## Post Android 14
Ініціалізація Android включає процес `init`, який, запускаючи операційну систему, також ініціює процес Zygote. Цей процес відповідає за запуск процесів додатків з новим простором монтування, який включає приватний **монтаж `/apex`**, таким чином ізолюючи зміни в цьому каталозі від інших процесів.
У останньому релізі Android 14 спостерігається суттєва зміна в обробці системно-довірених Certificate Authority (CA) сертифікатів. Раніше ці сертифікати зберігалися в **`/system/etc/security/cacerts/`**, були доступні і модифіковані користувачами з правами root, що дозволяло миттєво застосовувати їх у всій системі. Проте в Android 14 місце зберігання було перенесено в **`/apex/com.android.conscrypt/cacerts`**, директорію в межах шляху **`/apex`**, яка за своєю природою є незмінною.
Проте існує обхідний шлях для тих, хто потребує змінити сертифікати CA, яким довіряє система, в каталозі **`/apex`**. Це передбачає ручне змонтування **`/apex`** для видалення PRIVATE пропаганди, що робить його записуваним. Процес включає копіювання вмісту **`/apex/com.android.conscrypt`** в інше місце, демонтаж каталогу **`/apex/com.android.conscrypt`** для усунення обмеження на читання, а потім відновлення вмісту на його початкове місце в межах **`/apex`**. Цей підхід вимагає швидких дій, щоб уникнути збоїв системи. Щоб забезпечити застосування цих змін по всій системі, рекомендується перезапустити `system_server`, що ефективно перезапускає всі програми та приводить систему до узгодженого стану.
Спроби перемонтувати **APEX cacerts path** як записувану зазнають невдачі, оскільки система не дозволяє такі операції. Навіть спроби відмонтувати або накласти на директорію тимчасову файлову систему (tmpfs) не долають незмінність; додатки продовжують отримувати доступ до оригінальних даних сертифікатів незалежно від змін на рівні файлової системи. Така стійкість зумовлена тим, що монтування **`/apex`** конфігуровано з PRIVATE propagation, що гарантує: будь‑які модифікації всередині директорії **`/apex`** не впливають на інші процеси.
Ініціалізація Android включає процес `init`, який при запуску ОС також ініціює процес Zygote. Цей процес відповідає за запуск процесів додатків із новим mount namespace, який включає приватний монтаж **`/apex`**, тим самим ізолюючи зміни в цій директорії від інших процесів.
Проте існує обхідний шлях для тих, кому потрібно змінити системно-довірені CA сертифікати в директорії **`/apex`**. Це передбачає ручне перемонтування **`/apex`** з метою видалення PRIVATE propagation, що робить його записуваним. Процес включає копіювання вмісту **`/apex/com.android.conscrypt`** в інше місце, відмонтування директорії **`/apex/com.android.conscrypt`** щоб усунути обмеження лише для читання, а потім відновлення вмісту назад у її початкове місце в **`/apex`**. Цей підхід вимагає швидких дій, щоб уникнути збоїв системи. Щоб гарантувати застосування змін у всій системі, рекомендується перезапустити system_server, що фактично перезапускає всі додатки і приводить систему у узгоджений стан.
```bash
# Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore.
@ -116,26 +133,26 @@ echo "System certificate injected"
```
### Bind-mounting through NSEnter
1. **Налаштування записуваної директорії**: Спочатку створюється записувана директорія шляхом монтування `tmpfs` поверх існуючої директорії системних сертифікатів, що не є APEX. Це досягається за допомогою наступної команди:
1. **Налаштування записуваного каталогу**: Спочатку створюється записуваний каталог шляхом монтування `tmpfs` поверх існуючого non-APEX системного каталогу сертифікатів. Це досягається за допомогою наступної команди:
```bash
mount -t tmpfs tmpfs /system/etc/security/cacerts
```
2. **Підготовка CA сертифікатів**: Після налаштування записуваної директорії, CA сертифікати, які планується використовувати, повинні бути скопійовані в цю директорію. Це може включати копіювання стандартних сертифікатів з `/apex/com.android.conscrypt/cacerts/`. Важливо відповідно налаштувати дозволи та мітки SELinux для цих сертифікатів.
3. **Прив'язка для Zygote**: Використовуючи `nsenter`, входять в простір імен монту Zygote. Zygote, будучи процесом, відповідальним за запуск Android додатків, вимагає цього кроку, щоб забезпечити, що всі додатки, які будуть запущені надалі, використовують новонаконфігуровані CA сертифікати. Використовується команда:
2. **Preparing CA Certificates**: Після налаштування каталогу, доступного для запису, сертифікати CA, які планується використовувати, слід скопіювати в цей каталог. Це може включати копіювання сертифікатів за замовчуванням з `/apex/com.android.conscrypt/cacerts/`. Необхідно відповідно налаштувати права доступу та мітки SELinux для цих сертифікатів.
3. **Bind Mounting for Zygote**: Використовуючи `nsenter`, потрібно увійти в простір імен монтовань процесу Zygote. Zygote, як процес, відповідальний за запуск Android-додатків, вимагає цього кроку, щоб гарантувати, що всі додатки, що будуть запускатися надалі, використовуватимуть ново налаштовані сертифікати CA. Команда, що використовується:
```bash
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
Це забезпечує, що кожен новий додаток, який запускається, буде дотримуватись оновленої конфігурації CA сертифікатів.
Це гарантує, що кожен новий додаток під час запуску дотримуватиметься оновленого налаштування сертифікатів CA.
4. **Застосування змін до запущених додатків**: Щоб застосувати зміни до вже запущених додатків, знову використовується `nsenter`, щоб увійти в простір імен кожного додатку окремо та виконати подібне зв'язування. Необхідна команда:
4. **Застосування змін до працюючих додатків**: Щоб застосувати зміни до вже запущених додатків, знову використовується `nsenter`, щоб увійти в namespace кожного додатку окремо та виконати аналогічний bind mount. Необхідна команда:
```bash
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
5. **Альтернативний підхід - М'який перезапуск**: Альтернативний метод передбачає виконання прив'язки до процесу `init` (PID 1), після чого слідує м'який перезапуск операційної системи за допомогою команд `stop && start`. Цей підхід дозволить поширити зміни на всі простори імен, уникаючи необхідності окремо вирішувати питання з кожним запущеним додатком. Однак цей метод зазвичай менш бажаний через незручність перезавантаження.
5. **Alternative Approach - Soft Reboot**: Альтернативний метод полягає у виконанні bind mount на процесі `init` (PID 1) з наступним soft reboot операційної системи за допомогою команд `stop && start`. Цей підхід поширить зміни на всі namespaces, уникаючи необхідності окремо обробляти кожен запущений app. Однак цей метод загалом менш бажаний через незручність перезавантаження.
## References
- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
- [Android 14: Install a system CA certificate on a rooted device](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
{{#include ../../banners/hacktricks-training.md}}