type
status
date
slug
summary
tags
category
icon
password
URL
Mitmproxy 功能介绍
- 实时拦截,修改 HTTP/HTTPS 请求和相应
- 可保存完整的 Http 会话,方便后续分析和重放
- 支持反向代理模拟将流量转发到指定服务器
- 支持 macOS 和 Linux 上的透明代理模式
- 支持用Python 脚本对 HTTP 通信进行修改
Mitmproxy 通信原理
一. 显示HTTP
配置客户端以使用mitmproxy作为显式代理是拦截流量的最简单,最可靠的方法。代理协议已在HTTP RFC中进行了编码,因此客户端和服务器的行为都得到了很好的定义,并且通常是可靠的。在与mitmproxy进行的最简单的交互中,客户端直接连接到代理,并发出如下所示的请求:
这是一个代理
GET请求-原始HTTP GET请求的扩展形式,包括模式和主机规范,并且它包含所有需要继续进行的信息mitmproxy。
客户端连接到代理并发出请求。
Mitmproxy连接到上游服务器,然后继续转发请求。
二. 显式HTTPS
显式代理
HTTPS连接的过程是完全不同的。客户端连接到代理并发出如下请求:传统的代理既不能查看也不能操纵TLS加密的数据流,因此CONNECT请求只是要求代理打开客户端和服务器之间的管道。这里的代理只是一个促进者-它在两个方向上都盲目转发数据,而对内容一无所知。TLS连接的协商是通过此管道进行的,随后的请求和响应流对于代理是完全不透明的。

1、客户端建立与mitmproxy的连接,并发出HTTP CONNECT请求。
2、Mitmproxy响应为200 Connection Established,就好像它已经设置了CONNECT管道一样。
3、客户端认为它正在与远程服务器通信,并启动TLS连接。它使用SNI指示要连接的主机名。
4、Mitmproxy连接到服务器,并使用客户端指示的SNI主机名建立TLS连接。
5、服务器以匹配的证书作为响应,该证书包含生成拦截证书所需的CN和SAN值。
6、Mitmproxy生成拦截证书,并继续在步骤3中暂停的客户端TLS握手。
7、客户端通过已建立的TLS连接发送请求。
8、Mitmproxy通过在步骤4中启动的TLS连接将请求传递到服务器。
三.透明HTTP
使用透明代理时,连接将重定向到网络层的代理中,而无需任何客户端配置。这使得透明代理非常适合那些您无法更改客户端行为的情况-代理不兼容的
Android应用程序是一个常见示例。为此,我们需要引入两个额外的组件。第一种是重定向机制,可以透明地将发往
Internet上服务器的TCP连接重新路由到侦听代理服务器。这通常采用与代理服务器位于同一主机上的防火墙的形式-Linux上的iptables或OSX上的 pf。客户端启动连接后,它将发出原始的HTTP请求,该请求可能类似于以下内容:请注意,此请求与显式代理变体不同,因为它忽略了方案和主机名。那么,我们如何知道将请求转发到哪个上游主机呢?执行重定向的路由机制为我们跟踪了原始目的地。每种路由机制都有一种公开此数据的不同方法,因此引入了透明代理工作所需的第二个组件:一个主机模块,该主机模块知道如何从路由器检索原始目标地址。在mitmproxy中,这采取一组内置模块的形式,这些 模块 知道如何与每个平台的重定向机制进行通信。一旦获得了这些信息,这个过程就很简单了。
- 客户端与服务器建立连接。
- 路由器将连接重定向到
mitmproxy,后者通常在同一主机的本地端口上侦听。然后,Mitmproxy会咨询路由机制以建立原始目的地。
- 现在,我们只需阅读客户的请求...
- …并将其转发到上游。
四.透明的HTTPS
第一步是确定我们是否应将传入连接视为
HTTPS。这样做的机制很简单-我们使用路由机制找出原始目标端口是什么。所有传入的连接都通过不同的层,这些层可以确定要使用的实际协议。通过在每个连接的开头查找ClientHello消息,自动TLS检测可用于SSLv3,TLS 1.0,TLS 1.1和TLS 1.2。这独立于所使用的TCP端口起作用。从这里开始,该过程是我们描述的透明代理
HTTP和显式代理HTTPS方法的合并。我们使用路由机制来建立上游服务器地址,然后像进行显式HTTPS连接一样建立CN和SAN,并处理SNI。
- 客户端与服务器建立连接。
- 路由器将连接重定向到
mitmproxy,后者通常在同一主机的本地端口上侦听。然后,Mitmproxy会咨询路由机制以建立原始目的地。
- 客户端认为它正在与远程服务器通信,并启动
TLS连接。它使用SNI指示要连接的主机名。
Mitmproxy连接到服务器,并使用客户端指示的SNI主机名建立TLS连接。
- 服务器以匹配的证书作为响应,该证书包含生成拦截证书所需的
CN和SAN值。
Mitmproxy生成拦截证书,并继续在步骤3中暂停的客户端TLS握手。
- 客户端通过已建立的
TLS连接发送请求。
Mitmproxy通过在步骤4中启动的TLS连接将请求传递到服务器。
Mitmproxy 安装
PIP 安装
最简单的安装方式还是使用pip,直接执行如下命令即可安装:
这是最简单和通用的安装方式,执行完毕之后即可完成mitmproxy的安装,另外还附带安装了mitmdump和mitmweb这两个组件。如果不想用这种方式安装,也可以选择后面列出的专门针对各个平台的安装方式或者Docker安装方式。
Windows下的安装
可以到GitHub上的Releases页面(链接为:https://github.com/mitmproxy/mitmproxy/releases/)获取安装包,如图1-59所示。
图1-59 下载页面

比如,当前的最新版本为10.3.0,则可以选择下载Windows下的exe安装包mitmproxy-10.3.0-windows-installer.exe,下载后直接双击安装包即可安装。
注意,在Windows上不支持mitmproxy的控制台接口,但是可以使用mitmdump和mitmweb。
Mac 下安装
Mitmproxy 使用
一.启动服务
输入以下命令
二.配置代理
- 获取电脑IP
- 配置代理

三.配置证书
- 在 Safari 地址栏输入 mitm.it

- 点击
Get mitmproxy-ca-cert.pem下载证书
- 设置 - 通用 - VPN 与设备管理 - 安装证书
- 设置 - 通用 - 关于本机 - 证书信任设置 - 勾选 mitmproxy
四.网络抓包

五.Mitmproxy 命令行方式
六.Docker 中抓包
- 下载证书: mitm.it
- 复制证书到docker
3.登录容器
- 复制证书到对应目录
- 安装证书
七.代码抓包
- 下载证书: mitm.it
- 将证书移动到公用文件夹, /opt/homebrew/etc/openssl@1.1
- PHP 抓包, 修改 php.ini
- NodeJS 抓包,导入全局变量
常用技巧
- 功能页面说明





2.快捷键
- 数据包过滤
当有很多数据包请求时,我们需要对数据包进行筛选。在界面中输入f,根据匹配规则进行筛选即可。如筛选所有域名blog.bbskali.cn的请求,我们需要输入规则~d blog.bbskali.cn

- 常用过滤表达式

📎 参考文章
- 作者:凯叔有点卷
- 链接:https://kaishu.i9x.cn//article/89231568-f35b-41e9-a571-40ecb16ed151
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。