Our first article is already on Habr! Share experience in network traffic analysis of a mobile application on iOS

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


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


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

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


Mitmproxy

Charles

Burp Suite

Owasp ZAP

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

Wormholy
Netfox
DotzuFlex
Pony Debugger


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.