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

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

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

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

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

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

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

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

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

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

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

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

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

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

⚐ SSL Unpinning

⚐ Profit!!!

Установка Android Emulator

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

Итак:

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

5f83d6ee08667e6969a2bfd67e605039_1-1801-bd2d7a.png

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

659bdc4ad06b90df638f6778c3a22dee_1-1801-e2bc05.png

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

92a536965ebd49e3878c5b83dd1704ae_1-1801-c1cbc7.png

Готово!

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

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

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

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

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

c8068accf66f2c189dc75fdb46ff3d1b_1-1801-767ac4.png

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

f5c5619bbaba1cc6c88a9249e2f6f2f6_1-1801-20adfd.png

dd93f6644c738385b50c979fb9aeebbf_1-1801-0f556d.png

d138279674a2e2ae1b93ccf35c9e9b69_1-1801-936eed.png

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

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

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

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

6e478aa724062c3ce54e37b1f945a3df_1-1801-6f5143.png

Пустота.

4a24356a2740e3a8300a6b53ea261033_1-1801-f03ff0.png

А также бесконечное количество попыток 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 делать не стоит.

26b8cd53c1093e3e1ed518127faf9269_1-1801-09c63f.png

c44325a4a24b8d2a39da5fb4ac9bb4fe_1-1801-6ad368.png

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

⚑ Получение 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/*

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

f0a7c59268ed7011e02fb637d99eec0b_1-1801-d04a59.png

c20e63b909ca668e50195c81ff277f86_1-1801-2221c6.png

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

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

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

60c6abed503adbbd18ff3bb98aa05759_1-1801-851abd.png

be86bd3e99f890e10260d4b1c83fc34e_1-1801-c1e8c0.png

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

ee08361c834f1ff807ee66ad0cdda10f_1-1801-0fbe3e.png

fc76a174e8ef1f2402f7c045fbae966c_1-1801-916f66.png

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

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

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

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

e660c447453ce478c01c4c608c9b5a0c_1-1801-f9f6ff.png

e396adc28216f4b84ebdc15f1159afa0_1-1801-00318b.png

18eaf29ede00439fca3e875f57afec64_1-1801-a5bedc.png

142ec21d9dc69bee8a40d237775145db_1-1801-c9b8ba.png

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

⚑ SSL Unpinning

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

22de01417264a170798bcde9a162fbb4_1-1801-31213a.png

2d698ae08d7e8ec74b44ee742489919f_1-1801-d8c5a0.png

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

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто