mitmproxy介绍及使用

mitmproxy介绍

mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件,一个mitmdump,它是mitmproxy的命令行接口,可以直接抓取请求数据;另一个是mitmweb,它是一个web程序,通过它可以清楚的观察mitmproxy抓取的请求数据。

为什么选择 mitmproxy

1. 相对于我们常用的 fiddle 代理工具,它是可以跨平台。

2. 相对于跨平台的 charles 代理工具,它是开源免费的。

3. 最重要的一点,也是为什么我们采用 mitmproxy 来进行做 Mock,它支持使用 Python 进行二次开发,这样就可以结合业务进行灵活拓展了。

官方文档

https://docs.mitmproxy.org/stable/

功能简介

  1. 实时拦截、修改 HTTP/HTTPS 请求和响应
  2. 可保存完整的 http 会话,方便后续分析和重放
  3. 支持反向代理模式将流量转发到指定服务器
  4. 支持 macOS 和 Linux上的透明代理模式
  5. 支持用 Python 脚本对 HTTP 通信进行修改

抓包网络调试

使用WebView组件开发,软件可输入网页地址并显示网页内容。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监听和拦截输入框发起的网络请求。MITM技术允许应用程序在数据包从客户端到服务器的传输过程中进行干预,从而捕获和分析请求和响应数据,从响应数据中分析网络链接。

在微信小程序等环境中,并不能直接在WebView中配置代理。小程序的WebView组件直接使用的是微信小程序、支付宝小程序等平台提供的WebView实现,这些平台并不直接支持在WebView内设置代理。但在在QT或Android等环境中,WebView组件支持设置代理。这样就可以实现在不改变系统全局代理的情况下,直接造一工具实现对网络的解析。

安装

pip install mitmproxy

查看是否安装成功

# 使用以下三个命令中的任意一个即可,这三个命令返回的结果均一致
mitmproxy --version
mitmdump --version
mitmweb --version

mitmproxy默认只能拦截http,想要拦截https那就需要安装证书。

首先到$PYTHON_HOME/Scripts目录下运行一下mitmdump,完成之后在用户家目录下的.mitmproxy文件夹下即会生成的有证书,点击安装即可。

mitmproxy-ca.p12----PKCS12格式证书私钥

mitmproxy-ca.pem----PEM格式证书私钥

mitmproxy-ca-cert.cer----PEM格式证书,与mitmproxy-ca-cert.pem相同只是改变了后辍,适用于部分Android。

mitmproxy-ca-cert.p12----PKCS12格式证书,适用于Windows

mitmproxy-ca-cert.pem----PEM格式证书,适用于大多数非Windows平台

mitmproxy-dhparam.pem----PEM格式秘钥文件,用于增强SSL安全性

Windows安装证书

双击mitmproxy-ca-cert.p12----全部默认直接点“下一步”直到安装完成。

Android安装证书

把mitmproxy-ca-cert.cer通过usb复制到手机上----点击使用证书安装器安装证书。

工具介绍

mitmproxy 是一个控制台工具,允许交互式检查和修改 HTTP 流量。它与 mitmdump 的不同之处在于所有流都保存在内存中,这意味着它旨在获取和处理小样本。使用 ? 问号键查看上下文相关使用文档。 

mitmweb 提供了一个 web 页面,交互界面可以通过 localhost:8081 去访问。

mitmdump 可以通过执行一个 python 脚本去运行。

mitmproxy 作为一个常规的http代理服务器使用时,默认监听 http://localhost:8080,因此要想数据包经过 mitmproxy,需要配置浏览器的代理(本机或其他机器),代理设置步骤请自行搜索(比如插件:SwitchyOmega)。

代理设置好后可打开 http://mitm.it 验证http流量是否经过 mitmproxy。

如果显示以下文字,则代理配置的不对,流量不走 mitmproxy

If you can see this, traffic is not passing through mitmproxy.

如果配置正确,打开 http://mitm.it 会显示如下界面:

执行 mitmproxy 命令后在终端显示数据包,通过 Shift + ? 可以查看查看当前页面可用的命令。

q    退出(相当于返回键,可一级一级返回)
d    删除当前(黄色箭头)指向的链接
D    恢复刚才删除的请求
G    跳到最新一个请求
g    跳到第一个请求
C    清空控制台(C是大写)
i    可输入需要拦截的文件或者域名(逗号需要用\来做转译,栗子:feezu.cn)
a    放行请求
A    放行所有请求
?    查看界面帮助信息
^ v    上下箭头移动光标
enter    查看光标所在列的内容
tab    分别查看 Request 和 Response 的详细信息
/    搜索body里的内容
esc    退出编辑
e    进入编辑模式

脚本示例提取需要信息

from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    # 检查请求的URL是否包含特定的关键字
    if "video" in flow.request.pretty_url:
        print(f"success&&&&&&&&&&&&&&&&& Detected video request: {flow.request.pretty_url}")

