[Из песочницы] Анализ сетевого трафика мобильного приложения на iOS. Часть 1 — прокси

o6nlfwhw_nzwxjhjdcbp6htqkf8.jpeg

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

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

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

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


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

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


Mitmproxy

6sx4yxmpa89qi5k_dizxgwkwda8.png

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):

z51rqb8cffwbfj6md_rq_0dvzbo.png

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

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

hppq7mqcuffu47f67lqkqmhl04w.png

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


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

npucxqnvc-k-wporeihhr7gvwvu.png


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

llm5x9dipaezxkmadswh-d-fz1m.png


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

t4bxpwt1b4uqhplj8nlaygmv4hi.png

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

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

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

ev9walbksj5rs9-xyfgro7c-irw.png

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

4gxendtfo1pmlrbyesmjwkkck5a.png

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

rxtaxlzj7_0g8ulpleurl9jdgma.png

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


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

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

ezwds15jyp-by5b3ic_d-hbo_3g.png

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

sr4zntpy7kccnhr_-thxh4-t_uy.png

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


Charles

w0huhqhik2xqsosv682wnqzdski.png

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.

uevskwgkqccit0f8xylhu5c9di8.png

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

ozpm0-3wqfnzy7pdrntt0_zud7g.png

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

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

tn0gu1oxzekxkhhiu1dvjryfsb0.png

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

id4e7mvkrp3jhioecejc4fpeb0w.png

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

nazj2depjv-5syvqdksal4o-w70.png

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

f5fjpfgfyd7egnkrxaft3q1bfbg.png

oc5veeejxf4avf8cqxx76rduzxc.jpeg

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

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

4bdupa1_viddbv4whpishs0tbdy.png

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

p95wi5sujsos-mmqxniwkliohsq.png

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

ks28fcpuxf8iig_uaqfzg0ojboe.png

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

v6onpcizqsfe13g508btt_dofhm.png

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

-sdwqaag2hg3vl18quhyj5t_rks.png

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

yyqyj9k2xw5lw_iicucpmkl5mkq.png

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

ovef-dcb03s1alol8ftnuxk8gio.png

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

f3ddf6qoeyyrvhl4africgba3dq.png


OWASP ZAP

qkerofsyh6pdb3tvzo7i5kvnz0m.jpeg

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

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

zffw2mzk8ut9ewbx97lowp4rzky.png

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

fujxxj5oamjqkvitcmsykkxy8oy.png

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

4vzveheku3uhmvagodbkewduifg.png

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

4guxjdtpkb3xuo-tibk7u6hr5-8.png

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

tuuq9ntpdwaoykwrktzfjelij08.png


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 + - + +

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

© Habrahabr.ru