Перехват трафика в один клик

Функция MITM-перехвата в один клик позволяет полностью автоматически включить глобальный MITM-перехват на устройстве. По сравнению с другими распространенными инструментами вам не нужно беспокоиться об установке MITM-сертификата и настройке прокси, а также не нужно переживать из-за различий в методах перехвата в зависимости от версии системы. Она совместима с разными версиями Android, мы уже всё сделали за вас, кроме того, поддерживаются изменение пакетов в реальном времени и перехват.

Кроме того, вероятность успешного перехвата выше, чем у обычного ПО. Вы можете перехватывать HTTP/HTTPS-трафик приложений. Скрипт умеет автоматически включать и отключать MITM-перехват; после выхода из скрипта устройство и сеть сразу возвращаются в исходное состояние, никаких дополнительных настроек не требуется. Скрипт также поддерживает международный MITM-перехват: можно указать вышестоящий прокси, чтобы легко перехватывать трафик зарубежных приложений.

Внимание

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

Подготовка

Сначала убедитесь, что компьютер и устройство находятся в одной подсети или подключены по USB. Далее предполагается, что IP-адрес телефона с FIRERPA равен 192.168.0.2. Также убедитесь, что вы правильно выполнили подготовку инструментов на ПК и проверили в командной строке, что mitmproxy установлен (можно выполнить mitmdump для проверки).

Если у вас нет окружения Python и вы не знакомы с клонированием и управлением зависимостями, вы можете скачать startmitm.exe на странице релизов. Это упакованная версия startmitm.py, которая позволяет выполнять перехват без установки Python. Это консольная программа, параметры командной строки у неё такие же, как у startmitm.py (файл может ложно срабатывать у антивируса — решайте сами, использовать его или нет).

Базовый перехват

Подсказка

У перехватываемого приложения может использоваться SSL PINNING (закрепление сертификата) или протокол QUIC; оба случая могут повлиять на результат перехвата. Мы автоматически принудительно понижаем QUIC, но из-за времени возврата к рукопожатию приложение может ненадолго подтормаживать — немного подождите. Если приложение использует закрепление сертификата, напрямую перехватить трафик не получится: потребуется обратная разработка и написание Frida-скрипта для обхода логики SSL PINNING.

Быстро начать перехват можно следующей командой:

python3 -u startmitm.py 192.168.0.2

Чтобы выйти из перехвата, достаточно один раз нажать Ctrl+C.

Совместный перехват

Если вы хотите анализировать трафик вместе с коллегами в локальной сети, выполните следующую команду, затем попросите их открыть в браузере http://ваш_IP:7890 — они увидят тот же интерфейс перехвата, что и у вас, и смогут совместно анализировать трафик.

python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0

Конкретное приложение

Если нужно перехватывать трафик только конкретного приложения, а не весь системный трафик, добавьте :имя_пакета после IP-адреса. В примере ниже перехватывается только трафик com.some.package.

python3 -u startmitm.py 192.168.0.2:com.some.package

Изменение в реальном времени

Вы можете в реальном времени изменять данные запросов и ответов приложения. Эта возможность основана на перехватчиках событий mitmproxy. Вам нужно самостоятельно написать скрипт-обработчик в соответствии с API mitmproxy. О том, как писать такие скрипты, смотрите официальную документацию mitmproxy docs.mitmproxy.org/stable/addons-examples и примеры кода mitmproxy/examples/contrib.

Предположим, ваш скрипт-обработчик называется http_flow_hook.py. Примените его следующей командой:

python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py

Другая сеть

Если телефон и компьютер находятся в разных сетях, но у вас есть физический доступ к устройству, можно выполнять перехват через USB ADB. Убедитесь, что устройство подключено по USB ADB к компьютеру и правильно авторизовано.

Если к компьютеру подключено только одно ADB-устройство, выполните следующую команду: localhost означает перехват для этого ADB-устройства.

python3 -u startmitm.py localhost

Если подключено несколько ADB-устройств, необходимо указать серийный номер устройства. Его можно получить из вывода adb devices.

python3 -u startmitm.py localhost --serial bfde362

Если сетевое окружение ещё более ограниченное — например, телефон и компьютер не находятся в одной сети и нет физического доступа, — но есть доступ к порту FIRERPA, перехват всё равно возможен. Частый сценарий: FIRERPA проброшен через встроенный frp на удалённый сервер, при этом между вами и FIRERPA напрямую доступен только один порт, остальные порты не маршрутизируются. Телефон не может обращаться к локальным портам вашего компьютера, а компьютер может обращаться только к порту FIRERPA на телефоне. В такой ситуации используйте следующий способ.

Сначала с помощью adb_pubkey.py или через вызов API установите публичный ключ ADB вашего компьютера на устройство. После установки выполните connect, где x.x.x.x — IP-адрес, по которому доступен порт 65000 устройства; при необходимости измените его под фактическую ситуацию.

adb connect x.x.x.x:65000

Затем выполните следующую команду:

python3 -u startmitm.py localhost

Если ADB-устройств несколько, можно также поступить так: здесь параметр --serial — это адрес ADB connect (например, x.x.x.x:65000), а не серийный номер устройства.

python3 -u startmitm.py localhost --serial x.x.x.x:65000

Вышестоящий прокси / международный перехват

startmitm сам запускает mitmproxy как прокси-сервер, и по умолчанию весь трафик отправляется mitmproxy через сетевой интерфейс локального компьютера. Если вы хотите, чтобы трафик шёл через вышестоящий прокси, а не напрямую с локального компьютера, можно указать вышестоящий прокси, но поддерживаются только вышестоящие прокси по протоколу HTTP. Также необходимо указать вышестоящий DNS, поддерживающий запросы по TCP, чтобы избежать DNS-отравления.

python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --proxy-dns 8.8.8.8

Если вышестоящий HTTP-прокси требует аутентификации, замените USER:PASSWORD в формате ниже.

python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --proxy-dns 8.8.8.8

Таким образом, трафик устройства будет отправляться через вышестоящий прокси, а все DNS-запросы устройства будут отправляться через прокси на 8.8.8.8.