Android
Страница посвящена тестированию на проникновение Android-приложений.
Содержание
- 1 Этап I - получение APK
- 2 Этап II - Распаковка приложения
- 3 Этап III - получение исходных кодов
- 4 Этап IV - включение отладки
- 5 Этап VI - патчинг
- 6 Этап V - подключение frida
- 7 Этап VI - переупаковка приложения
- 8 Этап VII - добавление подписи
- 9 Этап VIII - сборка приложения
- 10 Этап IX - запуск приложения
- 11 Список проверок
- 11.1 Наличие обфускации
- 11.2 ROOT detection
- 11.3 Устаревший SafetyNetAPI
- 11.4 Отсутствие проверки на контейнеризацию
- 11.5 Секреты в коде
- 11.6 Остаточная информация
- 11.7 Небезопасные привилегии
- 11.8 FireBase Misconfiguration
- 11.9 AndroidManifest.xml - Debug
- 11.10 AndroidManifest.xml - Backup
- 11.11 TEST
- 11.12 TEST
- 12 Ссылки
Этап I - получение APK
С устройства
Из интернета
Этап II - Распаковка приложения
Этап III - получение исходных кодов
Этап IV - включение отладки
Этап VI - патчинг
.smali
.java
Этап V - подключение frida
Этап VI - переупаковка приложения
Этап VII - добавление подписи
Этап VIII - сборка приложения
Этап IX - запуск приложения
На эмуляторе
На устройстве
Список проверок
Наличие обфускации
Как правило относится только к Java-коду но в редких случаях и к native-библиотекам.
Проверка
Для Java - достаточно посмотреть читается ли декомпилированный код или нет.
Для Native сложнее - нужно открыть ее в дизассемблере и уже смотреть статьи по обфускации кода (например добавление Virtual Machine в ассемблерный код)
Эксплуатация
Просто чтение кода и изучение используемых алгоритмов.
Исправление
Использовать бесплатные или платные(лучше) обфускаторы кода.
Ссылки
ROOT detection
Определяет есть ли на устройстве рут или нет.
Проверка
Либо поиск по ключевым словам "root", "safetynet api", "play integrity" либо запуск на рутованном девайсе
Также часть решений могут детектить по работе с директориями которые по-умолчанию закрыты (например /etc/)
TODO
Эксплуатация
Отсутствует, просто best-practice
Исправление
Добавление детекта например на базе платных продуктов или Play Integrity API.
Ссылки
Устаревший SafetyNetAPI
Использование устаревшего SafetyNetAPI для проверки целостности, рута и тд.
Проверка
Поиск в коде по строке "SafetyNet".
Эксплуатация
Magisc Bypass - https://github.com/kdrag0n/safetynet-fix/
Zygisk Bypass with detection evasion https://github.com/kdrag0n/safetynet-fix/issues/269
Youtube - https://www.youtube.com/watch?v=2J4QHsB5lsA
Исправление
Использовать новый Play Integrity
Ссылки
https://developer.android.com/privacy-and-security/safetynet/attestation
https://developer.android.com/privacy-and-security/safetynet/deprecation-timeline
https://developer.android.com/google/play/integrity
Отсутствие проверки на контейнеризацию
Китайцы опубликовали новое решение под названием MultiApp - https://github.com/WaxMoon/MultiApp и демо-приложением https://github.com/WaxMoon/MultiAppDemo и именно это приложение легло в основу VCamera. VCamera использует "HackAPI" которое указано в "MultiApp".
Позволяет запускать другое приложение в контейнере с (как я понял) перехватом части системных вызовов, например камеры.
Проверка
Самая быстрая проверка - скачивание VCamera и тестирование с приложением https://play.google.com/store/apps/details?id=virtual.camera.app&hl=en_GB
Эксплуатация
На данный момент самое простое - VCamera и показать что камера была подменена.
Исправление
Проверки надо делать в Native-коде (С/C++ код) приложения с вызовом syscall
пример такой проверки - https://github.com/andvipgroup/VCamera/blob/f12f0b9c7131948b9369dd50aee3f3a23ab249e1/check_env_demo/code/native-lib.cpp
Почему так можно определить окружение? Как я понял, потому что хуки если и можно вешать, то не на системные функции ядра (по крайней мере без рута), поэтому вызов системных функций из Native-кода позволяет определить такую виртуализацию.
Ссылки
https://play.google.com/store/apps/details?id=virtual.camera.app&hl=en_GB
https://github.com/WaxMoon/MultiApp
https://github.com/WaxMoon/MultiAppDemo
Секреты в коде
Спрятанные в коде секреты
Проверка
1. Искать самому секреты по ключевым словам
2. Использовать SemGrep для поиска секретов
3. Использовать автоматические утилиты (например, MobSF) которые ищут в тч секреты
Эксплуатация
В зависимости от полученного секрета.
Исправление
Убрать секреты из кода приложения (иногда меняя архитектуру системы).
Ссылки
Остаточная информация
Поиск остаточной информации после компиляции в коде приложения.
Проверка
Что за информация может быть:
1. Private URLs
2. IP-addresses
3. Private API-endpoints
4. Полный путь компиляции (включая имя пользователя)
5. ...
Поиск опять же с SemGrep, MobSF или вручную.
Эксплуатация
Зависит от полученной информации, обычно не эксплуатируется отдельно от других уязвимостей.
Исправление
(Просто удалите если оно не требуется)
Ссылки
Небезопасные привилегии
В AndroidManifest.xml есть список привилегий приложения. Некоторые из них могут быть опасны.
Проверка
Обычно можно не мучиться и дать MobSF проверить привилегии.
JadX может распаковать AndroidManifest.xml и перевести его в читаемый формат.
Эксплуатация
В зависимости от привилегий, но как правила это просто best-practise.
Исправление
Отключение ненужных или опасных привилегий.
Ссылки
FireBase Misconfiguration
Различные мисконфиги сервиса FireBase по сбору логов.
Проверка
Поиск по подстроке "firebase" - поиск firebase url.
Эксплуатация
Один из вариантов - попытаться сдампить FireBase DB.
Пример - вы нашли URL test.firebaseio.com
Попробуйте открыть test.firebaseio.com/.json - если есть бд то уязвимо.
Другой вариант - сделать PUT запрос на
import requests
data= {"Exploit":"Successfull", "H4CKED BY": "Sheikh Rishad"}
reponse = requests.put("https://test.firebaseio.com/.json", json=data)
И проверить заменились ли данные. Но! Осторожнее мб бд перезаписывает.
Исправление
TODO
Ссылки
https://cyberweapons.medium.com/misconfigured-firebase-db-on-both-android-and-web-apps-a85927e4678f
https://hackerone.com/reports/1065134
AndroidManifest.xml - Debug
Включенный дебаг позволяет отладчику с ADB подключаться и отлаживать приложение.
Проверка
debuggable="true"
Поиск этой строки в AndroidManifest.xml
Также это можно найти автоматически с MobSF.
Эксплуатация
Обычно проще всего это сделать в AndroidStudio - выбрать устройство для отладки при открытом APK-файле.
Исправление
debuggable="false"
Ссылки
AndroidManifest.xml - Backup
Включенная возможность бекапить приложение с настройками.
Проверка
android:allowBackup="true"
Поиск этой строки в AndroidManifest.xml
Также это можно найти автоматически с MobSF.
Эксплуатация
Для Samsung мб нужно будет удалить безопасное хранилище Knox.
adb shell pm list packages -f -3
# Список приложений
...
# Замените на ссылку приложения
adb pull /data/app/org.fedorahosted.freeotp-Rbf2NWw6F-SqSKD7fZ_voQ==/base.apk freeotp.apk
Исправление
android:allowBackup="false"
Ссылки
https://gist.github.com/AnatomicJC/e773dd55ae60ab0b2d6dd2351eb977c1
TEST
Краткое_описание
Проверка
Эксплуатация
Исправление
Ссылки
TEST
Краткое_описание