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

Функция перехвата пакетов "человек-по-середине" (MITM) в один клик позволяет полностью автоматически включить глобальный MITM на устройстве. **Отличие от часто используемых вами инструментов** заключается в том, что вам не нужно беспокоиться о таких проблемах, как **установка сертификата** и **настройка прокси**, а также о различиях в методах перехвата для разных версий системы. Эта функция бесшовно работает на Android 6.0 - 14. Мы уже обо всем позаботились, вам нужно сосредоточиться только на конкретных задачах.
Кроме того, поддерживается изменение и перехват пакетов в реальном времени, что делает этот инструмент более подходящим для реальных рабочих задач, а не просто для того, чтобы "посмотреть, что там в пакетах", по сравнению с обычными программами с графическим интерфейсом.

Помимо этого, мы можем гарантировать, что **нет пакетов, которые нельзя перехватить** (за исключением случаев с привязкой сертификата), а успешность перехвата также выше, чем у обычных программных методов. Вы можете перехватывать http/s трафик приложений. Скрипт автоматически применяет и отменяет MITM-атаку, и после его завершения устройство и сеть вернутся в исходное состояние. Вам не нужно делать никаких дополнительных настроек. Скрипт также поддерживает **международный** перехват пакетов (реализованный через вышестоящий прокси), что позволяет легко перехватывать трафик зарубежных приложений.

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

## Предварительная подготовка

Во-первых, убедитесь, что ваш компьютер и устройство находятся в одной подсети или подключены по USB. Далее мы будем предполагать, что 192.168.0.2 — это IP-адрес мобильного устройства, на котором запущен FIRERPA. Во-вторых, убедитесь, что вы успешно клонировали код проекта и установили все необходимые зависимости. Проверьте в командной строке, что mitmproxy успешно установлен (можно проверить, введя `mitmdump` в командной строке).

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

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

```{hint}
Приложение, пакеты которого вы перехватываете, может использовать SSL PINNING (привязку сертификата) или протокол QUIC. Оба этих случая могут повлиять на результат перехвата. Мы автоматически принудительно понижаем версию QUIC, но из-за возможного времени отката (Fallback) приложение может работать с очень медленной сетью, пожалуйста, подождите немного. Приложения с привязкой сертификата не могут быть перехвачены напрямую, вам потребуется написать скрипт Frida для обхода логики SSL PINNING.
```

Вы можете быстро начать перехват пакетов с помощью следующей команды, это самый простой способ использования.

```bash
python3 -u startmitm.py 192.168.0.2
```

```{important}
**Обязательно помните, что после выполнения команды startmitm необходимо полностью закрыть и заново открыть приложение, пакеты которого вы хотите перехватить. Закрытие приложения из панели задач — ненадежный способ. Пожалуйста, используйте API для закрытия или самостоятельно выполните команду `kill -9` для всех PID, связанных с приложением, иначе перехват не будет работать корректно.**
```

Нажмите комбинацию клавиш `CONTROL` + `C` один раз, чтобы выйти из режима перехвата. Пожалуйста, не нажимайте ее несколько раз подряд.

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

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

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

## Перехват для конкретного приложения

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

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

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

Вы можете изменять данные запросов и ответов приложения в реальном времени. Эта функция основана на хуках событий mitmproxy. Вам нужно самостоятельно написать скрипт-хук, используя соответствующий API mitmproxy. Информацию о том, как писать скрипты-хуки, можно найти в официальной документации mitmproxy [docs.mitmproxy.org/stable/addons-examples](https://docs.mitmproxy.org/stable/addons-examples/) и в примерах кода [mitmproxy/examples/contrib](https://github.com/mitmproxy/mitmproxy/tree/9.0.0/examples/contrib).

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

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

## Разные сети

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


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

```bash
python3 -u startmitm.py localhost
```

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

```bash
python3 -u startmitm.py localhost --serial bfde362
```

Если у вас более сложные условия, например, телефон и компьютер не находятся в одной сети и нет физического доступа к устройству, но вы можете получить доступ к порту FIRERPA, вы все равно можете выполнить MITM-атаку. Такая ситуация обычно возникает, когда вы используете встроенный сервис frp для перенаправления FIRERPA на удаленный сервер, или вы самостоятельно перенаправили порт 65000 FIRERPA в другое место. В этом случае вы и FIRERPA можете общаться только через этот один порт, а другие порты недоступны для взаимного доступа. В этой ситуации телефон не может получить доступ ни к одному порту на вашем компьютере, а ваш компьютер может получить доступ только к порту FIRERPA на телефоне (или у телефона есть публичный IP, но ваш компьютер находится во внутренней сети). В этом случае необходимо действовать следующим образом. (Взаимодействие сетей через OpenVPN не относится к вышеописанным случаям).

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

```bash
adb connect x.x.x.x:65000
```

Наконец, действуйте так же, как описано выше, выполняя перехват через USB.

```bash
python3 -u startmitm.py localhost
```

Или так, как показано ниже. Здесь `serial` — это адрес из `adb connect`, а не шестнадцатеричный серийный номер.

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

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

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

```{tip}
Режим вышестоящего прокси требует mitmproxy версии >= 9.0.0 (и Python >= 3.9).
```

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

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

```bash
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 через этот прокси.