Introduction

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

Данная заметка предназначена для систематизации в едином источнике методов обхода ограничений по перенаправлению трафика. Вопросы обхода детектирования Root, SSL pinning-a и прочих механизмов безопасности не будут рассмотрены в рамках данной заметки.

Для настройки нам понадобятся: BurpSuite, ADB, apktool, jarsigner, Android-девайс (или эмулятор).

Basic

Для первичной настройки перенаправления трафика нам необходимо добавить SSL-сертификат нашего прокси-сервера в доверенные сертификаты устройства, а также выполнить настройку подключения к текущей Wi-Fi сети. Рассмотрим пошагово данный процесс.

Экспорт сертификата

После установки BurpSuite запускаем и создаем новый проект. После открытия основного окна BurpSuite переходим на вкладки Proxy (1) -> Proxy Settings (2) -> Import/export CA certificate (3). В открывшемся окне выбираем “Certificate in DER Format” (4) и сохраняем сертификат в файл (5), например, “burp.der”. Переименуем экспортированный файл в “burp.cer”. Перемещаем полученный файл на мобильное устройство, на котором в дальнейшем будем тестировать целевое приложение.

Процесс экспорта сертификата BurpSuite
Процесс экспорта сертификата BurpSuite

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

В настройках нашего устройства на Android выбираем Settings -> Security & Location -> Advanced -> Encryption & credentials -> Trusted credentials / User credentials (в зависимости от конкретного Android-дистрибутива данный путь может отличаться). Выбираем наш файл “burp.cer” и подтверждаем его установку. Для подтверждения успешности установки ищем наш сертификат в списке всех установленных сертификатов устройства.

Искомый сертификат BurpSuite
Искомый сертификат BurpSuite

Конфигурация прокси-сервера

Открываем BurpSuite, переходим на вкладки Proxy (1) -> Proxy Settings (2) -> Proxy Listeners (3) -> Add (4). Указываем любой свободный порт для прослушивания (например, 8081) и указываем в поле выбора интерфейса “All interfaces”. В качестве альтернативы мы имеем возможность выбрать конкретный интерфейс для прослушивания (например, подключенный к Wi-Fi сети).

Настройка смартфона

На Android устройстве идем в настройки: Settings -> Network & Internet -> Wi-Fi. Выбираем текущую Wi-Fi сеть, переходим в расширенные настройки сети. Указываем IP-адрес устройства с BurpSuite, выбранный ранее порт и сохраняем.

Настройки прокси-сервера Wi-Fi
Настройки прокси-сервера Wi-Fi

Первые результаты

На данном этапе мы можем увидеть в BurpSuite первые запросы от Android устройства. Однако, если мы попытаемся запустить целевое мобильное приложение, его трафик не будет отображаться в BurpSuite. Причиной этому является то, что в Android 7 Nougat (API version 24) произошли глобальные изменения, в результате которых мобильные приложения начали доверять лишь предустановленным системным сертификатам, к которым не относится установленный нами. Для обхода данного механизма защиты нам необходимо совершить еще несколько действий.

Метод 1

Для реализации данного способа нам необходимо пропатчить APK файл целевого приложения. Для этого выполним следующие действия:

Получение APK-файла приложения с помощью ADB

Для получения файла APK с устройства воспользуемся следующими командами:

adb shell pm list package # найдем имя пакета (например - com.example.app)
adb shell pm path com.example.app # найдем путь до APK-файла приложения
# результат выполнения данной команды будет выглядеть примерно так:
# package:/data/app/com.example.someapp/base.apk
adb pull /data/app/com.example.someapp/base.apk ./ #выгрузим APK-файл на наше локальное устройство

Препарирование APK-файла

Так как по своей сути APK файл является архивом, содержащим компилированный код приложения и его ресурсы, для его модификации нам необходимо извлечь его содержимое. Сделать это мы можем с помощью утилиты apktool командой apktool d app.apk -s. Флаг "-s" предотвращает дизассемблирование dex-файлов (ведь в этом нет потребности). В результате будет создана директория, имеющая название нашего исходного APK-файла, а также содержащая все файлы целевого приложения.

  1. В файле AndroidManifest.xml, в секцию <application> добавляем значение android:networkSecurityConfig="@xml/network_security_config".В результате у нас должно получиться что-то похожее на:
    <application android:networkSecurityConfig="@xml/network_security_config">

  2. В директории res/xml создадим новый файл с названием network_security_config.xml. В контент этого файла запишем:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config>
            <trust-anchors>
                <!-- Trust preinstalled CAs -->
                <certificates src="system" />
                <!-- Trust user added CAs -->
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>

Подписание и упаковка APK-файла

Теперь нам необходимо собрать и подписать наше модифицированное приложение. Для сборки приложения воспользуемся командой:

apktool b app-release -o modified.apk

