Анализ HTTP-трафика с mitmproxy
Mitmproxy — это набор инструментов, предоставляющих интерактивный перехватывающий прокси-сервер с поддержкой SSL/TLS для HTTP/1, HTTP/2 и WebSockets. Он позволяет посмотреть, какие запросы отправляет служба или приложение на вашем компьютере и какие ответы получает.
Чаще всего MITM Proxy используют для проведения тестов. Например, он помогает:
- Убедиться, что приложение отправляет правильные данные на серверную часть.
- Проверить, отвечает ли серверная часть ожидаемой информации в приложении.
- Имитировать сценарии ошибки 400 при неверном запросе из приложения.
- Имитировать отправку неверных данных на сервер.
В основе этих операций лежит сниффинг трафика. Это простейший метод анализа, который позволяет осуществить перехват HTTPS-трафика, HTTP-трафика и Websockets.
Функциональность mitmproxy
- Перехват запросов и ответов HTTP и HTTPS.
- Изменение данных на лету.
- Сохранение сессий для анализа и воспроизведения.
- Воспроизведение запросов и ответов на стороне клиента.
- Обратное проксирование для перенаправления трафика.
- Автоматизация изменений HTTP-трафика через mitmproxy Python script.
- Генерирование SSL/TLS-сертификатов, необходимых для перехвата HTTPS-трафика.
Узнать больше о функциональности набора, в том числе об особенностях работы mitmproxy в Python, вы можете из документации.
Основные инструменты
Инструменты проекта mitmproxy представляют собой набор внешних интерфейсов, предоставляющих общую базовую функциональность. Когда мы говорим о mitmproxy, то имеем в виду любой из трех инструментов. Это просто разные интерфейсы для одного и того же основного прокси.
- mitmproxy — это сам перехватывающий прокси-сервер,
- mitmweb — веб-интерфейс для mitmproxy,
- mitmdump — инструмент для работы с прокси через командную строку.
mitmproxy — это консольный инструмент, который позволяет интерактивно проверять и изменять HTTP-трафик. Отличается от mitmdump тем, что все потоки хранятся в памяти. Это значит, что он предназначен для взятия и манипулирования небольшими выборками.
mitmweb — это веб-интерфейс пользователя mitmproxy, который позволяет интерактивно проверять и модифицировать HTTP-трафик. Как и mitmproxy, он отличается от mitmdump тем, что все потоки хранятся в памяти, а это значит, что он предназначен для взятия и обработки небольших выборок.
mitmdump — это расширение командной строки для mitmproxy. Он предоставляет функциональные возможности, подобные tcpdump, позволяющие просматривать, записывать и программно преобразовывать HTTP-трафик. С его помощью удобно обрабатывать большие выборки, в том числе с помощью скриптов.
Так, с помощью mitmdump можно сохранить информацию о трафике в файл:
Запустите mitmdump в режиме прокси и запишите весь трафик в outfile командой выше.
Доступна также фильтрация сохраненного трафика:
mitmdump -nr infile -w outfile "~m post"
Запустите mitmdump без привязки к порту прокси (-n), прочитайте все потоки из infile, примените указанное выражение фильтра (соответствует только POST) и запишите в outfile.
Как работает mitmproxy
Mitmproxy — чрезвычайно гибкий инструмент для настройки прокси. Точное знание того, как работает процесс проксирования, поможет вам правильно применять его для HTTP-прокси и HTTPS-прокси, принимая во внимание основные трудности и способы их обхода.
HTTP
Настройка клиента для использования mitmproxy в качестве явного прокси — самый простой и надежный способ перехвата трафика. Протокол HTTP кодифицирован в HTTP RFC, поэтому поведение как клиента, так и сервера четко определено и, как правило, надежно. В простейшем возможном взаимодействии с mitmproxy клиент подключается напрямую к прокси и делает запрос, который выглядит следующим образом:
GET http://example.com/index.html HTTP/1.1
Это прокси-запрос GET — расширенная форма HTTP-запроса GET, включающая схему и спецификацию хоста, а также всю информацию, необходимую mitmproxy для работы.
В таком случае порядок работы будет следующий:
- Клиент подключается к прокси и делает запрос.
- Mitmproxy подключается к вышестоящему серверу и просто пересылает запрос.
HTTPS
Процесс для явно проксируемого HTTPS-соединения совершенно другой. Клиент подключается к прокси и делает запрос, который выглядит так:
CONNECT example.com:443 HTTP/1.1
Обычный прокси-сервер не может ни просматривать, ни манипулировать потоком данных, зашифрованным с помощью TLS. Поэтому запрос CONNECT просто просит прокси-сервер открыть канал между клиентом и сервером. Прокси здесь всего лишь посредник — он слепо пересылает данные в обе стороны, ничего не зная о содержимом. Согласование TLS-соединения происходит по этому каналу. Последующий поток запросов и ответов полностью непрозрачен для прокси-сервера.
Именно здесь вступает в игру фундаментальный трюк mitmproxy. Название MITM расшифровывается как Man-In-The-Middle — отсылка к процессу перехвата и вмешательства в потоки данных, которые должны быть непрозрачными.
Основная идея MITM состоит в том, чтобы притворяться сервером для клиента и клиентом для сервера. На самом деле, вы находитесь посередине. Такая позиция позволяет расшифровывать трафик, который идет с обеих сторон.
Но о MITM знаем не только мы, но и люди, которые занимаются информационной безопасностью. Чтобы бороться с такими атаками, они придумали использовать центр сертификации. Через него доверенная третья сторона подписывает сертификаты сервера. Все подписи проверяются. Если у клиента возникают вопросы к легальности сертификата, соединение разрывается.
Система сертификации работает неидеально, но затыкает большую часть дыр, через которые можно использовать атаку MITM. Однако противодействовать этому все-таки можно — конечно, исключительно в целях тестирования собственных продуктов, а не взлома чужих.
Наш ответ на эту головоломку — стать доверенным центром сертификации самостоятельно. Mitmproxy включает в себя полную реализацию центра сертификации, который умеет создавать сертификаты. Чтобы клиент доверял им, мы регистрируем mitmproxy как доверенный ЦС на устройстве вручную.
Использование mitmproxy
Допустим, у вас есть веб-проект на cloud.timeweb.com. Вы хотите проверить, как он взаимодействует с клиентами. Сделать это поможет сниффер HTTP и HTTPS.
Установка набора приложений
В этой инструкции для примера будет использована версия mitmproxy для Windows. Использовать MITM HTTPS можно также на macOS и Linux. Руководства по установке доступны на официальном сайте утилиты.
Чтобы установить mitmproxy в Windows, загрузите установщик с сайта mitmproxy.org. После установки mitmproxy, mitmdump и mitmweb также добавляются в ваш PATH и могут быть вызваны из командной строки. Разработчики mitmproxy HTTPS рекомендуют также установить Windows Terminal — это бесплатный инструмент, который предлагает больше возможностей, чем стандартная командная строка Windows.
Запуск mitmproxy
Чтобы запустить mitmproxy, откройте командную строку (или Windows Terminal) и выполните команду:
Сниффер HTTP-запросов запустится с привязкой к порту 8080. Интерфейс командной строки (CLI) имеет сочетания клавиш, подобные редактору Vim на Linux:
- q — выйти из утилиты;
- клавиши со стрелками или h, j, k, l — перемещение вверх и вниз по списку запросов;
- ? — отображение справки;
- Enter — подробности о выбранном запросе.
Mitmproxy также предлагает веб-интерфейс (mitmweb) для тех, кто предпочитает мышь, а не сочетания клавиш Vim. Расширенные функции удобнее использовать в веб-интерфейсе, CLI больше подходит, когда нужно быстро захватить и проанализировать HTTP-трафик.
Настройка прокси
Чтобы выполнить анализ HTTP-трафика, нужно настроить прокси. Посмотрим, как это сделать на примере Windows:
- Откройте настройки Windows.
- Перейдите в раздел «Сеть и интернет».
- Выберите вкладку «Прокси».
- Включите опцию «Использовать прокси».
- Укажите адрес прокси-сервера и номер порта. В данном случае это локальный адрес 127.0.0.1 и порт 8080.
- Сохраните изменения.
Когда вы подключаетесь к любому адресу, Windows будет отправлять трафик через прокси-сервер. Это позволит перехватывать запросы и ответы.
Добавление доверенного сертификата
Теперь вы знаете, что такое HTTP-прокси и как настроить его на Windows. Следующий шаг — подмена SSL-сертификата. Без этого не получится перехватывать трафик защищенных сайтов — браузер будет выдавать ошибку, предупреждая об атаке MITM (Man-In-The-Middle).
Атака «человек посередине» (MITM) — это угроза безопасности, при которой злоумышленник может получить доступ между входящими и исходящими запросами. Вы думаете, что разговариваете с Twitter.com, но вы разговариваете с «человеком посередине», который разговаривает с Twitter вместо вас. Этот MITM может просматривать все, что вы отправляете, и даже изменять то, что вы получаете.
Протокол HTTPS предотвращает атаки MITM. Протокол HTTPS довольно сложен, но все, что нам нужно знать, так это то, что HTTPS использует доверенный центр сертификации (CA) для подписи сертификата. Наши браузеры предполагают, что если доверенный ЦС подписывает сертификат, мы обращаемся непосредственно к тому, кем себя считаем.
Mitmproxy сгенерировал сертификат при первом запуске. Все, что нам нужно — это заставить сервер доверять этому сертификату.
Добавить mitmproxy SSL на Windows можно с помощью руководства из документации Microsoft.
Мониторинг трафика
HTTPS MITM Proxy настроен, доверенный сертификат добавлен. Теперь можно мониторить трафик: перехватывать все запросы и ответы, просматривать их и редактировать.
Запустите mitmproxy через командную строку или в веб-интерфейсе. Затем перейдите в браузере на сайт, трафик которого вы хотите изучить. В mitmproxy отобразятся запросы и ответы. Вы можете посмотреть подробности или внести изменения — например, увеличить нагрузку.
Теперь вы можете перехватывать и проверять его сетевые запросы. Это может быть очень удобно для отладки проблем и понимания того, как что-то работает, не копаясь в исходном коде.
Дополнительные возможности mitmproxy
Мы рассмотрели только самый простой сценарий, при котором сниффер HTTPS-трафика может быть полезен. На практике кейсов очень много. Например, часто используют mitmproxy на Android, чтобы проверить работоспособность мобильных приложений. Для этого необходимо добавить mitmproxy SSL Certificate в системное хранилище сертификатов в файловой системе Android. Без этого выполнить перехват HTTPS-трафика на Android нельзя.
На официальном сайте есть руководство, которое помогает настроить HTTPS-сниффер с помощью виртуальной машины. HTTPS MITM Proxy также имеет подключаемый модуль kubectl. Он предназначен для простого развертывания mitmproxy и использования прокси-серверов Kubernetes Services.