Анализ трафика приложений на Android Emulator. Причем здесь Root?

Привет! Я думаю, что наберется немало людей, перед которыми стоят интересные задачи по работе с приложениями. Например -- анализ трафика для, разумеется, тестирования этих самых приложений! Вам выпало нелегкое бремя -- необходимо отдебажить продовую сборку чего-либо, и вы начинаете свои поиски решений проблем. А проблем у вас на этом пути будет много. О том, как их можно решить, я и пишу.

Классический путь начинается с установки какого-нибудь Charles, настройки в нем proxy-сервера и попытки слушать трафик, однако мы быстро натыкаемся на проблему -- все адекватные современные приложения используют HTTPS, а поэтому -- на ваше устройство придется установить сертификат, который и позволит слушать трафик. Тут то и начинается самое интересное...

Давайте создадим чек-лист, на который будем ориентироваться в процессе:

⚑ Предварительные подготовления, позволяющие начать установку эмулятора

⚑ Вы находитесь здесь

⚐ Установка эмулятора

⚐ Установка сертификата для MITM

⚐ Проверка работоспособности прослушки трафика

⚐ Разочарование

⚐ Получение root-доступа

⚐ Перенос сертификата в системное хранилище

⚐ Разочарование(?)

⚐ SSL Unpinning

⚐ Profit!!!

Установка Android Emulator

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

Итак:

1.Выбираем любой подходящий вариант, с важной оговоркой - это должна быть сборка без Google Play, но с Google Play Services (далее будет видно). Соответственно -- выбираем устройство без треугольника

2.Выбираем любой интересующий образ в котором есть Google Play APIs

3.Устанавливаем параметр Cold Boot

Готово!

⚑ Установка эмулятора

Установка сертификата для proxy-sniffer

Для прослушки трафика я буду пользоваться Fiddler Everywhere. И покажу порядок настройки данной софтины, согласно которому мы закроем еще один пункт нашей дорожной карты.

Тут я сделаю небольшое лирическое отступление -- данная программа платная, да и еще по подписке, и стоить будет, в лучшем случае -- 10$ в месяц. Но, у вас будет триал в 30 дней, после которого нужно больше золота, поэтому можно использовать любой другой инструмент. Сам я пытался заюзать Postman -- в нем тоже есть proxy-tooling, однако, корневые сертификаты, которые генерирует Postman, не пригодны для установки в Android 10 / 11. Однако, служба поддержки уже бдит, и, надеюсь, за отведенные 30 дней триала все заработает как надо (в Postman) и вы сможете пользоваться наиболее удобным (с моей точки зрения) инструментом для решения данной задачи. Когда это случится -- я дополню данную статью. А теперь возвращаемся к процессу установки сертификата на устройство (эмулятор).

Нам необходимо раскрыть пункт Advanced Settings в настройках Fiddler, и экспортировать корневой сертификат. В данный момент я пользователь Windows и на данной ОС он окажется на рабочем столе, подсказка об этом показывается по наведению на значок вопроса.

После экспорта сертификата, плавным движением кистей рук, переносим его на запущенный эмулятор -- файл окажется в папке .../Downloads. После чего можно сразу идти в настройки и устанавливать наш серт:

Отлично! Можем поставить галочку у еще одного пункта:

⚑ Установка сертификата для MITM

Проверяем, все ли ок

Самое время проверить, принесли ли наши усилия хоть какие-то полезные плоды. Подопытным кроликом сегодняшнего эксперимента будет приложение Reddit и первое, что мы увидим, если попытаемся загрузить посты:

Пустота.

А также бесконечное количество попыток SSL-handshake в Fiddler. Кажется, пора поставить прочерк сразу напротив двух пунктов нашей дорожной карты:

⚑ Проверка работоспособности прослушки трафика

⚑ Разочарование

Я есть root

Мне кажется, что наступил момент рассказать, для чего нам вообще рут? Все дело в том пресловутом изменении Android 7, после которого пользовательские сертификаты перестали быть доверенными. Посему -- нам необходимо сделать что-то с нашим установленным сертификатом, чтобы мы смогли использовать его для изучения трафика нашего рабочего приложения. И сделать это можно, только если ваш девайс рутован. Тут же заключается и причина использования эмулятора, да и связанные с этим особенности: без эмулятора вам придется иметь постоянно рутованное устройство, если это отдельный выделенный смартфон -- то проблем с этим особенно и нет (ну, кроме зарядки, постепенного устаревания и ограничений конкретной модели), однако, если у вас свой личный аппарат -- то минусы от root могут быть существенными -- не работающая система безопасности, сломанный Google Pay или отвалившиеся камеры... Ну и помимо всего прочего -- эмулятор позволяет легко изменить версию Android (правда, придется повторить все действия, перечисленные тут, но у вас уже будет эта статья, а я вот это все пишу её не имея).

А теперь приступим. Благодаря прекраснейшему проекту весь процесс сводится к запуску всего лишь одного скрипта, с небольшими подготовительными работами. Также, обращайте внимание на то, что выводится в консоль и если вы пользуетесь Windows - то запускайте не .sh, а .bat. Возможно, WSL будет тут как раз кстати, но моя система, скажем так, с некоторыми особенностями, которые WSL использовать не позволяют (если вы знаете, как завести на Ryzen 5000-серии и WSL и Android Emulator - то прошу написать об этом комментарий).

А вот и сами работы:

./rootAVD.sh ~/Library/Android/sdk/system-images/android-30/google_apis/x86_64/ramdisk.img

Плюс, нужно перезагрузить эмулятор. Ну и, у пользователей Windows путь до образа будет примерно таким:

C:\Users\Me\AppData\Local\Android\Sdk\system-images\android-30\google_apis\x86_64\ramdisk.img

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

Ставим галку:

