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”. Перемещаем полученный файл на мобильное устройство, на котором в дальнейшем будем тестировать целевое приложение.
Установка сертификата
В настройках нашего устройства на Android выбираем Settings -> Security & Location -> Advanced -> Encryption & credentials -> Trusted credentials / User credentials (в зависимости от конкретного Android-дистрибутива данный путь может отличаться). Выбираем наш файл “burp.cer” и подтверждаем его установку. Для подтверждения успешности установки ищем наш сертификат в списке всех установленных сертификатов устройства.
Конфигурация прокси-сервера
Открываем 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, выбранный ранее порт и сохраняем.
Первые результаты
На данном этапе мы можем увидеть в 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-файла, а также содержащая все файлы целевого приложения.
В файле AndroidManifest.xml, в секцию
<application>
добавляем значениеandroid:networkSecurityConfig="@xml/network_security_config".
В результате у нас должно получиться что-то похожее на:<application android:networkSecurityConfig="@xml/network_security_config">
В директории 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