Мы в Digital Security часто проводим анализ Android-приложений, поэтому пришло время поделиться некоторыми накопленными знаниями и сделать обзор окружения, которое мы используем каждый день.
Существует множество вариантов для настройки пентестерского окружения, в котором можно выделить две группы устройств — виртуальные девайсы и физические.
У нас есть некоторое количество рутованных девайсов с одним и тем же окружением, однако иногда приходится использовать виртуальные. В основном, это Android Studio AVD.
Не так давно компания Microsoft зарелизила Windows Subsystem for Android (TM). Меня настолько заинтересовал данный инструмент, что я бросил своё рабочее окружение на Fedora Linux и поставил Windows 11.
Можно было бы писать эту статью в контексте реального устройства или виртуального девайса Android Studio, но мне кажется интереснее будет разобрать Windows Subsystem For Android ????
У данного варианта есть свои ограничения, о которых будет сказано в дальнейшем.
Как этот инструмент описывает сама Microsoft:
Подсистема Windows для Android позволяет устройству Windows 11 запускать приложения для Android, доступные в Amazon Appstore. Android является товарным знаком Google LLC. Это руководство поможет разработчикам, которые заинтересованы в создании приложений для настольных устройств Windows и оптимизации работы с операционной системой Windows.
Чтобы приложение Android было доступно на устройствах Windows 11, вам нужно сделать следующее: - Установите Amazon AppStore
На самом деле пункт про Amazon AppStore не совсем правда. Уже существует сборка WSA, которая идет в комплекте с Magisk, GApps и, естественно, root-доступом.
https://github.com/LSPosed/MagiskOnWSALocal
Данная сборка распространяется в репозитории, которым владеют разработчики LSPosed — активного форка XPosed. Репозиторий был заблокирован за нарушение правил использования Github Actions, и на данный момент он не предоставляет готовую сборку средствами GitHub.
Окей, соберем всё сами :)
Установка WSA
Для этого нам понадобятся только WSL с любым рабочим Линуксом и Windows 11. В интернете можно найти готовые сборки (например, тут), но мне кажется плохой практикой из статьи отправлять качать какой-то ZIP-архив из Telegram-канала. Ну и мы же всё-таки хакеры, которые умеют использовать командную строку.
Убедитесь, что у вас включена Virtual Machine Platform и WSL. Это можно сделать в приложении "Компоненты Windows" или "Windows Features" — зависит от вашей локали.
Далее необходимо использовать линукс для запуска скрипта, который скачивает требуемые артефакты и делает для нас сборку WSA. Я использую версию Ubuntu для WSL.
git clone https://github.com/LSPosed/MagiskOnWSALocal.git
cd MagiskOnWSALocal
cd scripts
sudo ./run.sh # На данном этапе установятся необходимые вещи для скрипта и будет создана сборка WSA.
Прокликиваем необходимые параметры. Я выбрал GApps Pico и Magisk.
Скрипт будет качать дистрибутив WSA размером 1.5гб, Magisk и OpenGApps, так что нужно подождать.
В результате у нас должна быть папка со следующим содержимым:
Открываем PowerShell с администраторскими привилегиями в данном каталоге и выполняем следующую команду:
Add-AppxPackage -Register .\AppxManifest.xml
Если команда выполнилась успешно, то вы только что установили WSA ????
Теперь в системе у вас должна появиться программа под названием "Параметры подсистемы Windows для Android"
Настройка девайса
Запустите её и включите режим разработчика.
Теперь мы можем подключиться по adb.
adb connect 127.0.0.1:58256
Для начала нам необходимо установить приложение Magisk, взять его можно в официальном репозитории https://github.com/topjohnwu/Magisk/releases .
adb install .\Magisk-v25.2.apk
Тут надо сделать отступление, что приложения, которые вы устанавливаете в WSA интегрируются в хостовую систему. Таким образом, через меню "Пуск" запускаем Magisk.
Теперь протестируем то, ради чего всё это делалось. Открываем adb shell и пробуем выполнить команду su
для повышения привилегий.
Если всё сделано правильно, то появится следующее окно с запросом предоставления прав суперпользователя.
Как итог:
Отлично. У нас есть Magisk и root-доступ. Следующим шагом установим LSPosed, чтобы можно было использовать модули XPosed. Сам XPosed не поддерживает свежие выпуски Android, а LSposed активный форк.
Скачаем следующие вещи:
Riru v25+
LSPosed module
К сожалению, у разработчика Magisk кончились силы на поддержку репозитория (пруф - https://topjohnwu.medium.com/state-of-magisk-2021-fe29fdaee458), поэтому придется немного поработать руками через Powershell.
Invoke-WebRequest "https://github.com/RikkaApps/Riru/releases/download/v25.4.4/riru-v25.4.4-release.zip" -OutFile "riru.zip"
adb push .\riru.zip /storage/emulated/0/
Invoke-WebRequest "https://github.com/LSPosed/LSPosed/releases/download/v1.8.3/LSPosed-v1.8.3-6552-riru-release.zip" -OutFile "lsposed.zip"
adb push .\lsposed.zip /storage/emulated/0/
Теперь идём в Magisk -> Модули -> Установить из хранилища и выбираем riru.zip. Также устанавливаем и lsposed.zip.
На следующем шаге нам необходимо еще установить приложение LSposed для менеджмента модулей. APK располагается по пути /data/adb/lspd/
.
su
cd /data/adb/lspd
cp manager.apk /data/local/tmp
pm install /data/local/tmp/manager.apk
# Необходим перезагрузить устройство, чтобы изменения вступили в силу.
reboot
Готово :) Теперь можно ставить модули и работать.
Заворачиваем трафик в прокси
Нашим каждодневным инструментом является BurpSuite — использовать будем именно его. Вы же можете использовать любой другой инструмент, например Owasp ZAP или MitmProxy.
Экспортируем CA-сертификат, используемый BurpSuite. При экспорте выбираем DER format.
Находим наш сертификат в проводнике и жмем на него два раза. Переходим на вкладку состав.
Копируем в файл в кодировке Base-64. Я его сохранил под именем outfile.cer
.
Снова открываем WSl и используем openssl для высчитывания хеша сертификата. Он будет использоваться в дальнейшем как имя файла, иначе Android будет его игнорировать.
openssl x509 -inform PEM -subject_hash_old -in outfile.cer
Следующим шагом необходимо его поместить на устройство, сделать это можно следующей командой:
adb push .\outfile.cer /storage/emulated/0/9a5ba575.0 # где 9a5ba575 это хеш сертификата
Устанавливаем Magisk-модуль, который добавит наш пользовательский сертификат в каталог к системным. Будем использовать модуль MagiskTrustUserCerts.
Invoke-WebRequest "https://github.com/NVISOsecurity/MagiskTrustUserCerts/releases/download/v0.4.1/AlwaysTrustUserCerts.zip" -OutFile "trustcerts.zip"
adb push .\trustcerts.zip /storage/emulated/0/
И устанавливаем его через Magisk, как было ранее с LSposed и RiRu.
Теперь самое интересное — нужно добавить свой сертификат на устройство, но в настройках WSA (можно открыть командойadb shell am start com.android.settings
) отсутствует пункт с добавлением пользовательского CA-сертификата. Следующие команды выполняются через adb shell.
su # переходим в рута
cd /data/misc/user/0
mkdir cacerts-added
cp /storage/emulated/0/9a5ba575.0 cacerts-added/
chown -R system:system cacerts-added/
reboot
После перезагрузки модуль MagiskTrustUserCerts переместит наш пользовательский сертификат в системное хранилище.
Направим трафик приложения в BurpSuite. Я буду использовать проброс портов через ADB, так как это проще всего. Почему-то многие забывают, что adb умеет многое, помимо запуска шелла и установки apk :) Другой вариант — посмотреть наш ip на интерфейсе vEthernet (WSL)
и указать его как адрес HTTP proxy.
adb reverse tcp:7777 tcp:8080
adb shell settings put global http_proxy 127.0.0.1:7777
Теперь мы можем изучать трафик большинства приложений прямо из интерфейса Windows.
Frida
Данный инструмент уже давно используется людьми, которые интересуются мобильной безопасностью и существует множество полезных тулзовин, которые используют Frida.
Скачаем frida server и перенесем на устройство.
Invoke-WebRequest "https://github.com/frida/frida/releases/download/15.2.2/frida-server-15.2.2-android-x86_64.xz" -OutFile "fridaserver.xz"
7z e fridaserver.xz
adb push .\fridaserver /data/local/tmp
# переходим в шелл девайса
adb shell
su
chmod +x /data/local/tmp/fridaserver
/data/local/tmp/fridaserver # запускаем frida server
Подключиться можно следующим образом, используя форвардинг через adb.
adb forward tcp:27042 tcp:27042
Таким образом, наше виртуальное устройство будет определяться как USB-девайс, что весьма удобно.
Интересная особенность
Как я сказал ранее, Windows Subsystem for Android интегрируется в систему.
Приложения вместе с иконками интегрируются в хостовую систему. Таким образом, все приложения, которые установлены в подсистемы, будут видны на хосте.
Уведомления WSA показываются в общем фиде Windows.
Если кто-то вызывет интент для написания письма, то приложения на хосте это подхватят, и наоборот.
Deeplink, который вы обьявили в интент-фильтре мобильного приложения, известен хосту, и вы можете из хоста провалиться в приложение на подсистеме.
Первые две особенности не так интересны, как другие.
Давайте сделаем приложение со следующим intent-фильтром и установим его на WSA.
<activity
android:name=".DeeplinkActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="dsec" />
<data android:host="open" />
</intent-filter>
</activity>
Теперь запустим довольно старую программу URLProtocolView, которая показывает зарегистрированные URL-схемы в виндовс. Если отсортировать по URL name, то мы увидим зарегистрированную схему dsec
.
Сделаем простую страничку со следующим контентом:
<a href="dsec://open">Click</a>
Если перейти по ней и кликнуть из браузера на хосте, то произойдет следующее:
Что в этот момент происходит на устройстве? У нас есть XPosed-модуль, который вешает хуки на некоторые функции и показывает их в удобном виде. Вы же можете использовать Xintent (https://github.com/2Y2s1mple/xintent)
Получается, в WSA есть приложение агент, который выступает как прокси и запускает диплинки, приходящие из хостовой системы :) Это же приложение объявляет, что оно слушает mailto-, sip- и tel-схемы.
Подводим итоги
WSA абсолютно точно подходит, чтобы сидеть в обычных пользовательских приложениях и даже играть в некоторые мобильные игрушки. Но что с точки зрения пентестера и анализа мобильных приложений? WSA, на мой взгляд, гораздо проще и легче, чем аналоги. Например, Android Studio AVD или Genymotion. И по большей части ничем им не уступает.
Однако есть один существенный недостаток — WSA не умеет в биометрическую аутентификацию, что при полноценном аудите приложения заставит искать реальный телефон или всё-таки работать через тот же Android Studio AVD. Также не получилось использовать камеру, она не прокидывается с хоста, и это может вызвать проблемы при тестировании приложений с распознаванием данных и QR-кодов.
ruvlad
Вот ещё натыкался на такие сборки: https://github.com/Paxxs/BuildWSA/
kerbyj Автор
Да, есть такой вариант через форк репозитория и github actions, но было принято решение разобрать "железный" путь с локальной сборкой
ruvlad
Благо есть альтернативные, большинство нужных модулей там реально найти. И вот ещё удобный менеджер: https://github.com/Fox2Code/FoxMagiskModuleManager