Бывают ситуации, когда при разработке или тестировании мобильного приложения возникает необходимость просмотреть сетевой трафик приложения. Все еще просматриваете трафик мобильного приложения, выводя его в консоль вашей IDE? Для этой задачи есть более эффективные инструменты, например, прокси. В этой статье мы разберем самые популярные HTTP(S) прокси, научимся их использовать в iOS разработке, а также сравним их по различным критериям.


Далее мы будем говорить про применение прокси в iOS разработке, но многие вещи также применимы и в Android разработке.


Осторожно, под катом очень много картинок.


Инструменты, позволяющие анализировать сетевой трафик мобильного приложения, можно разделить на:


  1. Не требующие интеграции в исходный код тестируемого приложения — прокси:
  2. Требующие интеграции в исходный код тестируемого приложения. Сюда относят в основном фреймворки для отладки:

Это первая часть статьи, в которой мы рассмотрим использование прокси и сравним их по различным критериям. Во второй части статьи основательно пройдемся по фреймворкам для отладки.


Mitmproxy



Mitmproxy является бесплатным и опенсорсным ( ~12000 звезд на гитхабе) HTTP(S)-proxy, который состоит из непосредственно самого Mitmproxy — консольной утилиты для проксирования трафика, mitmdump — дополнительной консольной утилиты, представляющей функциональность похожую на tcpdump, но для HTTP(S) трафика, а также mitmweb — веб-интерфейса для Mitmproxy.


Установить Mitmproxy можно с помощью Homebrew:


brew install mitmproxy


Или загрузить нужную версию со страницы релизов с официального сайта.


После успешной установки для анализа HTTP трафика с симулятора или девайса необходимо указать прокси в настройках сети.


Для симулятора необходимо активировать HTTP и HTTPS прокси в настройках сети Mac OS (System preferences -> Network -> Advanced -> Proxies):



Небольшой bash-скрипт для быстрой активации/деактивации прокси в настройках сети для Wi-Fi на Mac. (Один раз прописали IP и порт прокси в настройках и затем используем из консоли команду proxy on или proxy off).


Для перехвата трафика с реального девайса необходимо указать прокси в настройках сети iOS, при этом в качестве IP-адреса прокси указываем IP-адрес компьютера с запущенным Mitmproxy, в качестве порта — 8080. (IP-адрес компьютера можно посмотреть в Settings > Network)



На данном этапе мы уже можем перехватывать HTTP трафик, но для перехвата HTTPS трафика необходимо установить сертификаты Mitmproxy на симулятор/девайс.
Для этого на симуляторе выполним следующее(для реального девайса действия аналогичны):


  • Убедитесь, что запущен Mitmproxy и в сетевых настройках (для симулятора — настройки macOS, для девайса — настройки iOS) активирован и прописан прокси, как это сделать описано выше. Теперь перейдем в браузере по адресу mitm.it и нажмем на иконку Apple для скачивания сертификата Mitmproxy. Появится алерт с сообщением, что данный веб-сайт пытается открыть настройки iOS: жмем Allow.


  • Затем устанавливаем сертификат Mitmproxy.


  • И последний штрих — для iOS версии 10.3 и выше необходимо включить полный доступ к рутовому сертификату Mitmproxy. Для этого перейдем в Settings > General > About > Certificate Trust Settings и активируем полный доступ для сертификата Mitmproxy.


Теперь мы можем анализировать HTTPS трафик с симулятора. Остается добавить небольшое уточнение: сертификат устанавливается для конкретного симулятора, то есть если мы сделали это только для симулятора iPhone X, то на симуляторе iPhone 8 нужно проделать то же самое, чтобы прокси перехватывал HTTPS трафик. Для перехвата HTTPS трафика с реального девайса все шаги аналогичны, главное, чтобы он был подключен к той же локальной сети, что и компьютер с Mitmproxy.


После этого можно запустить mitmproxy из консоли и почувствовать себя хакером или веб-клиент mitmweb.


Консольный клиент встречает нас ламповым интерфейсом (для любителей GUI есть даже поддержка мышки), где отображаются все перехваченные запросы.



Можно просмотреть детальную информацию по каждому запросу (параметры запроса, заголовки, ответ и т.д.)



