一、安装
1.1 安装mitmproxy
直接使用pip安装即可
pip install mitmproxy
pip本质上会一是安装mitmproxy库的相关代码,二是安装mitmproxy.exe,mitmdump.exe,mitmweb.exe三个可执行程序。
可执行程序被安装在$PYTHON_HOME/Scripts文件夹下,
1.2 安装证书
mitmproxy默认只能拦截http,想要拦截https那就需要安装证书。
http://mitm.it/ 下载并导入证书,(需要先启动mitmweb代理服务)
二、运行
要启动 mitmproxy 用 mitmproxy
、mitmdump
、mitmweb
这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。 mitmproxy.exe并不支持windows
mitmproxy
命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。形如:
mitmweb
命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。形如:
mitmdump 命令启动后 没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。
由于 mitmproxy 命令的交互操作稍显繁杂且不支持 windows 系统,而我们主要的使用方式又是载入自定义脚本,并不需要交互,所以原则上说只需要 mitmdump
即可,但考虑到有交互界面可以更方便排查错误,所以这里以 mitmweb
命令为例。实际使用中可以根据情况选择任何一个命令。
启动 mitmproxy:
mitmweb
应当看到如下输出:
Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8080
mitmproxy 绑定了 *:8080
作为代理端口,并提供了一个 web 交互界面在 127.0.0.1:8081
。
现在可以测试一下代理
2.1 电脑启动代理
配置网络代理即可
2.3 手机配置代理
手机配置代理大同小异都在设置之中进行配置。比如我这里的路径是:
设置----无线和网络WLAN----长按wifi名----修改网络----显示高级选项----代理----手动---服务器主机名输入172.30.195.1(根据自己电脑ip修改)服务器端口输入8080----保存
2.4 代理效果查看
完成后在启动mitmdump.exe的代理窗口上即可看到手机发送的所有数据包。
三、python3使用mitmproxy
使用mitmproxy的根本目的是想要python能修改发送的数据包,及截获服务端返回的数据包。只是打印出所有发送的请求对我们的目的而言是没有什么用的。
python接触发送数据包的途径是在启动mitmdump启动时使用-s选项指定处理脚本,其中通过重写request方法处理请求数据包,通过重写response方法处理响应数据包。示例如下。
启动命令:
mitmdump.exe -s example_script.py
exampl_script.py内容:
from mitmproxy import ctx # 所有发出的请求数据包都会被这个方法所处理 # 所谓的处理,我们这里只是打印一下一些项;当然可以修改这些项的值直接给这些项赋值即可 def request(flow): request = flow.request # 获取请求对象 info = ctx.log.info # 实例化输出类 info(request.url) # 打印请求的url info(request.method)# 打印请求方法 info(request.host)# 打印host头 info(str(request.port)) # 打印请求端口 info(str(request.headers))# 打印所有请求头部 info(str(request.cookies))# 打印cookie头 # 所有服务器响应的数据包都会被这个方法处理 # 所谓的处理,我们这里只是打印一下一些项 def response(flow): response = flow.response # 获取响应对象 info = ctx.log.info # 实例化输出类 info(str(response.status_code)) # 打印响应码 info(str(response.headers))# 打印所有头部 info(str(response.cookies)) # 打印cookie头部 info(str(response.text)) # 打印响应报文内容 # 3.需求需要拒绝客户端请求,所以实现一个 http_connect 事件: def http_connect(self, flow: mitmproxy.http.HTTPFlow): # 确认客户端是想访问 www.google.com if flow.request.host == "www.google.com": flow.response = http.HTTPResponse.make(404) # 返回一个非 2xx 响应断开连接