Создадим новое хранилище ключей и ключ, а затем подпишем модифицированное приложение нашим ключом:

keytool -genkey -v -keystore test.keystore -storepass password -alias android -keypass password -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -keystore test.keystore -storepass password -keypass password modified.apk android

После завершения процесса подписи для установки новой версии приложения на наше устройство воспользуемся командой adb install modified.apk.

Метод 2

В процессе написания данной заметки в официальной документации эмулятора Genymotion был обнаружен альтернативный способ обхода данного механизма защиты, не требующий модификации APK файла. В данном методе происходит добавление сертификата в хранилище предустановленных сертификатов устройства, к которым осуществляется безусловное доверие любого приложения. Для осуществления данного метода подготовим наш burp.cer сертификат, экспортированный из BurpSuite.

openssl x509 -inform DER -in burp.cer -out Burp_cert.pem
mv Burp_cert.pem $(openssl x509 -inform PEM -subject_hash_old -in Burp_cert.pem |head -1).0

В результате получим файл с названием вида хеш-значение.0 (например, 9a5ba575.0). Поместим подготовленный сертификат в хранилище предустановленных сертификатов девайса.

adb remount
adb push 9a5ba575.0 /system/etc/security/cacerts/
adb shell chmod 664 /system/etc/security/cacerts/9a5ba575.0

Перезагружаем девайс и проверяем, что в списке сертификатов появился новый с именем "Portswigger". Затем настраиваем прокси в BurpSuite в соответствии с пунктом “Конфигурация прокси” и включаем перенаправление трафика:

adb shell settings put global http_proxy localhost:3333
adb reverse tcp:3333 tcp:8081

Для отключения перенаправления воспользуемся командой:

adb shell settings put global http_proxy :0

P.S. Результаты

В результате данных манипуляций весь трафик целевого мобильного приложения будет перенаправляться на прокси-сервер BurpSuite, где может быть подвержен дальнейшему анализу в исследовательских целях.

А еще больше полезного материала можно найти в моем телеграм-канале: https://t.me/pain_test

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


  1. selkwind
    00.00.0000 00:00

    Фраза "только броузером" наводит на мысль, что неброузерные коннекты пройдут мимо нашего сниффера. Я прав?


    1. W0lFreaK Автор
      00.00.0000 00:00

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


      1. chernish2
        00.00.0000 00:00

        Вот это самое важное, научиться сниффить приложения под Андроид 11 и выше, включая websocket. Кто бы научил?


        1. W0lFreaK Автор
          00.00.0000 00:00
          +2

          Честно скажу, пока не вник в тему на достаточном уровне
          Но оставайтесь на связи, разберусь и обязательно выпущу дополнение :)


    1. alexander222
      00.00.0000 00:00

      Не могу сказать с полной уверенностью, но скорее нет. Сокет перехватывать не пробовал, но grpc по схожей схеме (патченый apk и прокси через fiddler) сниффил вполне успешно


    1. vilgeforce
      00.00.0000 00:00

      Вместо плясок с прокси можно на точке доступа заворачивать весь трафик от устройства на прозрачную проксю из Burp. Количество пойманных запросов возрастает многократно


      1. alexander222
        00.00.0000 00:00

        А как тогда его расшифровывать? Насколько я понял идею трафик будет логироваться, но не проксироваться, и mitm атака с подменой сертификата не получится


        1. vilgeforce
          00.00.0000 00:00
          +1

          Так это, Burp transparent proxy все сделает. Только сертификат надо подсунуть


  1. at5Fd8NVdfpf
    00.00.0000 00:00
    +2

    Оба способа так себе. Самые интересные приложения игнорируют системные сертификаты, и детектят "странные" устройства (например сам факт запущености на x86 или отсутвия правильного gps или датчиков типа акселерометра) и вообще не работают на эмуляторах (или делают вид что как бы работают, но сливают на сервер всё до чего могут дотянуться, в итоге любая попытка транзакции с такого приложения - полюбому считается фродовой). Так что рассказали бы лучше как это делают немного более продвинутые пользователи: magisk+lsposed+модули для ssl unpin (коих целая куча).


    1. W0lFreaK Автор
      00.00.0000 00:00

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


  1. alexander222
    00.00.0000 00:00

    По второму способу не очень понятно, он работает везде, или только на эмуляторе Genymotion?


    1. W0lFreaK Автор
      00.00.0000 00:00
      +1

      Тестировал на физическом девайсе, на нем этот метод тоже сработал (Nexus 5 + LineageOS (Android 11)).


      1. alexander222
        00.00.0000 00:00

        Спасибо! Тогда действительно полезно, патчить апк зачастую лень.


  1. vsviridov
    00.00.0000 00:00
    +1

    Я поднимал mitmproxy и заворачивал на него траффик через wireguard. На телефоне нужно было подключиться к VPN и весь трафик идет туда. Но методы добавления сертификата помогут.