В Mitmproxy есть мощная система фильтрации запросов с поддержкой регулярных выражений. Можно фильтровать запросы по коду, телу запроса/ответа, заголовкам, домену и т.д. Вызвать справку по доступным шорткатам и выражениям для фильтрации можно нажав ?. Например, чтобы очистить список запросов для текущей сессии можно просто нажать z, а чтобы отфильтровать список запросов по URL в котором есть слово "apple" нужно нажать f и написать выражение фильтрации по URL ~u apple, которое принимает регулярное выражение.



Также поклонники Vim будут довольны поддержкой hjkl. Чуть не забыли про очень важный шорткат q — работает как кнопка "назад" при перемещении между экранами, а на главном экране со списком запросов при нажатии этого шортката Mitmproxy предложит выйти из программы.
Несмотря на консольный интерфейс пользоваться Mitmproxy одно удовольствие благодаря удобным шорткатам и простому интуитивному управлению. Ниже представлена небольшая таблица с основными шорткатами.


Шорткат Описание
? Cправка
z Очистка списка текущей сессии
f Фильтрация сессии
q Назад (выход на главном экране)
d Удалить запрос из списка сессии
r Повторить запрос
e Сохранить запрос в файл
g В начало списка сессии
G В конец списка сессии

Если Вы все же ярый противник консоли и признаете только GUI приложения, то здесь к нам на помощь спешит mitmweb, запустим его пока также из консоли, позже можно сделать ярлык на рабочий стол.



Веб-клиент пока что находится в Beta-тестировании и в нем присутствует только базовый функционал mitmproxy (хватает для 95% задач), который постепенно дополняется новыми фичами с каждым новым релизом, но несмотря на это им уже сейчас можно пользоваться и это очень удобно. Некоторые шорткаты из консольной версии работают и здесь, например, для очистки списка запросов текущей сессии нужно просто нажать z. Можно также отфильтровать перехваченные запросы через поле "Search", как мы делали это в консольном приложении, когда применяли фильтр ~u apple.



Mitmproxy заявляет о поддержке стандарта Websocket, но к сожалению отображение Websocket фреймов в UI пока что не реализовано и по заверениям разработчиков функциональность Websocket доступна только для утилиты mitmdump.


Charles



Charles является пожалуй самым популярным HTTP(S) прокси для MacOS, единственный его недостаток — это то, что он платный, на момент написания статьи лицензия стоит 50$. Однако есть пробная версия — работает 30 минут, потом требуется перезапуск приложения, при этом теряется вся история запросов. Также имеются пятисекундные задержки при запуске.


После установки и первого запуска Charles попросит дать доступ для автоматической настройки системного прокси, выбираем "Grant privelegies", либо меняем настройки системного прокси каждый раз вручную. Таким образом Charles будет сам менять и активировать настройки системного прокси, когда он запущен — это удобно при отладке на симуляторе, но на реальном девайсе придется прописывать настройки прокси сервера для сети вручную, в качестве прокси-сервера указываем IP-адрес компьютера, на котором запущен Charles, в качестве порта — 8888.


На данном этапе мы можем просматривать только HTTP трафик, для анализа HTTPS трафика с симулятора или реального девайса, нам необходимо установить на него сертификат Charles, процедура аналогична установке сертификата Mitmproxy. Убедитесь, что прокси запущен и активирован в сетевых настройках iOS (для реального девайса) или в сетевых настройках macOS (для симулятора). Затем перейдем на симуляторе/девайсе в браузере по адресу chls.pro/ssl, появится алерт с сообщением, что данный веб-сайт пытается открыть настройки iOS: выбираем Allow. Далее выбираем Install, чтобы установить сертификат. После установки сертификата для iOS версии 10.3 и выше необходимо включить полный доступ к рутовому сертификату Charles. Для этого перейдем в Settings > General > About > Certificate Trust Settings и активируем полный доступ для сертификата Charles.



И последнее, необходимо настроить SSL проксирование в Charles, по умолчанию он не расшифровывает HTTPS трафик, даже если Вы установили все нужные сертификаты. Чтобы активировать SSL проксирование переходим в Proxy > SSL Proxying Setings и активируем SSL Proxying, если он выключен, далее у нас есть два варианта — разрешить SSL проксирование для всех доменов или только для конкретных. Чтобы разрешить SSL проксирование для всех доменов нужно добавить wildcard-локацию: нажимаем кнопку Add и во всех полях прописываем *, таким образом настройки SSL должны выглядеть так.



