mitmproxy介绍及使用

news2024/11/15 22:35:41

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏扫处理:SSH弱算法问题解决

目录 漏洞说明解决方法1. 查看可用的算法2. 禁用弱算法3.检查ssh配置4.重启ssh服务5.ssh测试连接是否正常6.漏扫测试参考链接漏洞说明 通过漏扫得出,服务器SSH支持密钥交换算法,而此算法被认为是弱算法,存在高风险问题。 启用了以下弱算法: diffie-hellman-group-exchage…

前端JS特效第33波:jQuery旋转木马焦点图轮播插件PicCarousel

jQuery旋转木马焦点图轮播插件PicCarousel&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IE…

Go 初始化一个字典

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Python量化交易学习——Part12:回归模型的典型应用

回归模型在很多的时候被应用于对股票的基本面数据进行分析&#xff0c;例如经典的CAPM模型、Fama-French三因子模型以及最新的PB_ROE模型等。这些都是已经应用于现实中的金融市场并获得较好收益的经典模型。本章将通过介绍PB_ROE模型&#xff0c;进一步讲解回归分析在实战过程中…

深入探讨【C++容器适配器】:现代编程中的【Stack与Queue】的实现

目录 一、Stack&#xff08;栈&#xff09; 1.1 Stack的介绍 1.2 Stack的使用 1.3 Stack的模拟实现 二、Queue&#xff08;队列&#xff09; 2.1 Queue的介绍 2.2 Queue的使用 2.3 Queue的模拟实现 三、容器适配器 3.1 什么是适配器 3.2 为什么选择deque作为stack和…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

solidity实战练习3——荷兰拍卖

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; interface IERC721{function transFrom(address _from,address _to,uint nftid) external ; }contract DutchAuction { address payable immutable seller;//卖方uint immutable startTime;//拍卖开始时间uint immut…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…

git安装使用gitlab

第一步&#xff1a;下载git 第二步&#xff1a;安装 第三步&#xff1a;配置sshkey 第四步&#xff1a;处理两台电脑的sshkey问题 第一步下载git 网址&#xff1a;Git点Downloads根据你的操作系统选择对应的版本&#xff0c;我的是Windows&#xff0c;所以我选择了Windows …

细数「人力资源」的「六宗罪」

细数「人力资源」的「六宗罪」 不要让人力资源成为企业发展的障碍 人力资源的六宗罪: 招聘与配置培训与开发薪酬与绩效请您先「点赞」+「在看」+「收藏」+关注@netkiller,转发给你的朋友,再慢慢看,方便查看往期精彩文章,以防手划找不到,您的支持就是我最大的动力。 人力…

玩转springboot之SpringBoot打成jar包的结构

SpringBoot打成jar包的结构 springboot通常会打成jar包&#xff0c;然后使用java -jar来进行执行&#xff0c;那么这个jar包里的结构是什么样的呢 其中 BOOT-INF 中包含的classes是我们程序中所有的代码编译后的class文件&#xff0c;lib是程序所引用的外部依赖 META-INF 这个…

解答|服务器只能开22端口可以申请IP地址SSL证书吗?

IP地址SSL证书&#xff0c;是一种专门颁发给公网IP地址的SSL证书&#xff0c;而不是常见的基于域名的SSL证书。SSL证书主要用于保障数据在客户端&#xff08;如用户的浏览器&#xff09;和服务器之间传输时的加密性和安全性&#xff0c;以防止数据被截取或篡改。 服务器只能开…

希尔排序——C语言

希尔排序是插入排序的一种更高效的改进版本。希尔排序通过比较相距一定间隔的元素来进行排序&#xff0c;随着算法的进行&#xff0c;这个间隔逐渐减少&#xff0c;直到最后变为1&#xff0c;此时的排序其实就是一次插入排序。 希尔排序和插入排序的区别是希尔排序是插入排序的…

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…

员工的离职成本到底有多高?

员工的离职成本到底有多高? 少有公司意识到离职率这个问题,表面上是员工主动提辞的,所以企业常常将离职率归罪于员工。 可以用“铁打的营盘,流水的兵”来概括离职率。 90/00后高频离职原因,企业揣着明白装糊涂 知乎上常常看到关于抱怨90/00后任性离职的问题,我说这是…

【python数据结构精讲】双端队列

通过总结《流畅的Python》等书中的知识&#xff0c;总结Python中常用工具的方法。 deque&#xff0c;学名双端队列。 1. 常用方法 append()&#xff1a;队列尾部添加appendleft()&#xff1a;队首添加pop()&#xff1a;移除队列最后一个元素popleft()&#xff1a;移除队列第一…

聊聊接入Arbitrum的正确姿势

本文首发于公众号&#xff1a;Keegan小钢 前言 我们知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 两大类。而 Optimistic Rollup 的实现方案中&#xff0c;则是 Optimism 和 Arbitrum 最受关注。而我们最近接入了 …

ONLYOFFICE最新8.1版本新功能解析

ONLYOFFICE最新8.1版本新功能解析 书接上文&#xff1a; 深度解析 ONLYOFFICE 协作空间 2.5 版本新功能https://blog.csdn.net/VincentYoung/article/details/139665603?spm1001.2014.3001.5502 讲解了ONLYOFFICE协作空间今年最新升级的2.5版本的新功能&#xff0c;这里继续…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…

简单的SQL字符型注入

目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等&#xff0c;大多都是单引号…