mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/react-native-a
This commit is contained in:
parent
48e817292d
commit
a83ad4a65d
@ -1,26 +1,40 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Аналіз додатка React Native
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Щоб підтвердити, чи був додаток створений на основі фреймворку React Native, виконайте ці кроки:
|
||||
|
||||
1. Перейменуйте файл APK з розширенням zip і витягніть його в нову папку, використовуючи команди `cp com.example.apk example-apk.zip` та `unzip -qq example-apk.zip -d ReactNative`.
|
||||
1. Перейменуйте файл APK з розширенням zip і витягніть його в нову папку, використовуючи команду `cp com.example.apk example-apk.zip` та `unzip -qq example-apk.zip -d ReactNative`.
|
||||
|
||||
2. Перейдіть до новоствореної папки ReactNative і знайдіть папку assets. Усередині цієї папки ви повинні знайти файл `index.android.bundle`, який містить React JavaScript у мінімізованому форматі.
|
||||
|
||||
3. Використовуйте команду `find . -print | grep -i ".bundle$"` для пошуку файлу JavaScript.
|
||||
|
||||
## Javascript Код
|
||||
Примітка: Якщо вам надано Android App Bundle (.aab) замість APK, спочатку згенеруйте універсальний APK, а потім витягніть пакет:
|
||||
```bash
|
||||
# Get bundletool.jar and generate a universal APK set
|
||||
java -jar bundletool.jar build-apks \
|
||||
--bundle=app-release.aab \
|
||||
--output=app.apks \
|
||||
--mode=universal \
|
||||
--overwrite
|
||||
|
||||
Якщо перевіряючи вміст `index.android.bundle`, ви знайдете JavaScript код додатка (навіть якщо він мінімізований), ви можете **аналізувати його для виявлення чутливої інформації та вразливостей**.
|
||||
# Extract the APK and then unzip it to find assets/index.android.bundle
|
||||
unzip -p app.apks universal.apk > universal.apk
|
||||
unzip -qq universal.apk -d ReactNative
|
||||
ls ReactNative/assets/
|
||||
```
|
||||
## Javascript Code
|
||||
|
||||
Оскільки бандл фактично містить увесь JS код додатка, можливо **поділити його на різні файли** (потенційно спрощуючи його реверс-інжиніринг), використовуючи **інструмент [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
Якщо перевіряючи вміст `index.android.bundle`, ви знайдете JavaScript код програми (навіть якщо він мінімізований), ви можете **проаналізувати його, щоб знайти чутливу інформацію та вразливості**.
|
||||
|
||||
Оскільки пакет фактично містить весь JS код програми, можливо **поділити його на різні файли** (потенційно спрощуючи його реверс-інжиніринг), використовуючи **інструмент [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
|
||||
### Webpack
|
||||
|
||||
Щоб додатково проаналізувати JavaScript код, ви можете завантажити файл на [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) або виконати ці кроки:
|
||||
Щоб далі проаналізувати JavaScript код, ви можете завантажити файл на [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) або виконати ці кроки:
|
||||
|
||||
1. Створіть файл з назвою `index.html` у тій же директорії з наступним кодом:
|
||||
1. Створіть файл з назвою `index.html` в тому ж каталозі з наступним кодом:
|
||||
```html
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
@ -40,42 +54,142 @@
|
||||
|
||||
3. Було щасливо, що чутливі жорстко закодовані облікові дані були знайдені в коді JavaScript під час процесу розвідки.
|
||||
|
||||
### Змінити код JS і перебудувати
|
||||
### Швидкий пошук секретів/кінцевих точок у пакетах
|
||||
|
||||
У цьому випадку змінити код легко. Вам просто потрібно перейменувати додаток, щоб використовувати розширення `.zip` і витягти його. Потім ви можете **змінити код JS всередині цього пакету і перебудувати додаток**. Це повинно бути достатньо, щоб дозволити вам **впровадити код** у додаток для тестування.
|
||||
Ці прості grep часто виявляють цікаві індикатори навіть у мінімізованому JS:
|
||||
```bash
|
||||
# Common backends and crash reporters
|
||||
strings -n 6 index.android.bundle | grep -Ei "(api\.|graphql|/v1/|/v2/|socket|wss://|sentry\.io|bugsnag|appcenter|codepush|firebaseio\.com|amplify|aws)"
|
||||
|
||||
## Байткод Hermes
|
||||
# Firebase / Google keys (heuristics)
|
||||
strings -n 6 index.android.bundle | grep -Ei "(AIza[0-9A-Za-z_-]{35}|AIzaSy[0-9A-Za-z_-]{33})"
|
||||
|
||||
Якщо пакет містить **байткод Hermes**, ви **не зможете отримати доступ до коду Javascript** додатка (навіть до мінімізованої версії).
|
||||
# AWS access key id heuristic
|
||||
strings -n 6 index.android.bundle | grep -E "AKIA[0-9A-Z]{16}"
|
||||
|
||||
Ви можете перевірити, чи містить пакет байткод Hermes, виконавши наступну команду:
|
||||
# Expo/CodePush deployment keys
|
||||
strings -n 6 index.android.bundle | grep -Ei "(CodePush|codepush:\\/\\/|DeploymentKey)"
|
||||
|
||||
# Sentry DSN
|
||||
strings -n 6 index.android.bundle | grep -Ei "(Sentry\.init|dsn\s*:)"
|
||||
```
|
||||
Якщо ви підозрюєте фреймворки оновлення по повітрю, також шукайте:
|
||||
- Microsoft App Center / CodePush ключі розгортання
|
||||
- Налаштування Expo EAS Updates (`expo-updates`, `expo\.io`, сертифікати підпису)
|
||||
|
||||
### Змінити JS код і перезібрати
|
||||
|
||||
У цьому випадку змінити код легко. Вам просто потрібно перейменувати додаток, щоб використовувати розширення `.zip` і витягти його. Потім ви можете **модифікувати JS код всередині цього пакету і перезібрати додаток**. Це має бути достатньо, щоб дозволити вам **впровадити код** в додаток для тестування.
|
||||
|
||||
## Байт-код Hermes
|
||||
|
||||
Якщо пакет містить **байт-код Hermes**, ви **не зможете отримати доступ до Javascript коду** додатка (навіть до мінімізованої версії).
|
||||
|
||||
Ви можете перевірити, чи містить пакет байт-код Hermes, запустивши наступну команду:
|
||||
```bash
|
||||
file index.android.bundle
|
||||
index.android.bundle: Hermes JavaScript bytecode, version 96
|
||||
```
|
||||
Однак ви можете використовувати інструменти **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** або **[hermes_rs](https://github.com/Pilfer/hermes_rs)** для **дизасемблювання байт-коду** та також для **декомпіляції його в деякий псевдо JS код**. Для цього, наприклад, ці команди:
|
||||
Однак ви можете використовувати інструменти **[hbctool](https://github.com/bongtrop/hbctool)**, оновлені форки hbctool, які підтримують новіші версії байт-коду, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (бібліотека/API на Rust) або **[hermes-dec](https://github.com/P1sec/hermes-dec)** для **дизасемблювання байт-коду** та також для **декомпіляції його в деякий псевдо JS код**. Наприклад:
|
||||
```bash
|
||||
# Disassemble and re-assemble with hbctool (works only for supported HBC versions)
|
||||
hbctool disasm ./index.android.bundle ./hasm_out
|
||||
# ...edit ./hasm_out/**/*.hasm (e.g., change comparisons, constants, feature flags)...
|
||||
hbctool asm ./hasm_out ./index.android.bundle
|
||||
|
||||
# Using hasmer (focus on disassembly; assembler/decompiler are WIP)
|
||||
hasmer disasm ./index.android.bundle -o hasm_out
|
||||
|
||||
# Using hermes-dec to produce pseudo-JS
|
||||
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
```
|
||||
### Зміна коду та перебудова
|
||||
Порада: Проект з відкритим кодом Hermes також постачає інструменти для розробників, такі як `hbcdump`, у специфічних релізах Hermes. Якщо ви зберете відповідну версію Hermes, яка використовувалася для створення пакету, `hbcdump` може вивантажити функції, таблиці рядків та байт-код для глибшого аналізу.
|
||||
|
||||
Ідеально, ви повинні мати можливість змінити дизасембльований код (змінивши порівняння, або значення, або що б ви не хотіли змінити) і потім **перебудувати байт-код** і потім перебудувати додаток.
|
||||
### Змінити код і перебудувати (Hermes)
|
||||
|
||||
Інструмент **[hbctool](https://github.com/bongtrop/hbctool)** підтримує дизасемблювання пакету та його повторну збірку після внесення змін, однак він **підтримує лише старі версії** байт-коду Hermes.
|
||||
В ідеалі ви повинні мати можливість змінити дизасембльований код (змінюючи порівняння, значення або що-небудь, що потрібно змінити), а потім **перебудувати байт-код** і перебудувати додаток.
|
||||
|
||||
Інструмент **[hermes-dec](https://github.com/P1sec/hermes-dec)** не підтримує перебудову байт-коду.
|
||||
- Оригінальний **[hbctool](https://github.com/bongtrop/hbctool)** підтримує дизасемблювання пакету та його повторну збірку після змін, але історично підтримував лише старі версії байт-коду. Форки, що підтримуються спільнотою, розширюють підтримку новіших версій Hermes (включаючи середину 80-х–96) і часто є найпрактичнішим варіантом для патчування сучасних RN додатків.
|
||||
- Інструмент **[hermes-dec](https://github.com/P1sec/hermes-dec)** не підтримує повторну збірку байт-коду (тільки декомпілятор/дизасемблер), але дуже корисний для навігації по логіці та вивантаження рядків.
|
||||
- Інструмент **[hasmer](https://github.com/lucasbaizer2/hasmer)** має на меті підтримувати як дизасемблювання, так і збірку для кількох версій Hermes; збірка все ще розвивається, але варто спробувати на останньому байт-коді.
|
||||
|
||||
Інструмент **[hermes_rs](https://github.com/Pilfer/hermes_rs)** підтримує перебудову байт-коду, але насправді це бібліотека, а не CLI інструмент.
|
||||
Мінімальний робочий процес з асемблерами, подібними до hbctool:
|
||||
```bash
|
||||
# 1) Disassemble to HASM directories
|
||||
hbctool disasm assets/index.android.bundle ./hasm
|
||||
|
||||
# 2) Edit a guard or feature flag (example: force boolean true)
|
||||
# In the relevant .hasm, replace a LoadConstUInt8 0 with 1
|
||||
# or change a conditional jump target to bypass a check.
|
||||
|
||||
# 3) Reassemble into a new bundle
|
||||
hbctool asm ./hasm assets/index.android.bundle
|
||||
|
||||
# 4) Repack the APK and resign
|
||||
zip -r ../patched.apk *
|
||||
# Align/sign as usual (see Android signing section in HackTricks)
|
||||
```
|
||||
Зверніть увагу, що формат байт-коду Hermes має версію, і асемблер повинен відповідати точному формату на диску. Якщо ви отримуєте помилки формату, перейдіть на оновлений форк/альтернативу або перебудуйте відповідні інструменти Hermes.
|
||||
|
||||
## Динамічний аналіз
|
||||
|
||||
Ви можете спробувати динамічно проаналізувати додаток, використовуючи Frida, щоб увімкнути режим розробника React додатку та використовувати **`react-native-debugger`** для підключення до нього. Однак для цього вам, очевидно, потрібен вихідний код додатку. Ви можете знайти більше інформації про це в [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
Ви можете спробувати динамічно проаналізувати додаток, використовуючи Frida для активації режиму розробника React-додатку та використовуючи **`react-native-debugger`** для підключення до нього. Однак для цього вам, очевидно, потрібен вихідний код додатку. Ви можете знайти більше інформації про це за посиланням [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
|
||||
### Увімкнення підтримки розробника в релізі з Frida (зауваження)
|
||||
|
||||
Деякі додатки випадково постачають класи, які роблять підтримку розробника перемикаючою. Якщо вони присутні, ви можете спробувати примусити `getUseDeveloperSupport()` повернути true:
|
||||
```javascript
|
||||
// frida -U -f com.target.app -l enable-dev.js
|
||||
Java.perform(function(){
|
||||
try {
|
||||
var Host = Java.use('com.facebook.react.ReactNativeHost');
|
||||
Host.getUseDeveloperSupport.implementation = function(){
|
||||
return true; // force dev support
|
||||
};
|
||||
console.log('[+] Patched ReactNativeHost.getUseDeveloperSupport');
|
||||
} catch (e) {
|
||||
console.log('[-] Could not patch: ' + e);
|
||||
}
|
||||
});
|
||||
```
|
||||
Warning: У правильно побудованих релізних збірках `DevSupportManagerImpl` та пов'язані з ним класи, призначені лише для налагодження, видаляються, і зміна цього прапорця може призвести до збою програми або не мати жодного ефекту. Коли це працює, ви зазвичай можете відкрити меню розробника та підключити налагоджувачі/інспектори.
|
||||
|
||||
### Перехоплення мережі в RN додатках
|
||||
|
||||
React Native Android зазвичай покладається на OkHttp під капотом (через рідний модуль `Networking`). Щоб перехопити/спостерігати за трафіком на пристрої без root-доступу під час динамічних тестів:
|
||||
- Використовуйте системний проксі + довіряйте CA користувача або використовуйте інші загальні техніки обходу TLS для Android.
|
||||
- Порада специфічна для RN: якщо програма випадково включає Flipper у релізі (інструменти налагодження), плагін Flipper Network може відкрити запити/відповіді.
|
||||
|
||||
Для загальних технік перехоплення Android та обходу пінінгу зверніться до:
|
||||
|
||||
{{#ref}}
|
||||
make-apk-accept-ca-certificate.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
frida-tutorial/objection-tutorial.md
|
||||
{{#endref}}
|
||||
|
||||
## Останні проблеми в популярних бібліотеках RN (на що звернути увагу)
|
||||
|
||||
При аудиті сторонніх модулів, видимих у JS бандлі або рідних бібліотеках, перевірте наявність відомих вразливостей та перевірте версії у `package.json`/`yarn.lock`.
|
||||
|
||||
- react-native-mmkv (Android): версії до 2.11.0 записували необов'язковий ключ шифрування в журнали Android. Якщо доступні ADB/logcat, секрети можуть бути відновлені. Переконайтеся, що версія >= 2.11.0. Показники: використання `react-native-mmkv`, журнальні записи, що згадують ініціалізацію MMKV з шифруванням. CVE-2024-21668.
|
||||
- react-native-document-picker: версії < 9.1.1 були вразливі до обходу шляху на Android (вибір файлів), виправлено в 9.1.1. Перевірте введення та версію бібліотеки.
|
||||
|
||||
Швидкі перевірки:
|
||||
```bash
|
||||
grep -R "react-native-mmkv" -n {index.android.bundle,*.map} 2>/dev/null || true
|
||||
grep -R "react-native-document-picker" -n {index.android.bundle,*.map} 2>/dev/null || true
|
||||
# If you also have the node_modules (rare on release): grep -R in package.json / yarn.lock
|
||||
```
|
||||
## Посилання
|
||||
|
||||
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
|
||||
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
|
||||
- CVE-2024-21668: react-native-mmkv записує ключ шифрування журналів на Android, виправлено в v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
|
||||
- hbctool (та форки) для Hermes складання/розбирання: https://github.com/bongtrop/hbctool
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user