Чтобы разрешить SSl проксирование только для конкретных доменов нужно добавить их в список и убедиться, что wildcard локация отключена. При этом Charles будет все равно перехватывать весь трафик, но HTTPS запросы доменов, которых нет в списке не будут расшифровываться.


При использовании Charles удобно использовать фильтры перехвата трафика, которые можно настроить в меню Proxy > Recording Settings: можно указать протокол, URL, порт.



Теперь у нас есть возможность просматривать HTTPS трафик.



Также Charles поддерживает протокол Websocket и отображает сообщения в стиле iMessage, выглядит удобно.



Отдельного упоминания заслуживает первый в своем роде прокси Charles for iOS — мобильное версия Charles, ценник в App Store на момент написания статьи — 9$. В приложении присутствует базовый функционал десктопной версии: проксирование HTTP(S) трафика, просмотр контента запросов/ответов и удобная автоматическая установка настроек прокси для Wi-Fi сети.



Burp Suite (Community Edition)



Burp Suite это швейцарский нож пентестеров и хакеров, содержащий в себе неприлично большое количество инструментов и функционала. Одним из модулей в Burp Suite является прокси, который мы будем использовать для анализа HTTP(S) трафика. Существуют две версии приложения: Professional и Community Edition. Community версия является бесплатной, в ней нет сканера уязвимостей и есть ограничение на количество запросов за единицу времени, но несмотря на это бесплатная версия приложения является полноценным инструментов тестирования.


После запуска приложения нужно добавить и активировать прокси, перейдя в Proxy > Options.



Затем необходимо убедиться, что выключен перехватчик запросов "Intercept", иначе он будет перехватывать запросы и удерживать их, пока Вы не скажете ему, что делать с этим запросом — отменить или переслать серверу. Поэтому выключаем его, сейчас он нам не понадобится.



Далее необходимо установить на симулятор/девайс сертификат Burp Suite, эта процедура нам уже должна быть до боли знакома после установки сертификатов Mitmproxy и Charles. Запускаем Burp Suite, при этом не забываем активировать прокси в настройках сети MacOS для симулятора или в iOS для реального девайса (как это сделать можно посмотреть в разделе Mitmproxy), в качестве прокси-сервера указываем IP-адрес компьютера, на котором запущен Burp Suite, в качестве порта — 8080. Затем переходим в браузер на симуляторе и вводим адрес http://burp. Далее кликаем по кнопке на сайте "CA Certificate" и скачиваем сертификат.



Затем устанаваливаем сертификат. После установки сертификата для iOS версии 10.3 и выше необходимо включить полный доступ к рутовому сертификату Burp Suite. Для этого перейдем в Settings > General > About > Certificate Trust Settings и активируем полный доступ для сертификата Burp Suite.



Перейдя во вкладку Proxy -> HTTP history можно просматривать HTTP(S) трафик с мобильного приложения. Стоит отметить, что минусом здесь является отсутствие форматирования JSON в теле запроса/ответа.



Проблему с форматированием JSON можно решить установкой плагина JSON Beautifier. Для установки перейдем во вкладку Extender > BApp Store найдем в списке плагинов JSON Beautifier и нажмем install.



Теперь появилась дополнительная вкладка JSON Beautifier с красивым JSON.



Burp Suite поддерживает протокол Websocket. Websocket сообщения можно найти в специальной вкладке Proxy > WebSockets history.



OWASP ZAP



Owasp ZAP — детище всемирно известного в среде кибер-безопасности сообщества Owasp, кроме того прокси имеет открытый исходный код. Owasp ZAP часто сравнивают с Burp Suite, но последнему он уступает в популярности. Owasp ZAP полностью бесплатен, нет каких-либо PRO версий по сравнению с Burp Suite.


После запуска приложения нужно проверить настройки прокси Preferences > Local Proxies, настройки по умолчанию должны выглядеть так.



Затем перейдем в Preferences > Dynamic SSL Certificates для экспорта SSL сертификата. Кликаем по кнопке Save и сохраняем сертификат, например, на рабочий стол.



