Mitmproxy — это открытый инструмент для перехвата, анализа, модификации и воспроизведения HTTP и HTTPS трафика, работающий как прокси-сервер.
Mitmproxy предоставляет комплексное решение для разработчиков, тестировщиков и специалистов по безопасности, позволяя им инспектировать сетевые взаимодействия между клиентом и сервером. Он функционирует как "человек посередине" (Man-in-the-Middle) для SSL/TLS соединений, дешифруя трафик на лету.
Компоненты mitmproxy
Пакет mitmproxy состоит из трех основных инструментов:
* mitmproxy: Интерактивный терминальный интерфейс для перехвата и анализа трафика. Предназначен для работы в консоли.
* mitmweb: Веб-интерфейс, предоставляющий графическое представление перехваченного трафика. Удобен для визуального анализа.
* mitmdump: Неинтерактивный инструмент командной строки, предназначенный для автоматизации и скриптования. Позволяет применять скрипты Python для модификации или анализа трафика без ручного вмешательства.
Установка mitmproxy
Установка mitmproxy обычно осуществляется через менеджер пакетов Python pip.
pip install mitmproxy
Для некоторых операционных систем могут потребоваться дополнительные зависимости или специфические шаги. Например, для macOS можно использовать Homebrew:
brew install mitmproxy
Режимы работы mitmproxy
Mitmproxy поддерживает несколько режимов работы, определяющих, как клиенты направляют на него трафик.
Обычный прокси (Regular Proxy)
В этом режиме клиент явно настраивается на использование mitmproxy как HTTP/S прокси. Это наиболее распространенный способ использования для браузеров и приложений, поддерживающих настройку прокси.
Пример запуска:
mitmproxy
# или
mitmweb
По умолчанию mitmproxy слушает порт 8080. Клиент должен быть настроен на использование localhost:8080 (или IP-адреса сервера mitmproxy) в качестве прокси.
Прозрачный прокси (Transparent Proxy)
В режиме прозрачного прокси клиенту не требуется явная настройка. Сетевой трафик перенаправляется на mitmproxy на уровне маршрутизатора или брандмауэра. Это полезно для анализа трафика мобильных устройств, IoT-устройств или приложений, которые не поддерживают настройку прокси.
Для настройки прозрачного прокси требуется конфигурация правил маршрутизации или NAT на хосте, где запущен mitmproxy.
Пример настройки для Linux (iptables):
# Включить IP-форвардинг
sysctl -w net.ipv4.ip_forward=1
# Перенаправить HTTP (порт 80) трафик на порт mitmproxy (8080)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
# Перенаправить HTTPS (порт 443) трафик на порт mitmproxy (8080)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
# Запустить mitmproxy в прозрачном режиме
mitmproxy --mode transparent
# или
mitmweb --mode transparent
eth0 — это сетевой интерфейс, через который проходит трафик.
SOCKS Proxy
Mitmproxy также может работать как SOCKS5 прокси. Этот режим полезен для приложений, которые поддерживают SOCKS, но не HTTP/S прокси.
mitmproxy --mode socks5
# или
mitmweb --mode socks5
Настройка SSL/TLS перехвата
Для перехвата HTTPS трафика mitmproxy действует как "человек посередине", генерируя на лету поддельные SSL-сертификаты для каждого домена. Чтобы избежать ошибок безопасности в клиентах (например, "Недоверенный сертификат"), необходимо установить корневой сертификат mitmproxy в хранилище доверенных сертификатов клиента.
Процесс установки корневого сертификата:
1. Запустите mitmproxy в любом режиме (например, mitmweb).
2. На клиенте, трафик которого вы хотите перехватывать, настройте прокси на mitmproxy (если это обычный режим).
3. Откройте в браузере клиента адрес http://mitm.it/.
4. На этой странице будут доступны ссылки для скачивания и установки корневого сертификата mitmproxy для различных операционных систем и устройств. Выберите соответствующий вариант и следуйте инструкциям.
После установки сертификата клиент будет доверять сертификатам, генерируемым mitmproxy, и HTTPS трафик будет прозрачно дешифроваться и отображаться в инструменте.
Использование mitmproxy (интерактивный режим)
При запуске mitmproxy или mitmweb открывается интерфейс, отображающий список перехваченных HTTP-потоков (Flows). Каждый поток включает запрос (Request) и ответ (Response).
Основные функции и навигация:
- Просмотр потоков: В главном окне отображается список потоков. Клавиши со стрелками используются для навигации.
- Детализация потока: Нажатие
Enterна выбранном потоке открывает детали запроса и ответа. Здесь можно просмотреть заголовки, тело, cookie и другую информацию. - Фильтрация: Нажатие
fпозволяет ввести фильтр для отображения только релевантных потоков. Синтаксис фильтров мощный и поддерживает регулярные выражения. - Модификация и повтор (Replay):
e(edit): Открыть редактор для изменения запроса или ответа перед его отправкой или сохранением.r(replay): Повторить выбранный запрос. Это полезно для тестирования изменений или воспроизведения сценариев.R(replay response): Повторить ответ.
- Сохранение и загрузка:
s(save): Сохранить выбранные потоки в файл.L(load): Загрузить потоки из файла.
- Перехват (Intercept): Нажатие
iпозволяет установить правила перехвата. Потоки, соответствующие правилам, будут приостановлены, ожидая ручной модификации или продолжения.
Использование mitmdump (скриптовый режим)
mitmdump позволяет автоматизировать задачи анализа и модификации трафика с помощью скриптов Python. Скрипты могут перехватывать события (например, request, response, error) и программно взаимодействовать с объектами Flow, Request и Response.
Пример скрипта для mitmdump
Создайте файл my_script.py:
from mitmproxy import http
from mitmproxy import ctx
def request(flow: http.HTTPFlow):
"""
Вызывается для каждого запроса.
"""
# Изменить User-Agent для всех запросов
if "User-Agent" in flow.request.headers:
flow.request.headers["User-Agent"] = "Custom-Mitmproxy-Agent/1.0 (Python Script)"
# Блокировать запросы к определенному домену
if "example.com" in flow.request.pretty_host:
flow.response = http.Response.make(
403, b"Blocked by mitmproxy script",
{"Content-Type": "text/plain"}
)
ctx.log.info(f"Blocked request to {flow.request.pretty_url}")
def response(flow: http.HTTPFlow):
"""
Вызывается для каждого ответа.
"""
# Модифицировать HTML-тело ответа
if flow.response and "content-type" in flow.response.headers and "text/html" in flow.response.headers["content-type"]:
if flow.response.content:
try:
# Декодируем, модифицируем, кодируем обратно
content = flow.response.content.decode('utf-8', errors='ignore')
modified_content = content.replace("</body>", "<p>Injected by mitmproxy script!</p></body>")
flow.response.content = modified_content.encode('utf-8')
ctx.log.info(f"Injected content into {flow.request.pretty_url}")
except UnicodeDecodeError:
ctx.log.warn(f"Could not decode content for {flow.request.pretty_url}")
def http_connect(flow: http.HTTPFlow):
"""
Вызывается при установке HTTPS CONNECT туннеля.
"""
ctx.log.info(f"CONNECT to {flow.request.pretty_url}")
Запуск mitmdump со скриптом:
mitmdump -s my_script.py
Все проходящие запросы и ответы будут обрабатываться в соответствии с логикой, определенной в my_script.py.
Фильтрация трафика
Mitmproxy предлагает мощный механизм фильтрации, позволяющий сосредоточиться на конкретных потоках. Фильтры можно применять как в интерактивном режиме (mitmproxy, mitmweb) через команду f, так и при запуске mitmdump с опцией -f.
Синтаксис фильтров:
Фильтры представляют собой выражения, которые могут включать регулярные выражения и специальные ключевые слова:
~q: Фильтр по запросу.~s: Фильтр по ответу.~h <header>: Фильтр по заголовку.~b <body_regex>: Фильтр по телу запроса или ответа.~m <method>: Фильтр по HTTP-методу.~d <domain>: Фильтр по домену.~u <url_regex>: Фильтр по URL.~c <code>: Фильтр по статусному коду ответа.
Примеры использования фильтров:
* mitmproxy -f "google.com": Отобразить трафик только для домена google.com.
* mitmproxy -f "~q GET": Отобразить только запросы с методом GET.
* mitmproxy -f "~s ~c 200": Отобразить ответы со статусным кодом 200 OK.
* mitmproxy -f "~u api/v1": Отобразить запросы, содержащие api/v1 в URL.
* mitmdump -f "~b json": Запустить mitmdump, обрабатывая только потоки, тело которых содержит "json".
* mitmweb -f "~q ~m POST ~u /login": Отобразить только POST-запросы к URL, содержащим /login.
Фильтры можно комбинировать, используя пробелы в качестве логического И. Например: ~q ~m POST ~u /api
Продвинутые возможности
Map Local / Map Remote
Mitmproxy позволяет перенаправлять запросы на локальные файлы или другие удаленные серверы. Это полезно для тестирования изменений без развертывания на реальном сервере.
Map Local (перенаправление на локальный файл):
mitmproxy --map-local "/api/data=./local_data.json"
Запросы к /api/data будут получать содержимое из local_data.json.
Map Remote (перенаправление на другой удаленный сервер):
mitmproxy --map-remote "example.com=new-example.com"
Запросы, предназначенные для example.com, будут перенаправляться на new-example.com.
Addons (Дополнения)
Mitmproxy имеет модульную архитектуру, позволяющую создавать собственные дополнения (addons) на Python. Дополнения могут реализовывать сложную логику, такую как запись трафика в базу данных, интеграция с другими инструментами или выполнение пользовательских проверок безопасности. Скрипты, используемые с mitmdump, по сути, являются простыми дополнениями.
Сравнение mitmproxy с аналогами
| Инструмент | Тип интерфейса | Лицензия/Цена | Основные ОС | Основное применение |
|---|---|---|---|---|
| mitmproxy | CLI (mitmproxy), Web (mitmweb) |
Open Source | Cross-platform | Анализ, модификация, автоматизация, скриптование |
| Fiddler | GUI | Freeware / Commercial | Windows | Отладка HTTP/S трафика, веб-разработка |
| Burp Suite | GUI | Freeware / Commercial | Cross-platform | Тестирование безопасности веб-приложений |
| Charles Proxy | GUI | Commercial | Cross-platform | Отладка HTTP/S трафика, мобильная разработка |
Mitmproxy выделяется своей гибкостью, открытым исходным кодом и мощными возможностями скриптования, что делает его предпочтительным выбором для автоматизированных задач и интеграции в CI/CD процессы.