⚑ Получение root-доступа

Делаем сертификат доверенным

Для этого нам понадобится перенести его в хранилище доверенных сертификатов. Тут рут нам и нужен (не только тут, но это позже).

Для этого мы запускаем цепочку следующих команд:

adb shell
su
mkdir -m 700 /data/certs
cp /system/etc/security/cacerts/* /data/certs/
mount -t tmpfs tmpfs /system/etc/security/cacerts
cp /data/misc/user/0/cacerts-added/* /system/etc/security/cacerts/
mv /data/certs/* /system/etc/security/cacerts/
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

После чего наблюдаем следующую картинку в системных сертификатах:

Наш сертификат стал системным, поэтому закроем еще один пункт:

⚑ Перенос сертификата в системное хранилище

И давайте сразу проверим наше приложение:

Отлично! Теперь мы можем слушать HTTPS-трафик любых (ли?) приложений с эмулятора. Давайте, чтобы закрепить результат, попробуем еще одно приложение -- Avito (как говорили Ник и Майк -- это крепкий орешек).

Кажется, тут что-то пошло не так. Впрочем вы и так все знаете, так как видели гигантский спойлер в самом начале, поэтому ставим еще одну галку:

⚑ Разочарование!

SSL-Unpinning

На данную тему есть множество решений, но, как правило, все они крутятся вокруг одной идеи -- пересборки приложения, которое вы хотите изучить. Данный подход весьма громоздкий, сложный и может сподвигнуть к прокрастинации, поэтому нужно что-то такое, что позволит сделать все намного проще и универсальнее. И рецепт этого чего-то прямо тут, бесплатно и без СМС:

  1. Благодаря наличию root установим Xposed
  2. Благодаря Xposed установим модуль для отвязки SSL-привязки
  3. Profit!!! (два пункта тут смотрелись бы уныло)

А теперь давайте по порядку.

Установка Xposed

С учетом нашего изначального плана слушать всё и вся на эмуляторе на этом шаге появляются некоторые сложности -- нужно подобрать удачную комбинацию программных решений, которые будут работать и на эмуляторе. Благодаря этой статье вам совершенно точно не придется тратить несколько часов на поиски этих решений и будет достаточно следовать простой инструкции:

  1. Скачиваем последнюю версию Magisk-модуля с интересным названием Riru и устанавливаем его посредством Magisk
  2. Закрываем эмулятор, а затем снова запускаем (данный шаг эмулирует перезагрузку, которая у меня, по каким-то причинам, не работает, если работает у вас - может быть достаточно и её)
  3. Находим в репозитории Magisk модуль с названием Riru - LSPosed и устанавливаем его
  4. Снова ребутим эмулятор
  5. Открываем приложение LSPosed, в котором необходимо установить уже Xposed-модуль SSLUnpinning
  6. Переключаем все галки в настройках данного модуля у всех приложений, которые хотим слушать и активируем сам модуль
  7. Ребутим эмулятор

После этого вы оказались в ситуации, когда у вас есть эмулятор с:

  • Полноценным рутом (Magisk)
  • Установленным MITM-сертификатом в User-space
  • Установленным Xposed (LSPosed)
  • Установленным модулем для SSL-Unpinning

В процессе имея следующий набор картинок:

Можно честно поставить галку:

⚑ SSL Unpinning

Настал час проверить, работает ли этот паровоз:

Работает! Ник и Майк ошиблись! Можем ставить и последнюю галку:

⚑ Profit!!!

Какие есть нюансы? Во первых -- при каждом включении эмулятора будет необходимо снова делать сертификаты доверенными (в принципе, после всех этих процедур можно отключить Cold Boot, и тогда не придется, но рано или вам придется перезагрузить эмулятор "жестко", и тогда потребуется поработать и с сертификатами). Возможно, тут есть постоянное решение или это можно, на худой конец, автоматизировать, но я устал. Во вторых -- не все приложения в принципе хотят запускаться на эмуляторе. Самый надежный вариант -- иметь набор выделенных телефонов на разных версиях Android, все из которых будут иметь весь арсенал инструментов из данного мануала (с небольшими изменениями), но он не всегда возможен.

Под конец -- я еще раз продублирую всю инструкцию по пунктам, чтобы был понятен сам алгоритм:

  1. Делаем приготовления (ставим Android Studio), чтобы иметь возможность установить / запустить эмулятор
  2. Устанавливаем эмулятор с параметрами, определенными выше
  3. Устанавливаем интересующие нас приложения на эмулятор методом перетаскивания курсором и убеждаемся, что они в принципе работают и все это будет не зря
  4. Получаем root (Magisk) посредством инструкции, указанной выше
  5. Перезагружаем эмулятор
  6. Устанавливаем Riru
  7. Перезагружаем эмулятор
  8. Устанавливаем LSPosed
  9. Перезагружаем эмулятор
  10. Устанавливаем Xposed-модуль SSLUnpinning
  11. Ставим все галки в модуле у интересующих нас приложений и у самого модуля (включаем его)
  12. Закрываем эмулятор
  13. Выключаем Cold Boot
  14. Включаем эмулятор
  15. Устанавливаем MITM CA-сертификат в User-space (считай - просто устанавливаем)
  16. Делаем сертификат доверенным по инструкции выше
  17. Настраиваем Proxy на эмуляторе согласно параметрам, указанным выше, или вашим собственным (в зависимости от того, каким инструментом для анализа трафика вы собираетесь пользоваться)
  18. Анализируем работу приложения

Если будете устанавливать дополнительные приложения на эмулятор -- то необходимо проставить галки напротив них в SSLUnpinning (через LSPosed) и жестко перезагрузить эмулятор, с последующим фиксом сертификатов после перезагрузки. На этом, собственно, все, до новых встреч!