Далее просто перетягиваем файл сертификата в симулятор и открывается окно с предложением установить сертификат, соглашаемся и устанавливаем. После установки сертификата для iOS версии 10.3 и выше необходимо включить полный доступ к рутовому сертификату OWASP ZAP. Для этого перейдем в Settings > General > About > Certificate Trust Settings и активируем полный доступ для сертификата OWASP ZAP.



Теперь у нас есть возможность просматривать HTTPS трафик. JSON к сожалению здесь не имеет красивого форматирования и мы пока что не смогли исправить эту ситуацию, на крайний случай можно использовать сторонний JSON formatter, например этот.



OWASP ZAP поддерживает протокол Websocket. Websocket сообщения можно найти в специальной вкладке WebSockets, там же удобно выбрать "канал" для фильтрации по домену.



SSL Pinning


Если в вашем приложении реализован SSL Pinning, то вы не увидите проксируемого трафика приложения, так как прокси использует собственный сертификат для SSL, в этом случае есть 4 варианта:


  1. Временно отключать SSL Pinning на время отладки сетевых запросов с помощью прокси.
  2. Добавить сертификат/публичный ключ прокси к запиненным сертификатам/ключам для debug билдов.
  3. Использовать сертификат вашего сервера для прокси вместо сгенерированного им собственного сертификата.
  4. Вместо внешнего прокси использовать фреймворк для отладки (список фреймворков указан в самом начале статьи), который будет перехватывать и показывать запросы и ответы непосредственно в самом приложении, но для этого требуется интеграция в существующий исходный код приложения, более подробно об этих инструментах в следующей статье.

Итоги


Начнем с Charles. Пожалуй лучший прокси для тех, кому нужно, чтобы все работало из коробки и максимально user-friendly, хотя в некоторых моментах и Charles может удивить пользователя, функциональность прокси очень обширна, также он имеет самый красивый и нативный для macOS интерфейс из всех описанных в статье прокси. Если вы не против выложить 50$ за такой инструмент, то тогда это Ваш выбор.


Перейдем к Burp Suite. Мощнейшая тулза, по определенному функционалу и даже удобству использования в некоторых случаях смело дает фору Charles, кроме того имеется система расширения функционала в виде плагинов. Burp Suite с давних пор зарекомендовал себя, как очень надежный и точный инструмент в умелых руках. Если вам не хватает функционала вашего текущего прокси, то советую обратить внимание на данный экземпляр.


Настал черед Mitmproxy — молодой и перспективный прокси, активно набирающий популярность, который разрабатывает Open Source сообщество. Самый противоречивый из просмотренных нами прокси, но при этом не менее интересный. Mitmproxy выделяется от конкурентов безумно удобным, простым и функциональным консольным UI. Также есть возможность использовать веб-интерфейс Mitmweb, но он находится сейчас в Beta-тестировании из-за чего возможно редкое, но появление багов, отсутствует часть продвинутого функционала Mitmproxy (постепенно доделывается), а также он немного уступает в удобстве более нативным конкурентам. Также огорчила поддержка протокола Websocket, она как бы есть, но в UI отображения нет или мы просто не научились его готовить, так как не смогли заставить Mitmproxy отображать Websocket сообщения, хотя с другими прокси у нас таких проблем не было.


И последним в списке, но не менее интересным остался Owasp ZAP. Из плюсов можно отметить наличие расширяемой системы плагинов (субъективно их количество меньше чем для Burp Suite), но к сожалению мы так и не смогли настроить красивое отображение JSON в теле запросов/ответов, что является довольно критичным критерием при выборе прокси для мобильной разработки. Однако Owasp ZAP имеет продвинутую систему для тестирования Websocket трафика, а также громкое имя разработчиков сообщества Owasp за своей спиной, поэтому я бы не стал сбрасывать его со счетов и имел в виду для редких и сложных кейсов.


Ниже представлена субъективная сводная таблица, разобранных нами прокси.


критерий/прокси Mitmproxy Charles Burpsuite (CE) Owasp ZAP
JSON форматирование + + + -
Редактирование и повтор запросов + + + +
Поддержка Websocket - + + +
Free software + - + +

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

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