Предисловие

Привет, меня зовут brain и я активный участник программ Bug Bounty и достаточно часто смотрю не только веб-приложения, но и мобильные приложения, чтобы определить все конечные точки API сервиса и попробовать найти баг в функционале, до которого не всегда просто добраться. А почему непросто? Потому что в мобильных приложениях часто встречается SSL Pinning, который не дает перехватывать трафик, а поэтому анализ API приложения становится более сложным. В этой статье я изложу:

  1. Как отключить SSL Pinning и получить возможность внедряться в процессы iOS приложений.

  2. Как отключить SSL Pinning и внедриться в Android приложение без наличия смартфона на одноименной ОС.

Оговорюсь, что все действия будут выполняться на MacOS на ARM процессоре M2 Pro (по идее, изложенное справедливо и для других ARM-процессоров) и при наличии устройства iOS, которое можно рутануть (поставить Jailbreak), в моем случае это старенький iPhone 6s на iOS 15.

Написать статью меня побудила общая сложность действий, а точнее их временная емкость, поскольку во время "подготовительного" к пентесту этапа возникло огромное множество проблем, ответы на которые в сети не всегда разумные и работают, а иногда и вовсе: ответы отодвигают на шаг назад или в начало всего процесса. Также проблемой стало и то, что множество других статей не являются подробными и детальными, а часть действий из них попросту не работает, считайте эту статью заметкой, гайдом по обходу SSL Pinning.

Дисклеймер

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

Краткая справка по терминам и ПО

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

  1. Jailbreak - дословно переводится как «побег из тюрьмы» или «взлом», говоря понятным для обывателя языком, процесс получения доступа в ОС устройства с возможностью управления приложениями, процессами (грубо говоря аналог root-прав на устройстве), без джейла мы не сможем внедряться в процессы, чтобы отключать пиннинг, ставить ломанные приложения, твики системы;

  2. Установка root-прав (прав суперпользователя) - процесс получения прав суперпользователя root на устройствах под управлением операционной системы Android, также необходим для возможности внедрения в процессы приложений;

  3. magisk - утилита, позволяющая получить суперпользователя и управлять root-правами;

  4. frida - набор инструментов, позволяющих внедрять собственный код в другие приложения во время их исполнения;

  5. objection - набор инструментов для исследования мобильных приложений во время выполнения, работающий на базе Frida.

Подготовка ПК

Общие действия, которые нужно сделать на ПК независимо от того, какое целевое устройство будем использовать:

  1. Установка objection: pip3 install objection

  2. Установка frida-tools: pip3 install frida,frida-tools

(я установил проверенную ранее версию frida-tools 16.3.3 командой pip3 install frida-tools==16.3.3) Для проверки успшности установки можем запустить утилиты и отследить их вывод

Проверка успешности установки инструментов с помощью их запуска
Проверка успешности установки инструментов с помощью их запуска

Отключаем SSL Pinning на iOS.

Процесс отключения SSL Pinning для смартфона Apple сводиться к нескольким шагам: установка Jailbreak и установке frida-server на устройство из репозитория Cydia и установить сертификат BurpSuite.

1. Установка Jailbreak

В нашем случае для iOS 15 установим полупривязанный Jailbreak от palera1n.

При выборе jailbreak следует руководствоваться версией процессора и iOS, подробная информация доступна в открытых источниках и в особенности можно воспользоваться форумом 4pda, на котором есть все необходимые сведения. При выборе Jailbreak всегда отдавайте приоритет отвязанному решению, поскольку тогда вы избавите себя от необходимости повторения действий после перезагрузки устройства.

  • Для версии iOS 15-16 ставим palera1n по официальной инструкции с сайта: sudo /bin/sh -c "$(curl -fsSL https://static.palera.in/scripts/install.sh)"

  • Запускаемся командойpalera1n. После запуска на экране должно появиться сообщение об ожидании подключения устройства, что будет означать успешную установку и запуск инструмента. На опыте я ставил palera1n на разные устройства по версии ОС и архитектуре и проблем не испытывал ни разу.

Успешный запуск инструмента palera1n
Успешный запуск инструмента palera1n
  • После запуска подключаем устройство к ПК и инструмент все сделает за нас и покажет необходимые действия (ввод в DFU), но может потребоваться остановка утилиты, переподключение устройства если утилита зависнет на каком-либо этапе.

