Mitmproxy


Начало работы

Использование

Опция Пример Описание
-p mitmproxy -p 8001 Запустить прокси на порту 8001
-m mitmproxy -p 8001 -m reverse:http://127.0.0.1:4000 Обратный прокси на порту 8001 к порту 4000
-w mitmproxy -p 8001 -w traffic.mitm Транслировать потоки в файл по мере их поступления
-r mitmproxy -r traffic.mitm Считать потоки из файла
-C mitmproxy -C traffic.mitm Воспроизведение клиентских запросов из сохраненного файла
-S mitmproxy -S traffic.mitm Воспроизведение ответов сервера из сохраненного файла
-s mitmproxy -s myScript.py Выполнение скрипта
-h mitmproxy -h Быстрая справка по mitmproxy

Движение

``markdown k Ctrl b ▲ ▲▲ │ ││ h ◀ ─── + ─── ▶ l ││ стр. │ ││ ▼ ▼▼ j Ctrl f / Пробел

---

| - | - |
|----------------------|-----------------------|
| `h`, `j`, `k`, `l` | Влево, Вниз, Вверх, Вправо |
| `Ctrl` `b` | Страница вверх |
| `Space` / `Ctrl` `f` | Страница вниз |
| `g` / `G` | Перейти к началу / концу |
| `Стрелки` | Вверх, Вниз, Влево, Вправо |
{.shortcuts}



### Копировать в буфер обмена


Синтаксис команды:

:export.clip format flow

----------------
Пример:

| Описание | Пример команды |
|--------------------------------|------------------------------------|
| 1. Копирование как команда curl | `:export.clip curl @focus` |
| 2. Копировать как команду httpie | `:export.clip httpie @focus` |
| 2. Копировать как raw | `:export.clip raw @focus` | 2.
| 2. Копировать как необработанный HTTP-запрос | `:export.clip raw_request @focus` |
| 2. Копирование в виде необработанного HTTP-ответа | `:export.clip raw_response @focus` |
{.style-list}

Экспорт потока в системный буфер обмена.




### Сохранить в файл

Синтаксис команды:

:export.file format flow path

----------------
Пример:

| Описание | Пример команды |
|------------------------------|----------------------------------------------------|
| 1. Экспорт в /tmp/a.curl | `:export.file curl @focus /tmp/a.curl` |
| 2. Экспорт в /tmp/a.httpie | `:export.file httpie @focus /tmp/a.httpie` |
| 2. Экспорт в /tmp/a.raw | `:export.file raw @focus /tmp/a.raw` | | 2.
| 2. Экспорт в /tmp/a.request | `:export.file raw_request @focus /tmp/a.request` |
| 2. Экспорт в /tmp/a.response | `:export.file raw_response @focus /tmp/a.response` |
{.style-list}

Экспорт потока в системный буфер обмена.



### Общие сочетания клавиш
| - | - |
|---------|------------------|
| `q` | Back / Exit |
| `z` | Очистить список потоков |
| `:` | Командная строка |
| `E` | Просмотр журнала событий |
| `O` | Просмотр параметров |
| `r` | Воспроизвести этот поток |
| `Tab` | Next |
| `Enter` | Select |
{.shortcuts}



### Глобальные сочетания клавиш
| - | - |
|----------------|---------------------------|
| `-` | Переход к следующему макету |
| `?` | Просмотр справки |
| `B` | Запуск подключенного браузера |
| `C` | Просмотр команд |
| | `I` | Переключение перехвата |
| `K` | Просмотр привязки клавиш |
| `P` | Просмотр деталей потока |
| `Q` | Немедленный выход |
| `W` | Поток в файл |
| `i` | Установить перехват |
| `Ctrl` `right` | Фокусировка на следующей панели разметки |
| `Shift` `tab` | Фокусировка следующей панели |
{.shortcuts}






