Pull to refresh

Настраиваем Android-девайс для анализа трафика приложений

Level of difficultyEasy
Reading time5 min
Views15K

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

Tags:
Hubs:
Total votes 6: ↑5 and ↓1+6
Comments14

Articles