mitmproxy — программа захвата пакетов, поддерживающая HTTP и HTTPS, имеет функции, аналогичные Fiddler и Charles, за исключением того, что работает в виде консоли.
mitmproxy также имеет два связанных компонента. Одним из них является mitmdump, который представляет собой интерфейс командной строки mitmproxy. С его помощью мы можем подключаться к сценариям Python и использовать Python для реализации обработки пост-мониторинга. Другой — mitmweb, веб-программа, с помощью которой мы можем четко наблюдать за запросами, перехваченными mitmproxy.
Давайте научимся их использовать.
1. Подготовка
Убедитесь, что mitmproxy установлен правильно, что мобильный телефон и ПК находятся в одной локальной сети, а сертификат ЦС mitmproxy настроен.
Во-вторых, функция mitmproxy
mitmproxy имеет следующие функции.
Перехватывать запросы и ответы HTTP и HTTPS.
Сохраняйте HTTP-сессии и анализируйте их.
Смоделированный клиент инициирует запрос, а смоделированный сервер возвращает ответ.
Используйте обратный прокси-сервер для перенаправления трафика на указанный сервер.
Поддержка прозрачного прокси на Mac и Linux.
Обработка HTTP-запросов и ответов в режиме реального времени с использованием Python.
3. Принцип захвата пакетов
Как и Чарльз, mitmproxy работает на его собственном ПК, mitmproxy работает на порту 8080 ПК, а затем запускает прокси-сервис, который на самом деле является прокси-сервером HTTP/HTTPS.
Мобильный телефон и ПК находятся в одной и той же локальной сети, а прокси-сервер настроен на прокси-адрес mitmproxy, поэтому, когда мобильный телефон выходит в Интернет, пакеты данных трафика будут проходить через mitmproxy, а mitmproxy будет их пересылать. пакеты данных на реальный сервер.Когда сервер возвращает пакет данных, он затем пересылается обратно на мобильный телефон с помощью mitmproxy, так что mitmproxy действует как посредник и фиксирует все запросы и ответы.Кроме того, этот процесс также может быть подключен к mitmdump, а конкретный контент перехваченных Запросов и Ответов может быть напрямую использован в Python.Обработка, например, после получения Ответа, мы можем напрямую разобрать его, а затем сохранить в базе данных, тем самым завершив разбор и хранение данных процесс.
В-четвертых, установите прокси
Для начала нам нужно запустить mitmproxy, команда выглядит так:
Команда для запуска mitmproxy выглядит следующим образом:
mitmproxy
Затем на порту 8080 будет работать прокси-сервис, как показано на следующем рисунке.
Прослушиваемый порт появится в правом нижнем углу.
Или запустить mitmdump, он тоже будет прослушивать порт 8080, команда такая:
mitmdump
Результат работы показан на рисунке ниже.
Подключите мобильный телефон и ПК к одной и той же локальной сети и установите прокси-сервер в качестве текущего прокси-сервера. Сначала посмотрите на текущий IP-адрес локальной сети ПК.
Команда в Windows выглядит так:
ipconfig
Команда в Linux и Mac выглядит так:
ifconfig
Результат вывода показан на рисунке ниже.
Как правило, IP-адрес, например 10.*.*.* или 172.16.*.* или 192.168.1.*, является IP-адресом локальной сети текущего ПК.Например, IP-адрес ПК на этом рисунке 192.168.1.28 , а настройки прокси-сервера мобильного телефона аналогичны следующему рисунку.
Таким образом мы настроили прокси mitmproxy.
Пять, использование mitmproxy
Убедитесь, что mitmproxy работает нормально, мобильный телефон и ПК находятся в одной локальной сети, а прокси mitmproxy настроен.Конкретный метод настройки см. в официальной документации.
Для запуска mitmproxy команда выглядит так:
mitmproxy
После успешной настройки нам нужно только посетить любую веб-страницу или просмотреть любое приложение в мобильном браузере. Например, откройте Baidu на мобильном телефоне, и на странице mitmproxy будут показаны все запросы на мобильном телефоне, как показано на следующем рисунке.
Это эквивалентно запросу браузера, который мы прослушали в инструменте разработчика браузера ранее, здесь мы используем mitmproxy для его завершения. Чарльз тоже может.
Вот список всех запросов, когда мобильный телефон только что открывал страницу Baidu. 2/38, отображаемые в левом нижнем углу, представляют собой в общей сложности 38 запросов, а текущая стрелка указывает на второй запрос.
Каждый запрос начинается с GET или POST, именно так запрашиваются отдельные запросы. Сразу после этого следует запрошенный URL. Число в начале второй строки — это код состояния ответа, соответствующий запросу, за которым следует тип содержимого ответа, например text/html для веб-документов и image/gif для изображений. Ниже указан размер тела ответа и время ответа.
В настоящее время представлен обзор всех запросов и ответов, и мы можем отслеживать все запросы на этой странице.
Если мы хотим просмотреть детали запроса, мы можем нажать Enter, чтобы перейти на страницу сведений о запросе, как показано на рисунке ниже.
Вы можете увидеть подробную информацию о заголовках, таких как хост, файлы cookie, пользовательский агент и т. д.
Вверху находится список Запрос, Ответ и Детали, которые в настоящее время находятся в опции Запрос. В это время мы снова нажимаем кнопку TAB, чтобы просмотреть детали ответа, соответствующие этому запросу, как показано на следующем рисунке.
Вверху находится информация заголовка ответа, а потянув вниз, мы можем увидеть информацию тела ответа. Для текущего запроса тело ответа представляет собой исходный код веб-страницы.
В это время снова нажмите клавишу TAB, переключитесь на последнюю вкладку Подробности, и вы сможете увидеть подробную информацию о текущем запросе, такую как IP-адрес и порт сервера, версию протокола HTTP, а также IP-адрес и порт клиента, как показано на следующем рисунке.
mitmproxy также предоставляет функцию редактирования командной строки, мы можем повторно отредактировать запрос на этой странице. Нажмите клавишу e, чтобы войти в функцию редактирования, затем она спросит вас, какую часть контента вы хотите отредактировать, например, файлы cookie, запрос, URL-адрес и т. д. Первая буква каждого параметра будет выделена. Коснитесь первой буквы имени редактируемого содержимого, чтобы перейти на страницу редактирования содержимого.Например, коснитесь m, чтобы изменить метод запроса, и коснитесь q, чтобы изменить параметр запроса GET.
В это время мы нажимаем q, чтобы войти на страницу редактирования запроса. Поскольку параметров нет, мы можем нажать a, чтобы добавить строку, а затем ввести ключ и значение, соответствующие параметрам, как показано на следующем рисунке.
Здесь мы вводим ключ как wd и значение как NBA.
Затем снова нажмите клавишу esc и клавишу q, чтобы вернуться на предыдущую страницу, а затем нажмите клавиши e и p, чтобы изменить путь. Как и выше, нажмите a, чтобы увеличить содержимое Path, затем мы изменим Path на s, как показано на следующем рисунке.
Затем нажмите клавиши esc и q, чтобы вернуться, после чего мы увидим, что верхняя ссылка запроса становится такой: https://www.baidu.com/s?wd=NBA. Посетив эту страницу, вы можете увидеть результаты поиска Baidu по ключевым словам NBA, как показано на следующем рисунке.
Коснитесь a, чтобы сохранить изменение, коснитесь r, чтобы повторно инициировать измененный запрос, и вы увидите, что перед указанным выше методом запроса есть круглая стрелка, что означает, что измененный запрос выполняется повторно. В это время мы снова наблюдаем за содержимым тела ответа и видим исходный код страницы результата поиска NBA, как показано на следующем рисунке.
Вышеприведенный контент представляет собой простое использование mitmproxy. Используя mitmproxy, мы можем наблюдать за всеми запросами на телефоне, а также можем модифицировать и повторно инициировать запросы.
Fiddler и Charles также имеют эту функцию, и их графический интерфейс более удобен в работе. Итак, каковы преимущества mitmproxy?
Мощь mitmproxy отражена в другом его инструменте, mitmdump, с помощью которого мы можем напрямую взаимодействовать с Python для обработки запросов. Давайте посмотрим на использование mitmdump.
Шесть, использование mitmdump
mitmdump — это интерфейс командной строки mitmproxy, который также может взаимодействовать с Python для обработки запросов, что более удобно, чем такие инструменты, как Fiddler и Charles. С ним мы не можем вручную перехватывать и анализировать HTTP-запросы и ответы, а нужно только написать логику обработки запросов и ответов. Он также может реализовывать синтаксический анализ данных, хранение и т. д., и все это можно реализовать с помощью Python.
1. Пример введения
Мы можем запустить mitmproxy командой и сохранить перехваченные данные в файл, команда выглядит следующим образом:
mitmdump -w outfile
вoutfile
Имя произвольное, и перехваченные данные будут сохранены в этот файл.
Вы также можете указать скрипт для обработки перехваченных данных, используя-s
Параметры могут быть:
mitmdump -s script.py
Текущий скрипт обработки указывается здесь как script.py, который необходимо поместить в каталог, где выполняется текущая команда.
Мы можем написать следующий код в скрипте:
def request(flow):
flow.request.headers['User-Agent'] = 'MitmProxy'
print(flow.request.headers)
мы определяемrequest()
метод, параметрыflow
, на самом деле этоHTTPFlow
объект, черезrequest
свойство для получения текущего объекта запроса. Затем распечатайте заголовок запроса и измените User-Agent заголовка запроса на MitmProxy.
После запуска мы заходим на http://httpbin.org/get на мобильном телефоне и видим, что происходит следующее.
Страница на мобильном терминале отображается, как показано на рисунке ниже.
Вывод консоли на стороне ПК показан на рисунке ниже.
Заголовки, возвращаемые мобильным телефоном, на самом деле являются заголовками запроса, а User-Agent был изменен на mitmproxy. Консоль ПК выводит содержимое измененных Заголовков, а содержимое User-Agent — это именно mitmproxy.
Следовательно, этими тремя строками кода мы можем завершить переписывание запроса.print()
Результаты вывода метода могут быть отображены на консоли ПК, которую можно легко отлаживать.
2. Вывод журнала
mitmdump предоставляет специальную функцию вывода журнала, которая может устанавливать разные уровни для вывода результатов разными цветами. Модифицируем скрипт следующим образом:
from mitmproxy import ctx
def request(flow):
flow.request.headers['User-Agent'] = 'MitmProxy'
ctx.log.info(str(flow.request.headers))
ctx.log.warn(str(flow.request.headers))
ctx.log.error(str(flow.request.headers))
这里调用了ctx模块,它有一个log功能,调用不同的输出方法就可以输出不同颜色的结果,以方便我们做调试。 Например,info()
Выход метода белый,warn()
Содержимое вывода метода выделено желтым цветом,error()
Содержимое вывода метода выделено красным цветом. Результат работы показан на рисунке ниже.
Разные цвета соответствуют разным уровням вывода, и мы можем разумно разделить разные результаты по уровням вывода, чтобы более интуитивно и удобно просматривать отладочную информацию.
3. Request
Сначала мы достиглиrequest()
метод и изменить заголовки. Давайте взглянем на часто используемые функции Request. Давайте прочувствуем это на примере.
from mitmproxy import ctx
def request(flow):
request = flow.request
info = ctx.log.info
info(request.url)
info(str(request.headers))
info(str(request.cookies))
info(request.host)
info(request.method)
info(str(request.port))
info(request.scheme)
Мы модифицируем скрипт, а затем открываем Baidu на мобильном телефоне и видим, что консоль ПК выводит серию запросов, здесь мы находим первый запрос. Консоль выводит некоторые общие свойства запроса, такие как URL, заголовки, файлы cookie, хост, метод, схема и т. д. Результат вывода показан на рисунке ниже.
Результаты выводят ссылку запроса, заголовок запроса, файлы cookie запроса, узел запроса, метод запроса, порт запроса и протокол запроса.
В то же время мы также можем изменить любой атрибут, как и первоначальное изменение заголовков, просто назначив его напрямую. Например, здесь запрошенный URL изменен, и модификация скрипта выглядит следующим образом:
def request(flow):
url = 'https://httpbin.org/get'
flow.request.url = url
Мобильный терминал получает следующие результаты, как показано на рисунке ниже.
Интересно, что в верхней части браузера по-прежнему отображается URL-адрес Baidu, но страница стала страницей httpbin.org. Кроме того, файлы cookie, очевидно, по-прежнему являются файлами cookie Baidu. Мы просто использовали простой скрипт, чтобы успешно изменить запрос на другие сайты. Изменение и подделка запросов таким образом становится проще простого.
Из этого примера мы знаем, что иногда URL-адрес правильный, но содержание неверно. Нам необходимо и дальше повышать нашу осведомленность о безопасности.
Запрос также имеет множество свойств, которые здесь не будут перечислены. Дополнительные свойства можно найти по адресу: http://docs.mitmproxy.org/en/latest/scripting/api.html.
Пока мы понимаем основы использования, будет легко получить и изменить любой контент Reqeust.Например, мы можем избежать антисканирования, изменив файлы cookie и добавив прокси.
4. Response
Что касается поисковых роботов, нас больше беспокоит содержание ответа, поскольку тело ответа является результатом сканирования. Для ответа mitmdump также предоставляет соответствующий интерфейс обработки, которыйresponse()
метод. Давайте проверим это на примере.
from mitmproxy import ctx
def response(flow):
response = flow.response
info = ctx.log.info
info(str(response.status_code))
info(str(response.headers))
info(str(response.cookies))
info(str(response.text))
Измените сценарий в соответствии с приведенным выше содержанием, а затем посетите: http://httpbin.org/get.
Здесь ответ распечатываетсяstatus_code
,headers
,cookies
,text
Эти свойства, важнейшее из которыхtext
Свойства — это исходный код веб-страницы.
Вывод консоли на стороне ПК показан на рисунке ниже.
Консоль выводит код состояния, заголовок ответа, файлы cookie и тело ответа.
мы можем пройтиresponse()
метод для получения содержимого ответа для каждого запроса. Затем мы извлекаем и сохраняем ответную информацию и можем успешно завершить сканирование.
Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми
Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.
WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)