def response(flow: http.HTTPFlow) -> None:
    # 检查响应的内容类型是否为视频
    if "video" in flow.response.headers.get("Content-Type", ""):
        print(f"success&&&&&&&&&&&&&&&&& Detected video response: {flow.response.headers.get('Content-Type')}")
        print(f"success&&&&&&&&&&&&&&&&& Video URL: {flow.request.pretty_url}")
        #video_url = flow.request.url
        video_url = flow.request.pretty_url
        #ctx.log.info(f"success&&&&&&&&&&&&&&&&&---------Found video URL: {video_url}")
        print(f"success&&&&&&&&&&&&&&&&&---------Found video URL: {video_url}")
        # 将视频地址保存到文件
        with open("video_urls.txt", "a") as file:
            file.write(video_url + "\n")
            file.flush() 

如何使用

#命令行下执行
mitmproxy -s video_scraper.py

python脚本自动开启并设置windows的浏览器代理

可以使用Python脚本自动开启并设置Windows的浏览器代理,并在退出时关闭代理。你可以使用winreg模块来修改Windows注册表中的代理设置。以下是一个示例脚本,展示了如何实现这一功能:

import winreg
import os

def set_proxy(enable=True, proxy_server="127.0.0.1:8080"):
    internet_settings = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
                                       r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
                                       0, winreg.KEY_ALL_ACCESS)
    if enable:
        winreg.SetValueEx(internet_settings, "ProxyEnable", 0, winreg.REG_DWORD, 1)
        winreg.SetValueEx(internet_settings, "ProxyServer", 0, winreg.REG_SZ, proxy_server)
    else:
        winreg.SetValueEx(internet_settings, "ProxyEnable", 0, winreg.REG_DWORD, 0)
    winreg.CloseKey(internet_settings)

def main():
    try:
        # 开启代理
        set_proxy(enable=True)
        print("代理已开启")

        # 运行你的主要代码,例如启动浏览器或抓取视频地址
        # ...

    finally:
        # 关闭代理
        set_proxy(enable=False)
        print("代理已关闭")

if __name__ == "__main__":
    main()

解释

  1. 设置代理

    • set_proxy函数用于设置或关闭代理。
    • winreg.OpenKey打开注册表项。
    • winreg.SetValueEx设置代理启用状态和代理服务器地址。
  2. 主函数

    • main函数首先开启代理,然后运行你的主要代码(例如启动浏览器或抓取视频地址)。
    • 使用try...finally确保无论发生什么情况,代理都会在脚本结束时关闭。

注意事项

  • 这个脚本会修改Windows注册表中的Internet设置,因此需要管理员权限。
  • 你可以根据需要修改代理服务器地址。

通过这种方式,可以使用Python脚本自动管理Windows的浏览器代理设置。

但通过这种自动修改系统代理的方式,需要注意一是需要具有管理权限,另外就是退出后别忘恢复代理,否则不懂的人还不知道网络是咋回事。当然懂的人会去找到系统代理的设置并改回来。 

当然,还有一种办法就是不改系统的代理,而是使用webview组件,工具内嵌浏览器组件,设置工具的代理。 以下用qt(版本qt5.10)实现。

QWebEngineView 是QT5.4版本加入的新浏览器引擎,用于编辑、查看web内容。

在windows系统下 QWebEngineView支持MSVC编译器编译、不支持mingw编译。

使用QWebEngineView时,需要在工程文件里增加webenginewidgets模块的引用,并加上#include <QWebEngineView> 头文件。

QT工具实现

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkProxy>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->mwebView->show();
    // 设置代理
    // 设置全局代理
   QNetworkProxy proxy;
   proxy.setType(QNetworkProxy::HttpProxy);
   proxy.setHostName("127.0.0.1");
   proxy.setPort(8080);
   QNetworkProxy::setApplicationProxy(proxy);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnLoad_clicked()
{
    QString url = ui->l_url->text();
    ui->mwebView->load(QUrl(url));
    ui->mwebView->show();
}

到这里很简单,其实关键的是,如何实现让脚本抓取的视频地址传给 qt呢? 方法有很多,这里介绍一种简单可行的方法,通过 socket通信,这样实现跨进程通信。

简单示例:

import mitmproxy.http
import json
import socket

def request(flow: mitmproxy.http.HTTPFlow):
    if "video" in flow.request.pretty_url:
        video_url = flow.request.pretty_url
        print(f"Detected video URL: {video_url}")
        
        # 将视频地址发送到Qt应用程序
        send_to_qt(video_url)

def send_to_qt(video_url):
    # 使用socket将视频地址发送到Qt应用程序
    host = '127.0.0.1'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(video_url.encode())
./vcpkg.exe install openssl:x64-windows

其他资源

【mitmproxy】一、简介与快速上手-CSDN博客

抓包工具之mitmproxy-CSDN博客

【mitmproxy】一、简介与快速上手-CSDN博客

https://github.com/reqable/reqable-app

Python 实现代理拦截http请求:mitmproxy_mitmproxy 透明代理-CSDN博客

mitmproxy安装与配置-CSDN博客

Python3+mitmproxy安装使用教程(Windows)_mitmprxy 安装证书存放位置-CSDN博客

https://zhuanlan.zhihu.com/p/651063616

  • 37
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值