Карликовый сад для роботов. Ищем низко висящие фрукты в Android

Внутренний мир Android-приложений часто интересует баг-хантеров, пентестеров и прочих безопасников. Но не каждый понимает, как подступиться к приложению, на русском языке материала не так много, а на английском далеко не всё бывает в актуальном состоянии. Так что хотелось пройти этот путь самому, заодно поделиться опытом, который может кому-то помочь.

Я не являюсь профессиональным реверсером или Android разработчиком. Но хотел понять, что можно получить из Android-приложения не имея специальных навыков.

Как выглядит процесс анализа:

  • Получение apk-файла. Вариантов множество. Можно с телефона, скачать из F-Droid, воспользоваться утилитой вроде apkeep или apkpull .
  • Декомпилируем apk. Можно использовать apktool или jadx. Декомпилированный код можно выгрузить в виде проекта для Android Studio или иной IDE и в ней же открыть.
  • Анализируем исходники на предмет интересных конфигов (папка assets), строк (res/values/*) и всего, за что зацепится глаз.
  • ?????
  • Profit

Получение apk-файла

В первую очередь нам нужно как-то получить сам apk-файл, для этого нам нужно знать название пакета приложения, например мы можем его узнать из url магазина приложений, например Google Play.

Пример ссылки:

1
https://play.google.com/store/apps/details?id=com.example.app

Дальше у нас есть два пути: получить apk с телефона, или скачать и магазина приложений. С первым вариантом могут быть сложности, так как может потребоваться root.

Получаем приложение с телефона по adb

Запрашиваем список установленных приложений:

1
2
3
4
adb shell pm list packages
# Можно использовать grep для удобства
adb shell pm list packages | grep example
package:com.example.app

Получаем полный путь до желаемого apk

1
2
3
4
5
6
adb shell pm path com.example.app
# Должно получиться что-то вроде такого
package:/data/app/~~fD3m3SCkscvlQCc3IpncKw==/com.example.app-K7_gdHCjcFTAyLk94z3Ttg==/base.apk
package:/data/app/~~fD3m3SCkscvlQCc3IpncKw==/com.example.app-K7_gdHCjcFTAyLk94z3Ttg==/split_config.arm64_v8a.apk
package:/data/app/~~fD3m3SCkscvlQCc3IpncKw==/com.example.app-K7_gdHCjcFTAyLk94z3Ttg==/split_config.ru.apk
package:/data/app/~~fD3m3SCkscvlQCc3IpncKw==/com.example.app-K7_gdHCjcFTAyLk94z3Ttg==/split_config.xxhdpi.apk

Скачиваем нужный apk-файл:

1
adb pull /data/app/~~fD3m3SCkscvlQCc3IpncKw==/com.example.app-K7_gdHCjcFTAyLk94z3Ttg==/base.apk

Так же можно использовать и готовые инструменты вроде APKpull, который работает поверх adb.
Для удобства можно использовать однострочник:

1
curl -sL bit.ly/apkpull | bash -s -- com.example.app

Скачиваем apk из магазина приложений

Этот пункт сильно проще, мы его можем скачать руками из:

Можно скачать используя готовые инструменты:

  • apk-downloader (использует APKsFULL)
  • apkeep (скачивает с Play Store, APKPure, F-Droid, Huawei AppGallery)

Распаковка apk

Вне зависимости от цели анализа приложения, без этапа декомпиляции или распаковки не обойтись. В принципе, мы можем распаковать его как обычный архив (unzip example.apk -d extract_dir), но так ничего интересного мы не получим, и нам потребуются декомпиляторы.

Инструментов может быть много, но мы будем использовать два основных:

apktool

1
apktool d example.apk -o examlpe_apk_dir

jadx

1
2
# По какой-то причине jadx не понимает относительные пути, только абсолютные, возможно проблема только у меня
jadx -d /home/the29a/examlpe_apk_dir /home/the29a/example.apk

Так же можно сразу открыть apk с помощью jadx-gui и сохранить как проект Gradle:

1
File -> Save as gradle project

Что лучше: 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 лишним не будет. Не факт, что это будут простые или эксплуатируемые уязвимости, но находки могут быть интересными.

1
semgrep scan --config auto -o example_semgrep.log examlpe_apk_dir/

Есть отдельный репозиторий с правилами для Android - github.com/mindedsecurity/semgrep-rules-android-security

1
2
3
4
git clone https://github.com/mindedsecurity/semgrep-rules-android-security
jadx -d examlpe_apk_dir target.apk
cd semgrep-rules-android-security/
semgrep -c ./rules/ ..examlpe_apk_dir

Правила работают не предсказуемо. На момент написания статьи правила могли вызывать ошибку:

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.

1
2
git clone https://github.com/n0mi1k/apk2url
./apk2url.sh /home/the29a/example.apk

apkleaks

apkleaks - cканирует APK на наличие URI/URL эндпоинтов и секретов. Инструмент давно не обновлялся, но всё ещё применим и актуален.
apkleaks так же использует jadx для декомпиляции apk.

1
2
3
4
# Можно установить с помощью pip
pip3 install apkleaks
# Или использовать в виде docker-контейнера
docker pull dwisiswant0/apkleaks:latest
1
2
3
apkleaks -f /home/the29a/example.apk
# Можно запустить сразу с репортом в файл
apkleaks -f /home/the29a/example.apk -o apkleaks.report 

Фреймворки

APKHunt

APKHunt - это комплексный инструмент статического анализа кода приложений для Android, основанный на фреймворке OWASP MASVS v1.5.0. APKHunt охватывает большинство тестовых случаев SAST связанных с OWASP MASVS и обеспечивает низкий процент ложных срабатываний.

Сам распакует (jadx), сам проверит и выдаст подробный отчёт.

1
2
3
git clone https://github.com/Cyber-Buddy/APKHunt.git
cd APKHunt
go run apkhunt.go -p ~/example.apk

Но в силу особенностей, APKHunt работает только в Linux.

Видео-демо работы.

MobFS

MobSF - это автоматизированная система для тестирования мобильных приложений (Android/iOS/Windows), анализа вредоносного ПО и оценки безопасности, выполняющая статический и динамический анализ.

У MobFS есть удобный веб-интерфейс, что позволяет держать все результаты сканирования в одном месте, а так же работать с множеством приложений. Так же при желании он интегрируется в CI/CD.

Разворачивается в docker:

1
2
docker pull opensecurity/mobile-security-framework-mobsf:latest
docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest

Документация: mobsf.github.io/docs/.
Пощупать на тестовом приложении можно онлайн на mobsf.live.

Иные инструменты

Не мог обойти внимание инструменты которые хоть и будут бесполезны для новичков на начальных этапах, в дальнейшем могут стать полезными помощниками в работе.

mobileAudit

MobileAudit - SAST для APK. MobileAudit фокусируется не только на тестировании безопасности и защитных сценариях и больше применим для анализа малвари:

  • Статический анализ (SAST): Выполняет полную декомпиляцию APK и извлекает из него всю возможную информацию. Он сообщает о различных уязвимостях и находках в исходном коде, сгруппированных по различным категориям. Также имеется полная поддержка триажа находок.
  • Анализ вредоносного ПО: находит опасные разрешения и подозрительный код.
  • Best Practices of Secure Android Coding: подсказывает разработчикам, в каких частях кода они пишут безопасно, а в каких - нет.

OWASP Mobile Audit

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 сложно углубиться в поиск уязвимостей. Но для того, чтобы начать их искать нужно не так и много: желание, любопытство и пара инструментов.

0%