Настраиваем Android-девайс для анализа трафика приложений
Периодически у меня возникает необходимость анализа мобильных приложений под 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, в секцию добавляем значение android:networkSecurityConfig=»@xml/network_security_config». В результате у нас должно получиться что-то похожее на:
- В директории res/xml создадим новый файл с названием network_security_config.xml. В контент этого файла запишем:
Подписание и упаковка 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, где может быть подвержен дальнейшему анализу в исследовательских целях.
Установка собственного корневого сертификата в Android и запуск Citrix XenApp Web Interface
В принципе, мы с shoguevara довольно давно заморачивались вопросом установки корневого сертификата в Android устройство и даже находили парочку не самых тривиальных инструкций, но до этого в таком действии надобности не было. Надобность же появилась после приобретения планшета на Android.
Немножко предыстории:
Стоит у нас в конторе Citrix XenApp для обеспечения удалённой работы из офиса. Что это за зверь и с чем его едят рассказывать не будем — кому это надо, те давно в курсе.
В этой совместной с записи мы хотим рассказать об установке корневого сертификата и настройке клиентской части — Citrix Receiver для Android.
В принципе, клиент не самый убогий — пользоваться можно, а если Вы где-то в поездке, а на руках только телефон на Android или планшет — это единственный выход для быстрого подключения и исправления что-либо через рабочий компьютер.
Вроде бы софтина не особо мудрёная да и настроек особо много не требует, а если Вы используете веб-интерфейс для запуска приложений, как это сделано в нашей организации, то и совсем никаких…
Но не все бывает так безоблачно!
Что же за проблемы могли возникнуть?
Для организации такого рода архитектуры удалённого доступа довольно часто используются сертификаты, которые подписаны центрами не входящими в список стандартных. Почему Google такие нехорошие, и не включили в свою ОСь такую простую функцию, (наряду с такой, опять же, нужной функцией, как возможность прописать прокси-сервер) как установка дополнительных корневых сертификатов ЦА, тут мы обсуждать не собираемся.
Первым признаком того, что сервер использует самоподписанный сертификат является то, что, когда Вы открываете, откуда бы то ни было веб-ресурс с помощью, например, браузера Mozilla Firefox, программа выдает сообщение о том, что не может сама принять решение о том доверять ли сертификату для установления защищённого соединения или нет — она предоставляет право выбора Вам.
Если у вас наблюдается такая картина, то эта статья как раз для Вас!
Так что же все-таки надо, чтобы запустить через Citrix Receiver приложения опубликованные на Citrix XanApp вашего предприятия?
В первую очередь, как оказалось, необходимо установить Mozilla Firefox для Android. Очень странно, но ни один другой браузер не передаёт нужный для подключения файл (launch.ica) в программу-клиент. Знаем только то, что с Firefox все работает нормально.
Во вторую очередь нужна сама программа-клиент. Тут на Android Market у нас есть выбор: стабильный Citrix Receiver, либо находящийся на этапе тестирования Citrix Labs Receiver. Второй у нас не захотел принимать сертификат ни в какую, первый же — стабильный, после бессонной ночи таки у нас и заработал.
В-третьих, необходимо иметь root-доступ к вашему устройству, либо возможность извлекать и записывать обратно файлы через adb, хотя, в этом случае тоже требуется root-доступ (как его настроить Вы сможете узнать потратив немного времени на просмотр результатов, который выдал вам Google на запрос вида » root access howto» или » adb configure howto»).
Вопросом настройки adb мы заморачиваться, опять таки, не стали, так как предпочитаем работать напрямую через файл-менеджеры с системой. В любом случае, в сети довольно много информации по этому поводу (русскоязычный ресурс, на котором больше всего информации такого плана — http://4pda.ru/forum, англоязычный — http://forum.xda-developers.com). В случае, если Вы будете использовать прямой доступ к системным файлам, то нужен файловый менеджер, который умеет использовать root-права (например, Root Explorer).
В-четвертых, нужна машина с любым из популярных Linux-дистрибутивов и установленной Java-машиной от Oracle (мы использовали Ubuntu 10.10 с установленным JRE).
И последнее в списке, но далеко не последнее по значимости — сам корневой сертификат центра сертификации (пусть он будет называться CompanyCA.crt).
От требований (если они все выполнены) переходим к действию.
Для удобства будем перечислять все по пунктам.
1. Заходим с устройства на Android Market и устанавливаем Firefox.
2. Заходим с устройства на Android Market и устанавливаем Citrix Receiver.
3.1.1 (3.1.х для тех кто предпочитает прямой доступ) С помощью файлового менеджера копируем файл /system/etc/security/cacerts.bks cacerts.bks на карту SD.
3.1.2 Подключаем устройство как накопитель к компьютеру с Linux.
3.1.3 Копируем файл cacerts.bks с корня карточки в вашу домашнюю папку.
3.2.1 (adb) копируем сертификат
$ adb pull /system/etc/security/cacerts.bks cacerts.bks
4. Этот пункт предполагает, что Вы уже установили и настроили JRE 1.6 и прописана переменная окружения JAVA_HOME (в моем случае JAVA_HOME=/usr/lib/jvm/java-6-sun/).
Скачиваем пакет bouncycastle.org/download/bcprov-jdk16-146.jar и кидаем его в папку $JAVA_HOME/jre/lib/ext/
Если у вас установлен JDK, то этот пакет, надо так же закинуть в папку /usr/lib/jvm/java-6-openjdk/jre/lib/ext
wget bouncycastle.org/download/bcprov-jdk16-146.jar
sudo cp bcprov-jdk16-146.jar $JAVA_HOME/jre/lib/ext/bcprov-jdk16-146.jar
# или sudo cp bcprov-jdk16-146.jar /usr/lib/jvm/java-6-sun/jre/lib/ext/bcprov-jdk16-146.jar
5. Кидаем файл сертификата CompanyCA.crt так же в домашнюю папку. Если его у Вас нет, но Вы соглашались принять сертификат при переходе на веб-интерфейс XenApp, то его можно экспортировать из Firefox. Как это сделать — подскажет Google. Можем лишь уточнить, что шифрование нужно X.509 PEM.
6. Скачиваем и устанавливаем Android SDK (если Вы не планируете использовать adb, то этот шаг можно пропустить):
wget dl.google.com/android/android-sdk_r10-linux_x86.tgz
tar -xvzf android-sdk_r10-linux_x86.tgz
sudo mv android-sdk-linux_x86 /usr/lib/android-sdk-linux_x86
Запускать что-либо из комплекта для нашей задачи не требуется. Но нужно прописать исполняемые файлы SDK в переменных окружения export PATH=$:/usr/lib/android-sdk-linux_x86/tools.
В нашем случае вопрос с переменными окружения решается добавлением в конец файла ~/.bashrc строчек
export PATH=$:/usr/lib/android-sdk-linux_x86/tools
export JAVA_HOME=/usr/lib/jvm/java-6-sun/jre
7. Открываем консоль и выполняем команду
keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias CACERT -file CompanyCA.crt
Будьте внимательны — не меняйте параметр -storepass changeit, там действительно такой пароль)
В ответ на эту команду Вы должны получить информацию о сертификате и запрос «Trust this certificate? [no]: » — соответственно отвечаем «y».
Все, наш файл подготовлен. Теперь нужно загрузить его на устройство.
8.1.1 (прямой доступ) Подключаем устройство как накопитель к компьютеру;
8.1.2 Загружаем на карту файл cacerts.bks;
8.1.3 Переносим с помощью менеджера файлов cacerts.bks из папки /sdcard в папку /system/etc/security/, предварительно примонтировав её для записи;
8.2.1 (adb) Монтируем систему для записи:
$ adb shell mount -o remount,rw /system;
8.2.2 Загружаем файл:
$ adb push cacerts.bks /system/etc/security/;
8.2.2 Монтируем систему только для чтения:
$ adb shell mount -o remount,ro /system.
На этом трудная часть пройдена. Осталась пара «финтов ушами».
9. Перезагружаем устройство.
10. Запускаем Firefox и открываем страницу веб-доступа.
Появится приблизительно такая картина:
Тут нам надо нажать на ссылку «Already installed» в верхней части экрана;
11. Выбираем приложение из списка и пробуем запустить;
При подготовке материала использовались источники:
https://habr.com/ru/articles/719272/
https://habr.com/ru/articles/117727/