ВАЖНО: если вы застряли на этапе ввода устройства в режим DFU, то смените провод с Type-C Lightning на USB-A Lightning. В интернете множество отзывов о том, что с кабелями Type-C не получается войти в режим DFU. Я решил эту проблему использованием переходника с Type-C на USB-A и провода USB-A Lightning, если нет переходника, то подключите iPhone к другому устройству по разъему USB-A и введите в DFU самостоятельно. Итак, после решения данной проблемы и нескольких переподключениях устройства, перезапусков программы наблюдаем примерно такую картину:

Успешный джейлбрейк iPhone на iOS 15
Успешный джейлбрейк iPhone на iOS 15

ВАЖНО: может потребоваться переподключение устройства и перезапуск программы, идикатором успеха будет являться завершение работы утилиты сообщением о загрузке ядра и появление приложения palera1n на главном экране.

Появление palera1n на экране устройства
Появление palera1n на экране устройства

Теперь мы имеем Jailbreak на устройстве и можем переходить к установке frida-server.

2. Установка frida

  • После того, как установили Palera1n заходим в приложение и устанавливаем Sileo - менеджер пакетов (аналоги Cydia), добавляем в список репозиториев frida:

    Добавленный репозиторий frida
    Добавленный репозиторий frida
  • Из репозитория устанавливаем один единственный пакет - frida-server, обратите внимание, что используемая мной версия frida на ПК и устройстве совпадают: это сделано из-за наличия сообщений о несовместимости некоторых версий.

    Установка frida-server
    Установка frida-server

3. Установка сертификата BurpSuite

  • Для установки сертификата на устройство сначала настроим прокси, в Burp Suite откроем порт на всех адресах, чтобы сделать прокси доступным в локальной сети:

    Открытие порта в Burp Suite для локальных сетей
    Открытие порта в Burp Suite для локальных сетей
  • Теперь, просмотрев адрес компьютера через ifconfig добавляем прокси на устройстве:

    Настройки прокси-сервера на устройстве
    Настройки прокси-сервера на устройстве
  • Теперь, настроив прокси переходим на устройстве по адресу http://burp и устанавливаем сертификат, нажав на "Ca Certificate", не забываем после установки в настройках включить доверие сертификату в пункте "VPN и управление устройством":

    Доверие сертификату Burp Suite
    Доверие сертификату Burp Suite

То есть, теперь мы имеем все компоненты, необходимые для захвата трафика: установленный frida-server на устройстве позволит далее внедряться в процессы, прокси-сервер для захвата трафика. Давайте же перейдем к обходу SSL Pinning.

Тестирование

Возьмем какое-нибудь приложение, которое участвует в Bug Bounty и имеет SSL Pinning. Для примера я выберу приложение Авито: после запуска приложения трафика в Burp Suite не наблюдается и при этом само приложение не работает, как будто нет сети.

Запущенное приложение с SSL Pinning
Запущенное приложение с SSL Pinning

Как мы видим, загрузить данные не удалось, а все потому, что сам SSL Pinning мы не отключили, а лишь подготовили все для этого. Давайте теперь введем несколько волшебных команд:

ВАЖНО: устройство должно быть подключено к компьютеру.

  • Для начала выведем список процессов командой frida-ps -Uia :

    Листинг приложений устройства и идентификаторов процессов
    Листинг приложений устройства и идентификаторов процессов
  • Из полученного списка выбираем приложение с SSL Pinning, в моем случае это приложение "Авито", запоминаем его идентификатор "ru.avito.app".

  • Теперь, введем команду objection -g <имя цели> explore для запуска фреймворка objection в контексте приложения, приложение перезапустится на телефоне, но все еще будет ошибка соединения;

  • Вводим команду ios sslpinning disable и после работы с приложением видим, что теперь мы можем захватывать весь трафик в BurpSuite с мобильного устройства и SSL Pinning отключен.

Отключение SSL Pinning и захват трафика приложения в Burp Suite
Отключение SSL Pinning и захват трафика приложения в Burp Suite
  • Само приложение же теперь полностью работоспособно:

    Успешно запущенное приложение без SSL Pinning
    Успешно запущенное приложение без SSL Pinning

Вот и все: отмечу, что frida-server на устройстве запущен всегда, пока работает Jailbreak, что позволяет очень быстро и просто производить тестирование приложения. На этом с iOS закончим и перейдем к Android.

Отключаем SSL Pinning на Android.

В случае с ОС Android процесс будет несколько сложнее, поскольку сначала нужно установить Android Studio (я использую последнюю версию Koala), затем создать виртуальное устройство, установить подходящую версию ОС (тут могу быть проблемы), поставить root (с ним мы будем свободнее в работе с системой и не будем ничем ограничены), frida-server и установить сертификат BurpSuite.

