Добрый день, меня зовут Дегтярёв Константин, я 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.

1) Установите Android Studio. Дистрибутив можно загрузить с официального сайта здесь.

2) В Android Studio создайте пустой проект.

3) Нажмите Сервис → Диспетчер устройств и создайте новое виртуальное устройство 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 доступ изначально.

 5) Запустите созданное виртуальное устройство Android.

В этот момент AVD (Android virtual device) готово и тестируемое приложение может быть установлено. Существует два основных метода перехвата HTTPS-трафика приложения:

  1. Установить пользовательский CA сертификат (MITM-сервера) на AVD. Если исследуемое приложение доверяет пользовательским сертификатам или сертификатам системного уровня, это сработает.

  2. Пропатчить запущенное приложение прямо в памяти – выполнить SSL Unpinning.

Опыт показывает, что переупаковка исследуемого приложения, с изменением определений доверенности сертификатов приложения и установкой корневого сертификата сервера MITM (метод 1) не гарантирует успешного перехвата трафика MITM сервером. С другой стороны, SSL Unpinning (метод 2) показал свою высокую надежность и эффективность.

Далее в разделах 6-9 будет описано, как реализовать модификацию определений доверенности сертификатов приложения и как произвести установку корневого сертификата сервера MITM (метод 1).

SSL Unpinning (метод 2) описан в разделе 11 ниже.

6) Перепаковка 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 в базовой папке декомпилированного приложения. В теге <application> добавьте атрибут android:networkSecurityConfig, указывающий на новый XML-файл:

Файл AndroidManifest.xml

<application android:allowBackup="true" android:networkSecurityConfig="@xml/network_security_config" ...etc...>

 

6.5 В APK Easy Tool нажмите кнопку Компилировать (Compile), чтобы восстановить и подписать исправленное приложение и создать новый файл ru.mail.mailapp.apk APK.

7) Откройте в верхнем меню Вид → Окна Инструментов→ Проводник файлов устройства (View → Tool Windows → Device File Explorer). Выберите подходящую папку на виртуальном устройстве, такую как Downloads, и загрузите в нее перепаеованный APK файл ru.mail.mailapp.apk.

8) На виртуальном Android-устройстве откройте проводник файлов, найдите загруженный файл APK ru.mail.mailapp.apk и нажмите на него, чтобы установить приложение. Также подтвердите установку из ненадежного источника.

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

Далее, пользовательский клоневой сертификат CA с прокси-сервера MITM должен быть установлен на AVD.

9) Установите сертификат пользователя на устройство 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.

10) Для модификации и перехвата HTTP/HTTPS запросов установите настройки прокси для эмулированного Android-устройства.

Запустите adb.exe и введите следующую команду:

adb shell settings put global http_proxy <адрес>:<порт>

//-- установить общесистемный proxy сервер

adb shell settings put global http_proxy 10.0.2.2:8080

//-- удалить общесистемный proxy сервер

adb shell settings put global http_proxy :0 

где <address>:<port> - ip и порт прокси сервера, например Burp.

Каждый экземпляр эмулятора работает за виртуальным роутером/брандмауэром, который изолирует его от сетевых интерфейсов вашего хоста, а также от Интернета. Эмулированное устройство не может видеть ваш хост или другие экземпляры эмулятора в сети. Вместо этого он видит только то, что он подключен через Ethernet к маршрутизатору/брандмауэру.

Виртуальный маршрутизатор для каждого экземпляра управляет адресным пространством сети 10.0.2/24 — все адреса, управляемые маршрутизатором, имеют форму 10.0.2.xx, где xx — число. Адреса внутри этого пространства предварительно распределяются эмулятором/маршрутизатором следующим образом:

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

Описание

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

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

 

11) Установка сервера 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.

Pip install frida-tools

Проверьте установку, запустив frida-ps -U.

11.3 Отключение SSL Pinning с помощью Frida

Получить имя пакета нужного приложения. В этом случае имя пакета - ru.mail.mailapp

Скачать скрипт  unpinning frida-ssl-unpinning-script.js

Запустите необходимое приложение, в данном случае Mail.RU – Email APP.

Запуститe frida-script

frida --no-break -U -l./frida-script.js -f ru.mail.mailapp

Это перезапустит приложение на вашем AVD и напечатает ряд библиотек, где была предпринята попытка выполнить SSL Unpinning, с символом [+] для библиотек, которые были успешно исправлены (пропатчены), и [ ] для библиотек, которые не были (как правило, потому что приложение не использует эти библиотеки).

При последующем вызове пропатченных методов вы также увидите сообщение --> Bypassing [pinning method], чтобы узнать, какие API использует это приложение.

 

12) Запуск почтового клиентского приложения mail.ru и вход в учетную запись пользователя.

13) Убедитесь, что перехватывающий прокси (в данном случае 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/

См. также:

  1. Настройка Burp Suite с Android Nougat

  2. Root AVD и установить Magisk

  3. Пользовательские сертификаты модуля Magisk

  4. Рамки, касающиеся возражений

  5. Шпаргалка ADB

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


  1. pharrell
    13.07.2022 05:58

    А вы уверены, что Facebook ломается с помощью этого скрипта? У них там вроде своя собственная версия пининга для их приложений реализована


    1. acc0unt
      13.07.2022 09:53
      +1

      Много у кого реализована на самом деле. В таком случае приложения разбираются индивидуально.

      Это считается плохой практикой - потому что привязка часто идёт к конкретному сертификату компании, и при его устаревании или отзыве может произойти что-то интересное. Но хардкодить проверки на сертификаты разработчикам это не мешает.


  1. awoland
    13.07.2022 08:43

    Maybe still "ДекомреПИлировать (Decompile)"?


    1. a1teran Автор
      13.07.2022 09:11
      +1

      Спасибо, поправил.


  1. y4ppieflu
    13.07.2022 10:18
    +2

    Кто-то уже заюзал refresh_token со скриншота?


  1. LuigiVampa
    14.07.2022 02:07

    Вообще не всегда можно так просто встроиться в пиннинг в 100% случаев.

    Видел в одном российском приложении интересный подход с заменой сигнатур классов в OkHttp, включая CertificatePinner, через инструменты типа jarjar. Очень круто то, что это дёшево, просто через плагин добавляется один этап во время сборки, никакой код самому переписывать не нужно. По сути, изменяется только имя пакета в классах, но все простые стандартные средства снятия пиннинга это ломает и юным реверс-инженерам готовыми фрида-скриптами уже воспользоваться не получится, придётся как минимум писать свои. Плюс есть и куда более изощренные подходы с выносом сетевого слоя в нейтив, кажется так сделано в приложениях фейсбука