SSL Unpinning for Android applications
Last updated
Last updated
https://habr.com/ru/articles/676618/
Добрый день, меня зовут Дегтярёв Константин, я senior security engineer в Huawei RRI. В этой статье я хотел бы поделиться методами встраивания в трафик мобильных приложений Android.
Во время оценки безопасности мобильных приложений довольно часто возникает необходимость выполнения перехвата веб-запросов. Большинство современных мобильных приложений используют такие компоненты как WebView (webkit), HttpURLConnection, OkHttp, Cronet и другие для связи с бэкенд-сервером. Например, WebView полезен, когда вам нужен расширенный контроль над пользовательским интерфейсом и расширенные параметры настройки, которые позволят вам встраивать веб-страницы в специально разработанную среду для вашего приложения. Эти компоненты используют протоколы HTTP или HTTPS. Если с HTTP все понятно, HTTPS шифруется, поэтому для расшифровки HTTPS-трафика необходима MITM-атака. Для успеха MITM-атаки приложение должно доверять сертификату прокси-сервера MITM. Если сравнивать с аудитом безопасности веб-сайтов, где сертификат MITM прокси-сервера установлен в веб-браузер и все работает гладко, то с мобильным приложением ситуация может быть совершенно иной, потому что большинство современных мобильных приложений не доверяют сертификатам пользователей и даже сертификатам системного уровня Android или IOS.
Существует два основных подхода при аудите или разработке мобильных приложений. Первый, использовать реальное устройство, второй, использовать эмулятор. В этом случае будет использоваться Android эмулятор от Android Studio.
Установите Android Studio. Дистрибутив можно загрузить с официального сайта здесь.
В Android Studio создайте пустой проект.
Нажмите Сервис → Диспетчер устройств и создайте новое виртуальное устройство Android.
Предлагается следующая конфигурация. Phone → Pixel 3a → Release name - Q, API level 29, x86 ABI. Важное примечание. Эта конфигурация поставляется с Play Store, это означает, что виртуальное устройство Android не будет иметь прав root по умолчанию, но это дает преимущество полноценной версии Android с Play Store. В качестве альтернативы можно выбрать модель устройства, такую как Pixel 3a XL, он не будет поставляться с Play Store, но будет иметь root доступ изначально.
Запустите созданное виртуальное устройство Android.
В этот момент AVD (Android virtual device) готово и тестируемое приложение может быть установлено. Существует два основных метода перехвата HTTPS-трафика приложения:
Установить пользовательский CA сертификат (MITM-сервера) на AVD. Если исследуемое приложение доверяет пользовательским сертификатам или сертификатам системного уровня, это сработает.
Пропатчить запущенное приложение прямо в памяти – выполнить SSL Unpinning.
Опыт показывает, что переупаковка исследуемого приложения, с изменением определений доверенности сертификатов приложения и установкой корневого сертификата сервера MITM (метод 1) не гарантирует успешного перехвата трафика MITM сервером. С другой стороны, SSL Unpinning (метод 2) показал свою высокую надежность и эффективность.
Далее в разделах 6-9 будет описано, как реализовать модификацию определений доверенности сертификатов приложения и как произвести установку корневого сертификата сервера MITM (метод 1).
SSL Unpinning (метод 2) описан в разделе 11 ниже.
Перепаковка Android APK.
6.1 Скачать и установить Portable APK Easy Tool
6.2 В этом примере будет использовано почтовое клиентское приложение Mail.ru (Mail.ru - крупнейший российский почтовый провайдер). Андроид приложение, APK файл, можно скачать с apkmirror.com.
Запустите APK Easy Tool, выберите APK файл приложения ru.mail.mailapp.apk и нажмите кнопку Декомпилировать (Decomple).
6.3 Откройте папку с декомпилированным APK, внутри нее перейдите в папки "res" → "xml".
6.4 Внутри папки xml отредактируйте или создайте файл network_security_config.xml
В конфигурации необходимо явно указать, что доверительные сертификаты пользователей допустимы. Полное содержание файла должно быть следующим:
Определите конфигурацию сетевой безопасности в файле AndroidManifest.xml в базовой папке декомпилированного приложения. В теге добавьте атрибут android:networkSecurityConfig, указывающий на новый XML-файл:
Файл AndroidManifest.xml
6.5 В APK Easy Tool нажмите кнопку Компилировать (Compile), чтобы восстановить и подписать исправленное приложение и создать новый файл ru.mail.mailapp.apk APK.
Откройте в верхнем меню Вид → Окна Инструментов→ Проводник файлов устройства (View → Tool Windows → Device File Explorer). Выберите подходящую папку на виртуальном устройстве, такую как Downloads, и загрузите в нее перепаеованный APK файл ru.mail.mailapp.apk.
На виртуальном Android-устройстве откройте проводник файлов, найдите загруженный файл APK ru.mail.mailapp.apk и нажмите на него, чтобы установить приложение. Также подтвердите установку из ненадежного источника.
Далее, пользовательский клоневой сертификат CA с прокси-сервера MITM должен быть установлен на AVD.
Установите сертификат пользователя на устройство Android, чтобы иметь возможность просматривать и перехватывать HTTP/HTTPS трафик исследуемого приложения.
9.1 Экспорт сертификата RootCA из перехватывающего прокси-приложения, например Burp.
9.2 Переименуйте файл сертификата в cacert.crt
9.3 Загрузите сертификат в SDCARD эмулированного устройства.
9.4 В эмулированном устройстве перейдите к: Настройки → Безопасность Шифрование и учетные данные → Установка с SD-карты (Settings → Security → Encryption & Credentials → Install from SD Card). Выберите и установите загруженный файл сертификата casert.crt
9.5 Рекомендуется также установить корневой сертификат CA прокси-сервера MITM на уровне SYSTEM. Для этого используйте модуль Magisk Trust User Certs. Этот модуль копирует все сертификаты уровня USER на уровень SYSTEM.
Для работы этого модуля необходимы root права на AVD с установленным приложением Magisk. Существует приложение rootAVD, которое позволяет легко получить root права на AVD.
Для модификации и перехвата HTTP/HTTPS запросов установите настройки прокси для эмулированного Android-устройства.
Запустите adb.exe и введите следующую команду:
Каждый экземпляр эмулятора работает за виртуальным роутером/брандмауэром, который изолирует его от сетевых интерфейсов вашего хоста, а также от Интернета. Эмулированное устройство не может видеть ваш хост или другие экземпляры эмулятора в сети. Вместо этого он видит только то, что он подключен через Ethernet к маршрутизатору/брандмауэру.
Виртуальный маршрутизатор для каждого экземпляра управляет адресным пространством сети 10.0.2/24 — все адреса, управляемые маршрутизатором, имеют форму 10.0.2.xx, где xx — число. Адреса внутри этого пространства предварительно распределяются эмулятором/маршрутизатором следующим образом:
Установка сервера Frida
11.1 Загрузите сервер Frida для Android с GitHub.
Версия Frida должна выглядеть как frida-server-$VERSION-android-$ARCH.xz, для последней $VERSION, где $ARCH - это архитектура вашего устройства. Для эмуляторов, это x86 или x86_64, для физических устройств это, вероятно, arm64 (или, возможно, arm, для старых устройств). Извлеките бинарный файл из архива *.xz. Это не распространенный формат сжатия, поэтому вам может понадобиться 7-Zip (Windows) или The Unarchiver (Mac), если у вас их еще нет. Затем скопируйте бинарный файл на устройство, сделайте его исполняемым и запустите сервер от пользователя root.
Если ваша установка AVD без продакшен версии Android (не имеет приложения Goole Play Store), установите Frida с помощью следующих команд:
В случае использования AVD с продакшен версией Android (имеется приложение Goole Play Store) вам нужно сначала запустить скрипт RootAVD. Затем запустите сервер Frida, используя следующие команды:
Запуск сервера Frida на продакшен версиях Android
adb shell # Запуск оболочки на AVD
su # получить права root
setenforce 0 # Отключить selinux
/data/local/tmp/frida-server & # Запуск сервера Frida на устройстве AVD
11.2 Установите Frida на свой компьютер
Установите инструменты интерфейса командной строки Frida на свой компьютер. Требуется установить Python.
Проверьте установку, запустив frida-ps -U.
11.3 Отключение SSL Pinning с помощью Frida
Получить имя пакета нужного приложения. В этом случае имя пакета - ru.mail.mailapp
Скачать скрипт unpinning frida-ssl-unpinning-script.js
Запустите необходимое приложение, в данном случае Mail.RU – Email APP.
Запуститe frida-script
Это перезапустит приложение на вашем AVD и напечатает ряд библиотек, где была предпринята попытка выполнить SSL Unpinning, с символом [+] для библиотек, которые были успешно исправлены (пропатчены), и [ ] для библиотек, которые не были (как правило, потому что приложение не использует эти библиотеки).
При последующем вызове пропатченных методов вы также увидите сообщение --> Bypassing [pinning method], чтобы узнать, какие API использует это приложение.
Запуск почтового клиентского приложения mail.ru и вход в учетную запись пользователя.
Убедитесь, что перехватывающий прокси (в данном случае Burp) получает HTTP/HTTPS трафик из исследуемого приложения.
Еще один пример из ZAP proxy.
На этом этапе HTTPS-трафик приложения может быть перехвачен и изменён.
Мы рассмотрели методы встраивания в HTTPS трафик Android приложений. Метод SSL Unpinning является наиболее надежным, хотя и более сложным в реализации. При помощи SSL Unpinning можно встроиться в трафик любых мобильных приложений будь-то Сбер Банк, HSBC или Facebook.
For contacts and feedback: konstantin.degtiarev5@gmail.com or https://konstantinsecurity.com/
Сетевой адрес | Описание |
---|---|
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
Эмулируемый интерфейс шлейфа устройства