1. Создание виртуального устройства и получение root-прав

  • После установки Android Studio (доступен на официальном сайте) переходим в меню управления виртуальными девайсами;

Меню управления виртуальными девайсами
Меню управления виртуальными девайсами
  • Создаем устройство: я выбираю Pixel 3 XL и обязательно выбираем API ДО версии 35, поскольку на API 35 есть проблемы с frida-server, она попросту ловит исключение и отказывается работать, а API ниже на моем устройстве не работали стабильно.

Выбор API для устройства
Выбор API для устройства
  • Задаем имя устройства AVG Name как удобное имя, я выбрал название pixel , теперь нам нужно поставить root-права. Для упрощения этих действий следует использовать rootAVD с github, который поставит все необходимое;

  • Скачиваем архив git clone https://github.com/newbit1/rootAVD.git переходим в директорию cd rootAVD/ ;

  • Запускаем устройство, дожидаемся его загрузки и вводим в терминале команду ./rootAVD.sh ;

    Вывод команды ./rootAVD.sh с предложенным ramdisk.img
    Вывод команды ./rootAVD.sh с предложенным ramdisk.img
  • В выводе команды выше rootAVD обнаружит версию API и предложит подходящий загрузчик, в нашем случае загрузить его на устройство можно при помощи команды: ./rootAVD.sh system-images/android-34/google_apis/arm64-v8a/ramdisk.img (команду запускаем при включенном эмуляторе), эксплоит выполнит необходимые действия, устройство выключится (если не выключилось, самостоятельно завершаем работу);

    Вывод команды установки magisk и автоматическое выключение устройства
    Вывод команды установки magisk и автоматическое выключение устройства
  • Теперь когда устройство выключено запускаем его в режиме холодной загрузки, чтобы не выполнять загрузку из сохраненного состояния и все изменения были применены (нажимаем на три точки, выбираем "Cold boot"), устройство запустится с установленным Magisk;

    Меню приложения magisk
    Меню приложения magisk
  • Теперь нам нужно обновить версию приложения, чтобы при всем подтянулись необходимые модули и появилась возможность управлять root-доступом, в разделе "app" выбираем "instal", Magisk подгрузит и установит последнюю версию самостоятельно;

  • Тут могут возникнуть проблемы с подключением к сети, в моем случае Magisk скачался с 10 раза после того, как я выключил эмулятор, выключил сеть на компьютере, запустил эмулятор и после этого включил сеть. Насколько мне известно проблемы с сетью распространенные, поэтому следует попробовать поиграться с настройками, поменять DNS, отключить межсетевой экран и т.д.

  • После обновления приложения заходим в него и соглашаемся на установку дополнительных компонент;

Предложение об установке компонент
Предложение об установке компонент
  • Выбираем способ прямой установки, дожидаемся ее окончания и перезагружаем устройство;

Использование пункта прямой установки
Использование пункта прямой установки
Успешная установка обновленной версии Magisk
Успешная установка обновленной версии Magisk
  • После установки и перезагрузки иконка меню суперпользователя и иконка модулей станут активными;

Обновленный Magisk и полученный root-доступ
Обновленный Magisk и полученный root-доступ
  • На этом установка root-прав окончена, для проверки успешности проделанных действий всегда можно скачать приложения для проверки root-прав и посмотреть результат;

Обнаружение root-прав после проделанных действий
Обнаружение root-прав после проделанных действий

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

2. Установка frida-server

Установка frida-server не является сложной и требует знания лишь целевой архитектуры, в нашем случае

  • Переходим в официальный репозиторий GitHub и скачиваем из раздела релизов именно frida-server для Android с нашей архитектурой: тут важно не ошибиться, так иначе может показаться, что ошибки при запуске сервера связаны с приложением, версией API или еще чем-либо;

Выбор frida-server пакета для Android на архитектуре arm64
Выбор frida-server пакета для Android на архитектуре arm64
  • Архив распаковываем, далее небольшой танец с бубном, так как нам нужно закинуть файл в устройство: если при попытке вызова команды adb вылезает ошибка, что команда не найдена вводим в терминал alias adb='/Users/$USER/Library/Android/sdk/platform-tools/adb' для того, чтобы определить путь исполняемого файла того самого adb, затем записываем данные на устройство командой adb push <путь к файлу frida-server> /data/local/tmp/(эмулятор должен быть включен в это время);

  • Теперь переходим в adb shell и пишем команду su, на экране эмулятора наблюдаем запрашивание root-доступа для adb , разрешаем его;

