Карликовый Сад Для Роботов. Ищем Низко Висящие Фрукты В Android
Внутренний мир Android-приложений часто интересует баг-хантеров, пентестеров и прочих безопасников. Но не каждый понимает, как подступиться к приложению, на русском языке материала не так много, а на английском далеко не всё бывает в актуальном состоянии. Так что хотелось пройти этот путь самому, заодно поделиться опытом, который может кому-то помочь.
Я не являюсь профессиональным реверсером или Android разработчиком. Но хотел понять, что можно получить из Android-приложения не имея специальных навыков.
Как выглядит процесс анализа:
- Получение apk-файла. Вариантов множество. Можно с телефона, скачать из F-Droid, воспользоваться утилитой вроде apkeep или apkpull .
- Декомпилируем apk. Можно использовать apktool или jadx. Декомпилированный код можно выгрузить в виде проекта для Android Studio или иной IDE и в ней же открыть.
- Анализируем исходники на предмет интересных конфигов (папка assets), строк (res/values/*) и всего, за что зацепится глаз.
- ?????
- Profit
Получение apk-файла
В первую очередь нам нужно как-то получить сам apk-файл, для этого нам нужно знать название пакета приложения, например мы можем его узнать из url магазина приложений, например Google Play.
Пример ссылки:
|
|
Дальше у нас есть два пути: получить apk с телефона, или скачать и магазина приложений. С первым вариантом могут быть сложности, так как может потребоваться root.
Получаем приложение с телефона по adb
Запрашиваем список установленных приложений:
|
|
Получаем полный путь до желаемого apk
|
|
Скачиваем нужный apk-файл:
|
|
Так же можно использовать и готовые инструменты вроде APKpull, который работает поверх adb.
Для удобства можно использовать однострочник:
|
|
Скачиваем apk из магазина приложений
Этот пункт сильно проще, мы его можем скачать руками из:
Можно скачать используя готовые инструменты:
- apk-downloader (использует APKsFULL)
- apkeep (скачивает с Play Store, APKPure, F-Droid, Huawei AppGallery)
Распаковка apk
Вне зависимости от цели анализа приложения, без этапа декомпиляции или распаковки не обойтись. В принципе, мы можем распаковать его как обычный архив (unzip example.apk -d extract_dir
), но так ничего интересного мы не получим, и нам потребуются декомпиляторы.
Инструментов может быть много, но мы будем использовать два основных:
apktool
|
|
jadx
|
|
Так же можно сразу открыть apk с помощью jadx-gui и сохранить как проект Gradle:
|
|
Что лучше: jadx vs. apktool
Вопрос хороший. Иметь лучше оба инструмента и уметь ими пользоваться. И желательно знать их особенности.
apktool
- Разбирает ресурсы до состояния, близкого к оригиналу и позволяет получить как можно больше ресурсов из приложения
- Apktool декомпилирует APK в Smali, что позволяет модифицировать и пересобрать apk
- Нет gui, быстрого просмотра структуры/файлов/текста.
jadx
- Позволяет увидеть структуру приложения после декомпиляции
- jadx может декомпилировать файлы .dex в файлы классов Java, обеспечивая читабельность кода и возможность проверки кода SAST
- Возможность сохранения декомпилированного приложения в виде проекта Gradle
- Декомпиляция приложения может завершиться неудачей, если в приложении используются символы, отличные от ASCII
Собираем низковисящие фрукты
В ходе анализа можно пройтись как обычными инструментами, там и специализированными. Например для анализа кода мы можем использовать какой-нибудь удобный для нас SAST (в моём случае это semgrep), а так же разными инструментами, рассчитанными на работу с Android приложениями. Но для начала не будет лишним пробежаться самому, возможно в ходе ручного поиска найдется что-то интересное, что упустят инструменты.
Ручной поиск
Автоматизированный поиск может пропустить некоторые интересные моменты, например секреты в res/values/strings.xml
. Прочие xml-файлы в res/values
тоже имеет смысл проверить самостоятельно.
Так же нам может быть интересен AndroidManifest.xml, файлы с расширением .sqlite и .db, содержимое директории assets.
SAST
semgrep
semgrep - довольно известный SAST-инструмент. Пройтись по коду каким-либо SAST лишним не будет. Не факт, что это будут простые или эксплуатируемые уязвимости, но находки могут быть интересными.
|
|
Есть отдельный репозиторий с правилами для Android - github.com/mindedsecurity/semgrep-rules-android-security
|
|
Правила работают не предсказуемо. На момент написания статьи правила могли вызывать ошибку:
1
TypeError: unhashable type: 'list'
jadx 1.4.7
semgrep 1.55.0 и1.59.0
Скрипты и инструменты
Начнем с обычных инструментов, переходя от простого к сложному.
apk2url
apk2url извлекает URL и IP конечных точек из APK-файла и выполняет фильтрацию в выходной файл .txt.
Стоит учесть тот момент, что apk2url декомпилирует apk используя jadx.
|
|
apkleaks
apkleaks - cканирует APK на наличие URI/URL эндпоинтов и секретов. Инструмент давно не обновлялся, но всё ещё применим и актуален.
apkleaks так же использует jadx для декомпиляции apk.
|
|
|
|
Фреймворки
APKHunt
APKHunt - это комплексный инструмент статического анализа кода приложений для Android, основанный на фреймворке OWASP MASVS v1.5.0. APKHunt охватывает большинство тестовых случаев SAST связанных с OWASP MASVS и обеспечивает низкий процент ложных срабатываний.
Сам распакует (jadx), сам проверит и выдаст подробный отчёт.
|
|
Но в силу особенностей, APKHunt работает только в Linux.
MobFS
MobSF - это автоматизированная система для тестирования мобильных приложений (Android/iOS/Windows), анализа вредоносного ПО и оценки безопасности, выполняющая статический и динамический анализ.
У MobFS есть удобный веб-интерфейс, что позволяет держать все результаты сканирования в одном месте, а так же работать с множеством приложений. Так же при желании он интегрируется в CI/CD.
Разворачивается в docker:
|
|
Документация: mobsf.github.io/docs/.
Пощупать на тестовом приложении можно онлайн на mobsf.live.
Иные инструменты
Не мог обойти внимание инструменты которые хоть и будут бесполезны для новичков на начальных этапах, в дальнейшем могут стать полезными помощниками в работе.
mobileAudit
MobileAudit - SAST для APK. MobileAudit фокусируется не только на тестировании безопасности и защитных сценариях и больше применим для анализа малвари:
- Статический анализ (SAST): Выполняет полную декомпиляцию APK и извлекает из него всю возможную информацию. Он сообщает о различных уязвимостях и находках в исходном коде, сгруппированных по различным категориям. Также имеется полная поддержка триажа находок.
- Анализ вредоносного ПО: находит опасные разрешения и подозрительный код.
- Best Practices of Secure Android Coding: подсказывает разработчикам, в каких частях кода они пишут безопасно, а в каких - нет.
Drozer
Drozer - система аудита безопасности и атак для Android.
Drozer позволяет получить информацию о приложении, запустить его активности, подключиться к ContentProvider, отправить сообщения сервису, предоставляя инструменты для использования публичных эксплойтов для Android.
Всё, чтобы вытащить из приложения информацию или заставить его сделать то, что нам нужно через стандартные API и каналы коммуникации.
Для взаимодействия drozer использует агент (который будет использоваться как RAT/reverse shell), устанавливаемый на телефон/эмулятор.
Drozer давно не обновлялся, поэтому могут быть проблемы с установкой.
Withsecure: Drozer
Github: Drozer-Docker
hacktricks.xyz: Drozer Tutorial
Habr: Проверяем безопасность приложений с помощью Drozer
Тренируемся на уязвимых приложениях
Никто не запрещает работать сразу c приложениями из маркетов, но находить более сложные уязвимости вряд ли выйдет. Для этого есть специальные уязвимые приложения, написанные для образовательных целей.
На чём потренироваться:
Github: DIVA Android - Damn Insecure and vulnerable App for Android
Github: Damn Vulnerable Bank
Github: Vuldroid - Vulnerable Android Application
Что почитать
Материалы от OWASP
OWASP Mobile Application Security
OWASP Mobile Application Security Testing Guide
Статьи
fi5t: Как вкатиться в безопасность android приложений в 2024
hacktricks: Android APK Checklist
Telegram-каналы
Mobile AppSec World
Android Guards
Github-репозитории
Github: awesome-android-security
Github: Awesome Android Reverse Engineering
Outro
Процесс реверса Android-приложений можно описать кратким “Easy To Learn But Hard To Master”, так как без знания Java/Kotlin и знания разработки под Android сложно углубиться в поиск уязвимостей. Но для того, чтобы начать их искать нужно не так и много: желание, любопытство и пара инструментов.