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