Анализ трафика с помощью mitmproxy
Компании, предоставляющие веб-услуги для внешнего мира на собственной инфраструктуре, подвергаются различным угрозам. Разработчики инструмента с открытым исходным кодом Mitmproxy описывают его как швейцарский нож для отладки, тестирования, анализа защиты данных и тестирования на проникновение HTTP(S)-соединений. Я покажу вам, как mitmproxy может стать полезным дополнением к вашему набору инструментов безопасности.
Основные выводы
- Возможности «человек посередине»: Mitmproxy выступает в роли посредника между клиентами и серверами, перехватывая и расшифровывая как HTTP, так и HTTPS-трафик для анализа и модификации
- Управление сертификатами: Инструмент генерирует собственные сертификаты УЦ на лету и предоставляет простые методы установки на различных платформах (Windows, Linux, macOS, мобильные устройства)
- Множество вариантов интерфейса: Предлагает три интерфейса — командная строка (
mitmproxy), веб-GUI (mitmweb) и скриптуемый (mitmdump) — удовлетворяя различные предпочтения пользователей и потребности в автоматизации - Продвинутая манипуляция трафиком: Поддерживает редактирование запросов/ответов в реальном времени, повторное воспроизведение трафика, фильтрацию и выборочную перехватку с использованием регулярных выражений и фильтров потоков
- Расширяемая архитектура: Обладает модульным дизайном с поддержкой скриптов на Python и библиотекой разработанных сообществом расширений для создания пользовательской функциональности
- Кроссплатформенная поддержка: Доступно для Linux, macOS, Windows и мобильных платформ с возможностями контейнеризации Docker для облегчённого развертывания
- Фокус на тестировании безопасности: Специально разработано для тестирования на проникновение, отладки, анализа защиты данных и оценки безопасности веб-приложений
Человек посередине
Когда большинство людей слышат термин «прокси», они, вероятно, думают о традиционных прокси-серверах, которые выступают в роли шлюзов, соединяющих локальные сети с глобальной сетью, или как посредники, защищающие локальных клиентов от внешнего доступа (например, на ум приходят NGINX, Squid и WinGate). Судя по названию, можно было бы предположить, что mitmproxy относится к той же категории. Однако этот инструмент использует другой подход, специализируясь на анализе HTTP(S)-трафика. Подобно Wireshark, это программное обеспечение скорее является сниффером, который записывает данные между HTTP-клиентом и сервером и позволяет проводить анализ этой информации.
Часть названия mitm указывает на его функциональность: mitmproxy выступает в роли прокси «человек посередине» (MITM), который перехватывает и изменяет HTTP- и HTTPS-трафик. Вы можете записывать HTTP-разговор для последующего анализа, хотя инструмент ограничен обменом данными, специфичным для протокола. В отличие от Wireshark и других снифферов, никакие другие данные не сохраняются.
Mitmproxy также может выступать в роли обратного прокси и перенаправлять сетевой трафик на определённый сервер. Манипулирование HTTP-трафиком на основе скриптов также возможно, для чего можно использовать простые Python-скрипты. Взаимодействие с сторонними приложениями для автоматического управления или визуализации также возможно с помощью Python API. Mitmproxy также может генерировать SSL/TLS-сертификаты для перехвата.
Основные принципы
Базовое понимание того, как работает mitmproxy, полезно, если вы хотите эффективно работать в этой среде. Например, обратите внимание на доступ клиента к веб-серверу, защищенный HTTPS. Клиент использует команду HTTP:
CONNECT server.en:443 HTTP/1.1
Устаревший прокси-сервер не может изменять данные, зашифрованные с помощью SSL/TLS, а просто переправляет запрос к целевой системе; таким образом, он соответствует своему названию как уполномоченный агент. Когда вы используете mitmproxy, HTTPS-прокси располагается между клиентом и сервером с классическим подходом «человек посередине». Для клиента mitmproxy выглядит как сервер, при этом притворяясь клиентом для сервера, что позволяет mitmproxy расшифровывать трафик данных с обеих сторон.
Проблема mitmproxy заключается в том, что система удостоверяющего центра разработана для предотвращения именно такого типа атак, позволяя доверенной третьей стороне криптографически подписывать сертификаты сервера для подтверждения его подлинности. Если обнаруживаются какие-либо несоответствия, соединение прерывается, что часто затрудняет анализ защищённых соединений.
Разработчики mitmproxy использовали хитрость, чтобы решить эту проблему. Само программное обеспечение выступает в роли доверенного центра сертификации (CA). Для этого mitmproxy поставляется с полной реализацией CA, которая генерирует все необходимые сертификаты на лету. Чтобы клиент доверял этим сертификатам, необходимо вручную зарегистрировать mitmproxy в качестве доверенного CA.
Затем mitmproxy должен преодолеть дополнительные препятствия, чтобы внедрить среду между клиентом и сервером незамеченным. Например, необходимо определить доменное имя удаленной стороны, чтобы его можно было использовать в сертификате перехвата. Для этого mitmproxy использует перехват сертификатов на стороне upstream. Инструмент также извлекает общее имя (CN) из сертификата upstream и альтернативные имена субъекта (SAN). Он также умело обходит передачу указания имени сервера (SNI).
Для HTTPS-соединений с промежуточным mitmproxy происходят следующие процессы:
- Клиент устанавливает соединение с mitmproxy и формирует HTTP-запрос CONNECT.
- Mitmproxy отвечает сообщением «200 Connection Established», имитируя открытие CONNECT-pipe.
- Клиент открывает SSL/TLS-соединение, предполагая, что он общается с нужным сервером. При этом он указывает SNI для имени хоста.
- Mitmproxy открывает соединение с сервером и устанавливает безопасное соединение с именем хоста SNI, указанным клиентом.
- Целевая система отвечает сертификатом, содержащим значения CN и SAN, необходимые для создания перехватывающего сертификата.
- Mitmproxy генерирует сертификат перехвата и продолжает прерванное на шаге 3 SSL/TLS-соединение клиента.
- Клиент отправляет запрос через открытую связь.
- Mitmproxy пересылает запрос на сервер через соединение, инициированное на шаге 4.
Эта упрощённая последовательность процессов демонстрирует сложность действий, выполняемых mitmproxy, только для того, чтобы проникнуть между клиентом и сервером.
Начало работы
Mitmproxy доступен для Linux, macOS и Windows. Отдельные бинарные файлы доступны для Windows и Linux, а пакеты, специфичные для дистрибутива, доступны для различных Linux-дистрибутивов (например, Arch, Debian, Ubuntu и Kali). После установки на Windows mitmproxy, mitmdump и mitmweb добавляются в PATH и могут вызываться из командной строки. В принципе, пакеты для Linux также будут работать в Windows Subsystem for Linux (WSL).
Если вы предпочитаете использовать контейнер Docker, используйте следующую команду для запуска терминального интерфейса mitmproxy:
docker run --rm -it -v ~/.mitmproxy:/home/mitmproxy/.mitmproxy -p 8080:8080 mitmproxy/mitmproxy
Чтобы убедиться, что веб-трафик клиента проходит через mitmproxy, необходимо изменить глобальные настройки при локальной установке программного обеспечения и указать адрес прокси-сервера 127.0.0.1:8080. Также можно использовать файл автоматической настройки прокси (PAC), чтобы упростить глобальную сетевую конфигурацию; необходимые файлы доступны в сети.
Если вы попытаетесь получить доступ к Интернету через веб-браузер после настройки прокси, попытка будет неудачной. Ваш браузер покажет сообщение об ошибке «Ваше соединение не является приватным». Причина проста: браузер не считает промежуточный прокси надежным, так как считает сертификат mitmproxy недействительным. После активации прокси-сервера вы сможете получить необходимый сертификат на веб-сайте mitm.it. Там доступны действительные сертификаты для всех поддерживаемых платформ. В Windows используйте мастер импорта для установки сертификата. В Linux самый простой способ импортировать сертификат — с помощью команды:
sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain mitmproxy-ca-cert.pem
Инструкции по установке доступны в интернете для всех остальных платформ. Затем вы можете просмотреть и, при необходимости, отредактировать сведения в диспетчере сертификатов выбранной вами операционной системы.
Веб-GUI
Теперь вы можете отслеживать точные HTTP-команды в консоли mitmproxy, но их анализ не особенно удобен для пользователя. В этом может помочь веб-интерфейс mitmproxy, который по умолчанию доступен по адресу http://127.0.0.1:8081. В веб-интерфейсе mitmproxy отображает историю обмена HTTP-командами. Чтобы установить необходимый сертификат на клиентской системе, перейдите в Файл | Установить сертификаты.
Вкладка «Параметры» предлагает различные варианты настройки веб-интерфейса, которые в основном связаны с отображением, но вы также можете работать со списками блокировок и добавлять пустой ответ для конкретных запросов. Mitmproxy поддерживает следующие режимы кроме обычного режима по умолчанию:
- Прозрачный
- WireGuard
- Обратный прокси
- Верхнеуровневый прокси
- Прокси SOCKS
- DNS-сервер
Выбор режима зависит от того, хотите ли вы отслеживать трафик от клиента или от одного сервера. Если вы хотите изучить трафик, поступающий на ваш собственный веб-сервер из Интернета, необходимо включить вариант Reverse Proxy. В этом случае mitmproxy действует как «обычный» сервер, который обрабатывает запросы из Интернета или от анализирующего клиента и передает их на целевую систему.
Чтобы упростить поиск нужного, переключитесь на вкладку «Пуск» и введите поисковый запрос, что является хорошим способом ограничить отображение определёнными источниками, сервисами или типами файлов. Преимущество этого заключается в том, что если веб-интерфейс открыт и вы обращаетесь к серверу во втором окне браузера, вы можете отслеживать команды в mitmproxy в реальном времени.
Отдельные запросы и ответы можно просматривать как на уровне консоли, так и в веб-интерфейсе, но веб-интерфейс значительно удобнее. Вы можете воспроизводить зафиксированные обмены или выбрать «Редактировать», чтобы изменить запросы и затем отправить их на целевой сервер. На уровне консоли легко применять фильтры, перехватывать трафик и сохранять разметку локально.
Учитывая огромные объёмы данных, которые поставляет mitmproxy, не всегда легко отслеживать интересующее вас содержимое, и здесь на помощь приходит функция Подсветка. Нажатие на кнопку Подсветка открывает меню выбора, где вы можете выделять конкретное содержимое. Вы можете ограничить выбор методами или типами содержимого или даже использовать регулярное выражение.
Продвинутые методы анализа
Одной из специальных особенностей MITMProxy является функция перехвата, которая позволяет перехватывать и манипулировать запросами. Перехват обычно нежелательно, потому что это ухудшает опыт просмотра. Чтобы не допустить обмена данными, MITMProxy использует другой подход и выборочно перехватывает запросы. Вы можете настроить это в веб -графическом интерфейсе или на консоли с помощью фильтра потока ~ u , и вы можете использовать опцию ~ Q, чтобы избежать перехвата ответов. Ampersand (&) позволяет объединить несколько параметров фильтра.
Как только вы прервали запрос, следующим шагом будет его изменение в соответствии с вашими потребностями. Если вы работаете с веб-интерфейсом, сначала включите режим редактирования и выберите запись с запросом, который вы хотите изменить (например, вы можете изменить параметр Path или user-agent).
Если вы хотите внести изменения на уровне консоли, нажмите E, чтобы включить режим редактирования; в веб-интерфейсе откройте вкладку «Запрос» и перейдите к записи, которая вас интересует. Внесите изменения и выйдите из режима редактирования. Чтобы возобновить прерванный поток данных, нажмите кнопку A на консоли или кликните «Возобновить» в интерфейсе GUI.
Еще одной особенностью mitmproxy является то, что вы можете многократно воспроизводить предыдущие потоки данных. Инструмент поддерживает два типа запросов на воспроизведение:
- Повтор на стороне клиента повторно отправляет предыдущие запросы клиента на сервер.
- Серверная повторная воспроизведение воспроизводит ответы сервера на ранее записанные запросы.
Вы можете использовать оба варианта как в консоли, так и в веб-интерфейсе. Чтобы начать, выберите нужные запросы с помощью выражений фильтра. Чтобы повторить их, нажмите клавишу r в консоли или нажмите «Повторить» в графическом интерфейсе. Здесь вы также можете изменить запрос.
Благодаря своей модульной архитектуре, вы можете расширять функциональность mitmproxy и использовать разработки активного сообщества. Таблица 1 содержит обзор наиболее интересных расширений. Например, скрипт log-events.py работает на уровне консоли и генерирует предупреждения.
| Сценарий | Описание |
|---|---|
| log-events.py | Записывайте сообщения в журнал событий mitmproxy. |
| http-add-header.py | Добавьте HTTP-заголовок к каждому ответу. |
| Интернет-in-mirror.py | Создайте зеркала всех веб-сайтов. |
| simple-commands.py | Добавьте пользовательскую команду в командную строку. |
| shutdown.py | Закройте и завершите работу экземпляра mitmproxy. |
| duplicate-change-repeat.py | Принимать входящие HTTP-запросы и воспроизводить их с изменёнными параметрами. |
| tcp-simple.py | Обрабатывать отдельные сообщения из TCP-соединения. |
| websocket-injectmessage.py | Вставьте сообщение WebSocket в открытую связь. |
Исключая домены
При анализе трафика может иметь смысл игнорировать определённые домены по двум основным причинам. Во-первых, часть трафика может быть защищена с помощью закрепления сертификатов, а во-вторых, часть трафика может просто выходить за рамки вашего интереса.
В первом случае, например, обновления Windows или доступ к App Store от Apple не будут работать, если вы настроили mitmproxy посередине. Если какой-то контент не имеет для вас значения, просто скройте его с помощью опции view_filter.
Чтобы исключить хосты из мониторинга, используйте опцию ignore_hosts и укажите её с помощью регулярного выражения в формате строки host:port. Алиас командной строки — —ignore-hosts regex, а полная команда выглядит так:
mitmproxy -ignore-hosts '^example.de:443$'
Если вы хотите ограничить запись конкретными доменами, используйте параметр —allow-hosts.
Еще одной отличительной чертой mitmproxy является то, что среда имеет модульную архитектуру, и вы можете расширять набор функций с помощью скриптов на Python. Большая часть существующих функций уже основана на интегрированных дополнениях. Структура и дизайн этих скриптов настолько просты, что их легко адаптировать или разрабатывать собственные скрипты. В настоящее время для скачивания с сайта проекта на GitHub доступно почти 30 скриптов.
Часто задаваемые вопросы
1. Как исправить ошибки SSL/TLS сертификата с помощью mitmproxy?
Ошибки сертификата обычно возникают, когда клиент не доверяет сгенерированному mitmproxy сертификату. Чтобы решить эту проблему:
- Установите сертификат ЦС: Перейдите на
http://mitm.itв вашем браузере после запуска mitmproxy, чтобы скачать подходящий сертификат для вашей платформы - Для Windows: Используйте мастер импорта сертификатов или запустите
certmgr.msc, чтобы установить сертификат в хранилище «Доверенные корневые центры сертификации» - Для Linux/macOS: Используйте команду
sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain mitmproxy-ca-cert.pem - Для мобильных устройств: Установите сертификат через настройки устройства и включите «Полное доверие» для корневых сертификатов
- Настройка браузера: Убедитесь, что ваш браузер настроен на использование прокси по адресу
127.0.0.1:8080
Вы можете узнать больше о ошибках сертификатов SSL/TLS и проверке сертификатов SSL/TLS в нашем руководстве.
2. В чем разница между mitmproxy, Burp Suite и Charles Proxy?
Вот сравнение mitmproxy, Burp Suite и Charles Proxy, которое поможет вам выбрать подходящий инструмент для ваших нужд:
| Функция/Инструмент | Mitmproxy | Burp Suite | Charles Proxy |
|---|---|---|---|
| Тип | Открытый исходный код, ориентированный на командную строку | Коммерческий, ориентированный на GUI | Коммерческий, удобный для пользователя графический интерфейс |
| Ценообразование | Бесплатный и с открытым исходным кодом | Бесплатное сообщественное издание, Профессиональное ($399/год) | Бесплатная пробная версия, 50-99 долларов в год |
| Интерфейс | Командная строка (mitmproxy), Веб-интерфейс (mitmweb), Скриптируемый (mitmdump) |
Настольный графический интерфейс с расширенными возможностями | Настольный интерфейс с интуитивно понятным дизайном |
| Поддержка HTTPS/SSL | Полная перехват SSL/TLS с автоматически создаваемыми сертификатами | Продвинутая работа с SSL/TLS с управлением сертификатами | Отличная поддержка SSL/TLS с простой установкой сертификатов |
| Мобильное тестирование | Хорошая поддержка с ручной настройкой | Отличные возможности тестирования мобильных приложений | Выдающееся мобильное тестирование с простой настройкой устройства |
| Повтор трафика | Продвинутая запись с фильтрацией и модификацией | Комплексный повтор с автоматическим тестированием | Базовая функция повтора |
| Скриптинг | Скриптинг на Python с расширенным API | Расширения и макросы Java/Python | Ограниченные возможности скриптинга |
| Сканирование на уязвимости | Нет встроенного сканирования | Продвинутое автоматизированное сканирование уязвимостей | Нет встроенного сканирования |
| Тестирование API | Отлично подходит для отладки и тестирования API | Комплексное тестирование безопасности API | Хорошо для отладки и мониторинга API |
| Кривая обучения | Средний уровень (опыт работы с командной строкой приветствуется) | Крутой (много расширенных функций) | Простой (интуитивно понятный интерфейс) |
| Лучшее для | Разработчики, автоматизация, энтузиасты командной строки | Специалисты по безопасности, тестировщики на проникновение | Команды QA, разработчики, тестировщики мобильных приложений |
3. Как перехватывать HTTPS-трафик с помощью mitmproxy?
Для перехвата HTTPS-трафика:
- Запустите mitmproxy: Запустите
mitmproxyилиmitmwebна вашей системе - Настройка прокси: Установите для вашего браузера или приложения использование
127.0.0.1:8080в качестве HTTP/HTTPS прокси - Установите сертификаты: Скачайте и установите сертификат CA mitmproxy с
http://mitm.it - Доверяйте сертификату: Убедитесь, что сертификат доверен вашей системой и браузером
- Безопасный просмотр: Весь HTTPS-трафик теперь будет перехватываться и отображаться в mitmproxy
Инструмент автоматически выполняет дешифрование и повторное шифрование SSL/TLS, позволяя просматривать зашифрованный трафик в открытом виде.
4. Могу ли я использовать mitmproxy для тестирования мобильных приложений?
Да, mitmproxy отлично подходит для тестирования мобильных приложений:
- Подключите устройства: Убедитесь, что ваше мобильное устройство и компьютер находятся в одной сети
- Настройка мобильного прокси: Установите прокси на устройстве на IP-адрес вашего компьютера и порт 8080
- Установите мобильный сертификат: Скачайте сертификат с
http://mitm.itна ваше мобильное устройство - Доверяйте сертификату: Установите и доверьтесь сертификату в настройках безопасности вашего устройства
- Тестирование приложений: Запускайте свои мобильные приложения и отслеживайте их HTTP/HTTPS-трафик с помощью mitmproxy
Это особенно полезно для отладки вызовов API, анализа поведения приложения и тестирования функций безопасности.
5. Как фильтровать и искать трафик в mitmproxy?
Mitmproxy предоставляет мощные возможности фильтрации:
Фильтрация через командную строку:
~ u regex— фильтр по URL~ Q— показывать только запросы (не ответы)~ s— показывать только ответы (не запросы)~ m get— фильтр по методу http~ d domain.com— Фильтр по домену
Полные команды фильтрации:
# Start mitmproxy with specific filters mitmproxy --set view_filter="~u example.com" mitmproxy --set view_filter="~m POST" mitmproxy --set view_filter="~d api.github.com" # Filter by status codes mitmproxy --set view_filter="~s 404" mitmproxy --set view_filter="~s 200" # Filter by content type mitmproxy --set view_filter="~t application/json" mitmproxy --set view_filter="~t text/html" # Filter by request body content mitmproxy --set view_filter="~b login" mitmproxy --set view_filter="~b password" # Filter by response body content mitmproxy --set view_filter="~B error" mitmproxy --set view_filter="~B success" # Filter by header content mitmproxy --set view_filter="~h User-Agent" mitmproxy --set view_filter="~h Authorization" # Filter by HTTP version mitmproxy --set view_filter="~v HTTP/2" mitmproxy --set view_filter="~v HTTP/1.1"
Интерактивная фильтрация (в консоли mitmproxy):
# Start mitmproxy mitmproxy # Then use these commands in the console: ~u example.com # Show only URLs containing "example.com" ~m POST # Show only POST requests ~d api.github.com # Show only requests to api.github.com ~s 200 # Show only responses with status 200 ~t application/json # Show only JSON responses ~b login # Show requests with "login" in body ~B error # Show responses with "error" in body ~h Authorization # Show requests with Authorization header ~v HTTP/2 # Show only HTTP/2 requests
Фильтрация через веб-интерфейс:
- Используйте поле поиска в веб-интерфейсе, чтобы фильтровать по URL, методу или содержимому
- Нажмите «Выделить», чтобы выделить определённые типы содержимого или использовать регулярные выражения
- Используйте вкладку «Пуск», чтобы вводить поисковые термины и ограничивать отображение
Комбинирование фильтров:
# Multiple conditions with AND (&) mitmproxy --set view_filter="~u example.com & ~m POST" mitmproxy --set view_filter="~d api.github.com & ~s 200" mitmproxy --set view_filter="~t application/json & ~B success" # OR operations (|) mitmproxy --set view_filter="~u api & ~m POST | ~m PUT" mitmproxy --set view_filter="~s 200 | ~s 201 | ~s 204" # Complex combinations mitmproxy --set view_filter="(~u login | ~u auth) & ~m POST" mitmproxy --set view_filter="~d example.com & (~s 200 | ~s 404)"
Примеры расширенной фильтрации:
# Filter for specific API endpoints mitmproxy --set view_filter="~u /api/v1/ & ~m POST" # Filter for error responses mitmproxy --set view_filter="~s 4.. | ~s 5.." # Filter for specific user agents mitmproxy --set view_filter="~h 'Mozilla/5.0'" # Filter for requests with specific headers mitmproxy --set view_filter="~h 'Content-Type: application/json'" # Filter for large responses mitmproxy --set view_filter="~B .{1000,}" # Filter for specific file types mitmproxy --set view_filter="~u \.(js|css|png|jpg)$"
Заключение
Mitmproxy — это захватывающий инструмент для записи, анализа и манипулирования HTTP-трафиком. Благодаря своей специфической направленности, HTTP-прокси отлично подходит для проверки веб-запросов и ответов, что делает его ценным инструментом не только для администраторов, но и для разработчиков и специалистов по тестированию на проникновение.
Этот материал основан на статье от ADMIN и доступен вам благодаря сотрудничеству с Linux-Console.net.
Спасибо, что учитесь вместе с сообществом Linux-Console.net.





Добавить комментарий