### Поток (вид)
| - | - |
|------------|------------------------------|
| `A` | Возобновить все перехваченные потоки |
| `D` | Дублировать поток |
| `F` | Установить следующий фокус |
| `L` | Загрузить потоки из файла |
| `M` | Переключить просмотр отмеченных потоков |
| `S` | Запустить воспроизведение сервера |
| `U` | Снять все пометки |
| `V` | Вернуть изменения в этот поток |
| `X` | Убить этот поток |
| | `Z` | Очистить все потоки, которые не отображаются |
| `a` | Возобновить этот перехваченный поток |
| `b` | Сохранить тело ответа в файл |
| `d` | Удалить поток из просмотра |
| `e` | Экспортировать этот поток в файл |
| `f` | Установить фильтр просмотра |
| `m` | Переключить отметку на этот поток |
| `n` | Создать новый поток |
| `o` | Установить порядок списка потоков |
| `r` | Воспроизвести этот поток |
| `v` | Обратный порядок списка потоков |
| `w` | Сохранить список потоков в файл |
| `|` | Запустить сценарий для этого потока |
| `Ctrl` `l` | Отправить вырезки в буфер обмена |

{.shortcuts}




Mitmproxy Filter
---------------

### Фильтр
| - | - |
|-----|---------------------------------------|
| `f` | Установить фильтр представления _(на странице представления потока)_ |
{.shortcuts}

---

- [RegEX cheatsheet](/regex) _(cheatsheets.zip)_

Регекс в стиле Python может быть задан в виде строк с кавычками



### Операторы

| - | - |
|---------|-----------|
| `!` | unary not |
| `&` | и |
| `|` | или |
| `(...)` | группировка |


### Выражения {.row-span-2}

| - | - |
|----------------|------------------------------------------------------------|
| `~a` | Соответствие актива в ответе: CSS, Javascript, Flash, изображения.   |
| | `~b` `regex` | Body |
| | `~bq` `regex` | Тело запроса |
| | `~bs` `regex` | Тело ответа |
| | `~c` `int` | Код ответа HTTP |
| `~d` `regex` | Домен |
| | `~dst` `regex` | Адрес назначения |
| `~e` | Ошибка соответствия |
| | `~h` `regex` | Заголовок |
| | `~hq` `regex` | Заголовок запроса |
| `~hs` `regex` | Заголовок ответа |
| `~http` | Соответствие потокам HTTP |
| `~m` `regex` | Метод |
| `~marked` | Подбор отмеченных потоков |
| | `~q` | Искать запрос без ответа |
| `~s` | Искать ответ |
| | `~src` `regex` | Искать адрес источника |
| `~t` `regex` | Заголовок типа содержимого |
| `~tcp` | Искать TCP-потоки |
| `~tq` `regex` | Заголовок типа содержимого запроса |
| | `~ts` `regex` | Заголовок типа содержимого ответа |
| `~u` `regex` | URL |
| `~websocket` | Соответствие потоков WebSocket (и потоков рукопожатия HTTP-WebSocket)|

### Селекторы потоков
Выражения
| - | - |
|-------------|----------------------------|
| `@all ` | Все потоки |
| | `@focus ` | Текущий сфокусированный поток |
| | `@shown ` | Все потоки, показанные в данный момент |
| | `@hidden ` | Все потоки, которые в данный момент скрыты |
| | `@marked` | Все отмеченные потоки |
| `@unmarked` | Все немаркированные потоки |

mitmproxy имеет набор удобных селекторов потоков, которые работают с текущим представлением



### Примеры
URL, содержащий "google.com"

google.com


Запросы, тело которых содержит строку "test"

~q ~b test


Все, кроме запросов с типом содержимого text/html:

!(~q & ~t “text/html”)


Замена всей GET-строки в запросе (для этого необходимо использовать кавычки):

“:~q ~m GET:.*:/replacement.html”







Скрипты Mitmproxy {.cols-2}
-------


### Пользовательский ответ

``python
from mitmproxy import http


def request(flow: http.HTTPFlow) -> None:
    if flow.request.pretty_url == "http://example.com/path":
        flow.response = http.HTTPResponse.make(
            200, # (необязательно) код состояния
            b "Hello World", # (необязательное) содержимое
            { "Content-Type": "text/html"}  # (необязательные) заголовки
        )

Отправка ответа с прокси-сервера без передачи каких-либо данных на удаленный сервер

Добавить заголовок

``python class AddHeader: def init(self): self.num = 0

def response(self, flow):
    self.num = self.num + 1
    flow.response.headers["count"] = str(self.num)

addons = [ AddHeader() ]

Добавление HTTP-заголовка к каждому ответу

Также см.
-------
- [mitmproxy addons](https://github.com/mitmproxy/mitmproxy/tree/master/examples/addons) _(github.com)_
- [mitmproxy docs](https://docs.mitmproxy.org/) _(mitmproxy.org)_