Включение разрешений для привилегированного adb shell
Включение разрешений для привилегированного adb shell
  • Теперь переходим в каталог куда скопировали frida-server, изменяем права доступа и запускаем (запускать всегда лучше от su, чтобы избежать каких-либо ошибок), если после запуска терминал активен и не появилось никаких ошибок, значит, мы все сделали правильно и frida-server успешно стартовал;

3. Установка сертификата Burp Suite

После того, как мы успешно запустили frida-server нам нужно настроить прокси и добавить сертификат на устройство, чтобы в дальнейшем при отключении пининга захватывать трафик.

  • В данном случае дополнительный порт открывать не нужно, так как локальный адрес машины будет транслироваться в адрес 10.0.2.2, а поэтому прокси будет доступен и без настроек;

  • На устройстве зайдем в настройки прокси и указываем адрес 10.0.2.2 и порт, выставленный в Burp Suite. Почему именно этот адрес? А все просто, эмулятор Android выставит следующие адреса в виртуальной сети устройства:

    Сетевой адрес

    Описание

    10.0.2.1

    Адрес маршрутизатора/шлюза

    10.0.2.2

    Специальный псевдоним для интерфейса обратной связи хоста (т.е. 127.0.0.1 на вашей машине разработки)

    10.0.2.3

    Первый DNS-сервер

    10.0.2.4 / 10.0.2.5 / 10.0.2.6

    Опциональный второй, третий и четвертый DNS-сервер (если есть)

    10.0.2.15

    Эмуляция сетевого/ethernet-интерфейса устройства

    127.0.0.1

    Эмулируемый интерфейс шлейфа устройства

Настройки прокси на андроид смартфоне
Настройки прокси на андроид смартфоне
  • После выставления настроек перейдем в браузер и перейдем по адресу главной страницы нашего прокси, выбираем CA Certificate и устанавливаем сертификат на устройство через настройки (выбрав соответствующий пункт);

Страница прокси-сервера Bup Suite
Страница прокси-сервера Bup Suite
  • Теперь, после установки сертификата бразуер должен успешно открыть страницу Google поиска, а в Burp Suite должен появиться трафик;

    Захват трафика браузера после добавления сертификата на устройство
    Захват трафика браузера после добавления сертификата на устройство

То есть, теперь мы имеем все компоненты, необходимые для захвата трафика: установленный frida-server на рутованном устройстве позволит далее внедряться в процессы, прокси-сервер для захвата трафика. Давайте же перейдем к обходу SSL Pinning.

Тестирование

Возьмем какое-нибудь приложение, которое участвует в Bug Bounty и имеет SSL Pinning. Для примера я выберу магазин приложений Rustore, так как его APK легко скачать с сайта и там точно не будет вирусов. Запустим приложение с текущими настройками:

Наличие SSL Pinning в приложении
Наличие SSL Pinning в приложении

Как мы видим, загрузить данные не удалось, а все потому, что сам SSL Pinning мы не отключили, а лишь подготовили все для этого. Давайте теперь введем несколько волшебных команд:

  • Команда frida-ps -Uia (в терминале компьютера) покажет нам установленные и запущенные приложения, из них найдем имя цели: ru.vk.store

    Листинг приложений устройства и идентификаторов процессов
    Листинг приложений устройства и идентификаторов процессов
  • Теперь, введем команду objection -g <имя цели> explore для запуска фреймворка objection в контексте приложения, приложение перезапустится на телефоне, но все еще будет ошибка соединения;

  • Вводим команду android sslpinning disable и после работы с приложением видим, что теперь мы можем захватывать весь трафик в BurpSuite с мобильного устройства и SSL Pinning отключен.

    Отключение SSL Pinning и захват трафика приложения в Burp Suite
    Отключение SSL Pinning и захват трафика приложения в Burp Suite

Важно: frida-server все это время должен быть запущен, при желании можно легко настроить автозапуск shell-скрипта, чтобы не вводить никаких команд.

Заключение

В этой статье я изложил собственный опыт и путь для отключения SSL Pinning в мобильных приложениях на 2-х операционных системах, надеюсь, что вы не столкнетесь с множеством ошибок о которых я решил не рассказывать в данной статье и вам не придется наблюдать множество ответов в стиле "отключите прокси и все заработает" в различных топиках в интернете

См. также:

  1. Официальный репозиторий с инструкцией по rootAVD;

  2. Документация по frida со всеми фичами и гайдом;

Комментарии (0)