перехват http трафика мобильного приложения
Анализ трафика Android-приложений: обход certificate pinning без реверс-инжиниринга
Иногда нужно исследовать работу бэкенда мобильного приложения. Хорошо, если создатели приложения не заморачивались и все запросы уходят по «голому» HTTP. А что, если приложение для запросов использует HTTPS, и отказывается принимать сертификат вашего корневого удостоверяющего центра, который вы заботливо внедрили в хранилище операционной системы? Конечно, можно поискать запросы в декомпилированом приложении или с помощью реверс-инжиниринга вообще отключить применение шифрования, но хотелось бы способ попроще.
Что такое certificate pinning?
Даже при использовании HTTPS пользователь не защищен от атак «Человек посередине», потому что при инициализации соединения злоумышленник может подменить сертификат сервера на свой. Трафик при этом будет доступен злоумышленнику.
Справиться с такой атакой поможет certificate pinning. Эта защитная мера заключается в том, что разработчик «зашивает» в приложение доверенный сертификат. При установке защищенного соединения приложение проверяет, что сертификат, посылаемый сервером, совпадает с (или подписан) сертификатом из хранилища приложения.
Обход certificate pinning
В качестве подопытного выберем приложение Uber. Для анализа HTTP-трафика будем использовать Burp Suite. Также нам понадобится JDK и Android SDK (я использую все последней версии). Из Android SDK нам понадобится только утилита zipalign, так что при желании можно не скачивать весь SDK, а найти ее на просторах интернета.
Заранее облегчим себе жизнь, добавив следующие пути к нужным утилитам в переменную окружения PATH:
Открываем Burp, заходим в Proxy – Options – Add и добавляем Proxy Listener на интерфейсе, который будет доступен подопытному Android-устройству (или эмулятору). На устройстве в свою очередь настраиваем используемую Wi-Fi сеть на использование только что включенного прокси.
Скачаем apk-файл через apkpure.com, установим приложение на устройство и попытаемся войти в свой аккаунт – приложение зависнет на этапе аутентификации.
В логах Burp Suite (вкладка Alerts) при этом мы увидим множественные отчеты о неудачных SSL-рукопожатиях. Обратите внимание на первую строчку – именно через сервер cn-geo1.uber.com в моем случае осуществляется аутентификация, поэтому и не удается войти в приложение.
Дело в том, что Burp Suite при перехвате HTTPS-соединений (а мы помним, что все соединения устройства проксируются через него) подменяет сертификат веб-сервера на свой, который, естественно, не входит в список доверенных. Чтобы устройство доверяло сертификату, выполняем следующие действия. В Burp заходим в Proxy – Options и нажимаем Import/export CA certificate. Далее в диалоге выбираем Export Certificate. Копируем сертификат на устройство, переходим в Настройки – Безопасность – Установить сертификаты и устанавливаем наш сертификат в качестве сертификата для VPN и приложений.
Опять пытаемся войти в свой аккаунт. Сейчас приложение Uber сообщит нам только о неудачной попытке аутентификации – значит прогресс есть, осталось только обойти certificate pinning.
Откроем приложение в вашем любимом архиваторе как zip-архив. В папке res/raw можно заметить файл с говорящим названием ssl_pinning_certs_bk146.bks.
По его расширению можно понять, что Uber использует хранилище ключей в формате BouncyCastle (BKS). Из-за этого нельзя просто заменить сертификат в приложении. Сначала нужно сгенерировать BKS-хранилище. Для этого качаем jar для работы с BKS.
Теперь генерируем BKS-хранилище, которое будет содержать наш сертификат:
На вопрос о доверии сертификату отвечаем «yes». Опять открываем apk в архиваторе и заменяем оригинальное хранилище на наше (сохраняем при этом оригинальное название).
Но на этом все не заканчивается. Каждый apk должен быть подписан сертификатом разработчика. К счастью, это делается не для обеспечения безопасности, а для идентификации приложений, поэтому для наших исследовательских целей мы вполне можем использовать и недоверенный сертификат.
Удаляем из apk папку META-INF со старой подписью приложения и приступаем к генерации новой.
Создаем хранилище ключей и генерируем в нем ключ для подписи apk:
Подписываем только что сгенерированным ключом наш APK:
Теперь осталось выровнять данные в архиве по четырехбайтной границе:
Fiddler-инструмент для анализа трафика мобильных приложений. Выявляем уязвимости
Разработчики большое внимание уделяют удобству и внешнему виду, однако вопросам безопасности не всегда уделяется должное внимание. Недостаточная защищенность приложения увеличивает репутационные риски для компании-разработчика, а утечка конфиденциальных пользовательских данных негативно сказывается на его деловой репутации.
Большинство современных мобильных приложений построены на клиент-серверной архитектуре. Как правило, клиент функционирует под управлением одной из популярных мобильных ОС – Android или iOS, и обменивается данными с сервером. Использование открытых незащищенных протоколов передачи данных многократно увеличивают риски компрометации передаваемого трафика. Но даже защищенные соединения не всегда дают 100% гарантию надежности сохранности данных.
В данной статье мы познакомимся с инструментом Fiddler, позволяющим перехватывать и анализировать весь трафик между клиентом и сервером. Данный инструмент может помочь выявить уязвимости в процессе клиент-серверного взаимодействия мобильного приложения.
(Если вы уже работали с этим инструментом, делитесь опытом в комментариях)
Для начала установите Fiddler на ПК или ноутбук. Убедитесь, что ПК/ноутбук и смартфон находятся в одной сети (например, подключив устройства к одному wifi-роутеру). Это условие является обязательным, т.к. устройства не увидят друг друга. Проверить связь между устройствами можно через команду ping.
Далее, убедитесь, что Fiddler может принимать входящие соединения:
Настройка устройства на базе Android
Убедитесь, что Fiddler запущен и брандмауэр Windows отключен, далее на Android-устройстве выполните шаги:
После нажатия на кнопку «Сохранить» весь трафик смартфона должен быть виден в окне Fiddler.
Настройка устройств на базе iOS
Убедитесь, что Fiddler запущен и брандмауэр Windows отключен, далее на iOS-устройстве выполните шаги:
После нажатия на кнопку «Сохранить» весь трафик смартфона должен быть виден в окне Fiddler.
С этими настройками возможен перехват только незащищенного HTTP-трафика. Для работы с защищенным HTTPS-трафиком потребуется установка корневого сертификата на устройствах, а также дополнительная настройка Fiddler.
Для Android: скачайте FiddlerRoot certificate, откройте его, установите и задайте имя.
Для iOS: скачайте FiddlerRoot certificate, откройте его, нажмите «разрешить», после чего перейдите в Настройки → Профиль загружен → Установить. Далее в Настройках → Основные → Об этом устройстве → Доверие сертификатам → найдите сертификат и сделайте его доверенным.
После этого вы сможете работать и анализировать защищенный HTTPS-трафик в Fiddler.
Начинающему QA: полезные функции снифферов на примере Charles Proxy
В этой статье я расскажу об основных функциях снифферов, которые могут быть полезны QA. Попробую не вдаваться в теорию, а сфокусироваться на практике. Наиболее популярными представителями анализаторов трафика сейчас являются WhireShark, Fiddler и Charles Proxy. Об удобстве интерфейсов и функционале каждого из них можно рассуждать долго, учитывая все плюсы и минусы. Но здесь я отдал предпочтение Charles, поскольку сам им активно пользуюсь. Буду рассказывать на его примере.
Что собой представляет Charles Proxy
Первичная настройка
При тестировании мобильного приложения
Charles Proxy необходимо запустить на компьютере, который находится в той же локальной подсети, что и мобильное устройство с тестируемым приложением.
Как правило, соединение настраивается по Wi-Fi. В настройках Wi-Fi мобильного устройства в качестве proxy-сервера надо указать IP-адрес компьютера и стандартный порт инструмента 8888 (пароль остается пустым).
Главное отличие в настройках для этой ОС в том, что с Android 6.0 и выше в Androidmanifest надо добавить специальную конфигурацию, позволяющую просматривать защищенный трафик. На продакшене эта конфигурация убирается из соображений безопасности.
При тестировании приложения на ПК
Сертификат устанавливается в доверенные корневые центры.
Два слова об интерфейсе
С помощью контекстного меню запроса можно настраивать блокировки, повторять и изменять запросы. На этом мы еще остановимся.
На вкладке Sequence запросы выведены по времени в виде настраиваемой таблицы. Видно, когда начался запрос, сколько он длился, его размер, статус и т.п. Наведя на конкретную строку, мы получим ту же информацию о теле, заголовках и т.п.
Если запросов на экране слишком много, с помощью панели инструментов их можно очистить или вообще остановить перехват. Там же есть возможность включить и выключить троттлинг (подробнее об этих функциях расскажу позже). Базовая настройка каждой из функций осуществляется через меню, а кнопки панели управления выступают своего рода тумблерами On / Off.
Фильтрация
В Charles Proxy очень много вариантов фильтрации запросов.
На вкладке Sequence есть аналогичный фильтр.
Charles Proxy умеет работать с регулярными выражениями. Для этого на вкладке Sequence выбираем Settings и отмечаем пункт Filter uses regex. И вписываем в поле поиска элементарную регулярку.
можно выбрать все запросы, в которых в начале имени хоста находится четыре буквы, а потом идет точка.
Там же можно включить Autoscroll списка запросов или указать максимальное количество строк.
Блокируемый запрос можно прервать двумя способами (подходящий надо выбрать в настройках):
вернуть ошибку 403.
От выбранного способа блокировки зависит, какой ответ мы получим.
Можно провести эксперимент. Включим наш тестовый стенд в Block list, выбрав простой сброс соединения. С помощью контекстного меню запроса повторим его (команда Repeat) и получим такой ответ:
Просмотр SSL-трафика
Если ранее мы успешно установили SSL-сертификат, для просмотра зашифрованного трафика остается только включить SSL proxying для нужного хоста в самом Charles Proxy. Это можно сделать через контекстное меню конкретного хоста.
Аналогично настройке фильтров на вкладках Include и Exclude можно добавить или исключить конкретные хосты. Если списки на этих вкладках не заполнять, по умолчанию мы будем читать трафик со всех хостов.
Брейкпоинты
Установить Breakpoint можно из контекстного меню запроса. После этого все аналогичные запросы будут перехвачены. Их можно будет просматривать и редактировать.
Чтобы проверить, как это работает можно использовать повтор запроса (Repeat из того же контекстного меню). Запрос перехватывается, его можно редактировать.
Map remote
Эта функция может быть полезна, если мы поймали ошибку на продакшене, например при загрузке таблицы, а информации в dev-контуре для полноценного тестирования не хватает. Вместо того, чтобы перезаполнять информацию в каждом контуре, мы можем скопировать ответ сервера в нужный контур и посмотреть, как он ведет себя после исправления ошибки.
Map Local
Главное отличие Map Local от предыдущей функции в том, что замена осуществляется не на ответ другого сервера, а на содержимое локального файла. Настройки выглядят точно также, но вместо второго сервера мы указываем локальный путь к файлу с ответом.
Rewrite
Функция Rewrite может быть полезна, если вам нужно переписать данные, которые отправляются в Charles Proxy. В отличие от простого редактирования Rewrite позволяет задать правила изменения и работать в автоматическом режиме. Можно изменять и добавлять заголовки, искать и заменять текст в теле запроса или ответа. Можно даже менять статус ответа.
Настроить это можно через Rewrite settings, доступные в контекстном меню. Единственный недостаток инструмента в том, что каждое правило замены прописывается отдельно.
Помимо изменения запросов и ответов мы можем запретить кэширование или cookie (функции No caching и Block cookies). Эти опции повторяют аналогичные инструменты панели разработчика в браузере. В обоих случаях настраивается список хостов, для которых действует настройка. Если же список пуст, то кэширование и cookie отключаются на всех перехваченных хостах.
Throttling
Charles Proxy помогает тестировать сервис на плохой связи, искусственно ограничив через настройки пропускную способность канала. Эта функция полезнее всего для тестирования десктопных приложений, поскольку на мобильных устройствах качеством связи можно управлять через панель разработчика.
Ограничения можно включить либо для хостов из списка, либо для всех перехваченных запросов. Из коробки есть несколько пресетов, но все параметры связи можно корректировать вручную. Мне по большей части хватает базовых настроек.
Repeat Advanced
Хотя полноценное нагрузочное тестирование лучше проводить в специальных инструментах, Charles Proxy имеет одну базовую настройку, которая помогает закрыть минимальные потребности. Функция Repeat Advanced (доступная через контекстное меню перехваченного запроса) позволяет нужное количество раз повторить тот же запрос. После настройки откроется отдельная сессия, где будут видны детали каждого из запросов.
Отмечу, что Charles Proxy платный. Можно использовать триальную версию. Но раз в 5-7 минут поверх него будет отображаться всплывающее окно с версией, а раз в 30 минут он будет выключаться, при этом сессии не сохраняются. Решайте сами, помешает ли это вашей работе.
Автор статьи: Артем Холевко, Максилект.
Текст подготовлен по материалам внутреннего семинара Максилект.
Перехват http трафика мобильного приложения
Описание:
Приложение для захвата пакетов http и https, обзор поддержки, предварительный просмотр, внедрение
Особенности HttpCanary Premium:
1. Нет рекламы.
2. Http-запрос и ответные инъекции.
3. Поддержка повтора, составления и копирования CURL.
4. Все мощные плагины доступны.
5. Более мощные функции в будущем.
ImportantСамое важное: рут не требуется! Корень не требуется! Корень не требуется!
HttpCanary поддерживает захват и внедрение пакетов. С помощью этого приложения вы можете очень легко протестировать свои мобильные API для отдыха. Кроме того, HttpCanary предоставляет несколько браузеров представления, таких как необработанный просмотрщик, просмотрщик шестнадцатеричных изображений, просмотрщик предварительного просмотра и так далее.
* Поддержка протоколов
HTTP1.0, HTTP1.1, HTTP2.0, WebSocket и TLS / SSL.
* Устройства поддержки
Любые устройства Android Arm или x86 включают эмуляторы.
* Инъекция
HttpCanary предоставляет два разных режима для инъекции: статический режим и динамический режим. Вы можете ввести параметры запроса, заголовки, тела и строку состояния. Вы можете создавать инжекторы с различными требованиями, и статический режим поддерживает одновременно несколько форсунок.
* Просмотр браузеров
Необработанный просмотрщик, показывает необработанные пакеты данных.
Просмотрщик текста, показывает данные тела в виде текста.
Hex viewer, показывает данные тела в виде шестнадцатеричной строки.
Json viewer, показывает отформатированные данные json, поддерживает развёртывание и свертывание узлов.
Просмотр изображений, поддержка шоу форматов BPM, PNG, GIF, JPG, WEBP.
Аудио просмотра, поддержка воспроизведения форматов AAC, WAC, MP3, OGG, MPEG.
* Обзор содержимого
HttpCanary отображает многомерный обзор сеанса. Включает URL, протокол http, метод http, код ответа, хост сервера, ip и порт сервера, тип контента, поддержку активности, время, размер данных и т.д.
* Фильтр пакетов
В HttpCanary есть многомерные фильтры, с помощью которых вы можете фильтровать пакеты по приложению, хосту, протоколу, методу, ip, порту и ключевым словам.
* Настройки блокировки
Вы можете заблокировать запросы и ответы, легко отладить REST API.
* Плагины
HttpCanary поддерживает многие плагины, включая экспериментальные плагины и плагины расширения. Теперь в приложение интегрировано несколько экспериментальных плагинов, таких как HostBlock, Mime-TypeBlock, Downloaders и OverviewStatistics. В будущем мы опубликуем расширение plugin-sdk для разработчиков и поддержим плагины расширения.
В конце концов, основные коды HttpCanary открыты в Github, мы надеемся, что HttpCanary сможет помочь большему количеству людей.
Требуется Android: 5.x+
Русский интерфейс: Нет
Русские Блоги
Руководство по настройке захвата пакетов мобильного телефона с помощью Fiddler, Charles и mitmproxy
При написании поискового робота некоторые данные на стороне ПК не могут предоставить нужные нам данные, например Douyin, поэтому нам необходимо ввести данные на мобильном телефоне. Line Grabbing, в настоящее время наиболее часто используемое программное обеспечение для захвата приложений: Fiddler, mitmproxy, Charles, это программное обеспечение должно выполнить соответствующую конфигурацию прокси-сервера перед захватом пакета данных: загрузите, убедитесь, что ПК-терминал и мобильный терминал находятся в одной локальной сети, Загрузка сертификата, настройка порта и т. Д.
Используйте метод настройки прокси-сервера Fiddler
Сначала загрузите Fiddler с официального сайта, адрес загрузки: http://www.telerik.com/fiddler; после загрузки локально выполните обычный процесс установки. Страница, открытая после установки, выглядит следующим образом:
Следующим шагом является изменение настроек прокси для Wi-Fi на мобильном телефоне; откройте Wi-Fi в соединении, нажмите переключатель прокси ниже, чтобы переключиться в ручной режим, введите ip на стороне компьютера как имя хоста и порт как порт, установленный Fiddler, а затем нажмите OK.
Результат успешной настройки выглядит следующим образом:
Использование метода настройки прокси Charles
Сначала настройте программное обеспечение Charles, откройте клиент, щелкните меню Прокси-> Параметры прокси, установите порт сервера, вы также можете изменить порт, проверьте следующее [Включить прозрачное HTTP-проксирование], чтобы позволить Чарльзу установить себя в качестве прокси Сервер реализует захват пакетов, и все запросы доступа, отправленные локальной системой, будут перехвачены. Если вы используете Charles только для захвата мобильного телефона, вам не нужно проверять проксирование Windows в меню, чтобы избежать вмешательства со стороны ПК для запроса данных.
Измените прокси и порт WiFi на мобильном телефоне:
У некоторых небольших партнеров может появиться сообщение «Wi-Fi подключен, но не может получить доступ к Интернету» на мобильном телефоне после успешной настройки. В это время вы можете сначала преобразовать прокси-сервер Wi-Fi в [Нет], а затем отключить и снова подключить Wi-Fi. Когда Wi-Fi можно использовать в обычном режиме, измените прокси-сервер Wi-Fi, измените основное имя и сохраните порт, тогда мобильный телефон сможет получить доступ к сети в обычном режиме.
Обратите внимание на друзей, которые используют win10. Лучше всего отключить брандмауэр перед настройкой. После успешной настройки страница Charles будет выглядеть, как показано ниже:
Чтобы избежать искажения или сбоя при захвате данных http на локальном или мобильном терминале, вам необходимо соответствующим образом настроить сертификат SSL.И компьютерный терминал, и мобильный терминал должны быть настроены соответствующим образом.
Следуйте инструкциям по установке;
Выбирая место хранения сертификата, просто выберите [Личное]. Вообще говоря, выбирается второй вариант.
Позже, если вы настроите указанное доменное имя, порт здесь может быть установлен на 443, чтобы вы могли захватывать данные указанного доменного имени;
Появится следующая страница, что означает, что вы можете настроить прокси на своем мобильном телефоне: 192.168.2.173:1111, что означает, что мобильный терминал и ПК-терминал находятся в одной локальной сети, а затем использовать мобильный браузер. для доступа к chls.pro/ssl:
После успешной загрузки его необходимо установить локально на мобильный телефон. Вот как пример Redmi. При установке сертификата безопасности на мобильный телефон Xiaomi необходимо заранее установить пароль разблокировки, иначе установка не будет Работа.
После завершения установки вы можете использовать Charles для получения данных http на мобильном телефоне.
Соответствующая конфигурация перехвата принимающего пакета mitmproxy
Здесь вы можете напрямую получить порт mitmproxy как 8080. Второй шаг такой же, как у Charles. Убедитесь, что мобильный телефон и компьютер находятся в одной локальной сети. IP-адрес компьютера получается таким же образом. как у Чарльза. После успешной настройки mitmdump выглядит следующим образом: