参考以及推荐学习:
使用 mitmproxy + python 做拦截代理 | Wolfogre’s Blog
mitmproxy安转
通过mac中自带的brew安装
brew install mitmproxy
如果不需要使用python脚本,只是单纯的想使用抓包工具的话,强烈推荐此中安装方法,方便快捷坑少
通过pip安装
如果我们需要调用python脚本来进行抓包的扩展操作的话,那必须使用此方法,因为python脚本中需要使用到mitmproxy中的相关工具
pip3 install mitmproxy
但是通过pip3安装坑是真的多啊。。。。
碰到安装到一半安装失败的情况
1、重装,重装那一个单独的安装失败的依赖,注意版本号
2、如果重装还是不行的话,到网上去搜对应的依赖安装失败的方法
"cannot import name 'url_quote' from 'werkzeug.urls' ..."
这个问题是因为依赖中的flask依赖与werkzeuq依赖版本不兼容
那怎么看自己的mitmproxy装的是哪个版本的flask呢?
pip3 list
输入上述命令查看安装的所有依赖,找到flask安装版本,然后到网上去找,自己这个版本的flask,能兼容的werkzeug的版本是多少
网上的这个问题我看flask的版本都是2.2.2,所以他们的解决方案是把werkzeug重新安装成2.2.2版本(因为werkzeug2.2.2与flask2.2.2兼容)
但是好死不死的是,我的mitmproxy最高支持的flask版本号为2.0.3😊,对于这个老版本来说,在我废了九牛二虎之力后,我终于在网上找到了对应的可支持的werkzeug版本支持,我必须得把werkzeug重新安装成2.0.3
(以下为牢骚。。。)
我又想到,我的python版本为3.8.10,但是pip3安装的mitmproxy版本却为8.0.0,可是最新版本已经到了10.1.4,那会不会是因为我所安装的mitmproxy版本太老所以导致了我的flask版本也过老呢?(而且由于版本是老版本,此处还有一个坑,后面再说。。。)然后我尝试手动去更新mitmproxy的版本,结果。。。
笑死我了,这个先放这吧,老版本就老版本吧,不影响主要功能就行,看我后面能不能找到解决办法。。。
检查是否安装成功
mitmproxy --version
出现此结果即为安装成功
mitmproxy使用
mitmproxy
注意右下角的8080,说明mitmproxy默认监听8080端口
但是可以使用-p端口号来改变mitmproxy的监听端口
mitmproxy -p8888
在官方文档中,给了两个网址,可以供我们测试用
http://wttr.in/Dunedin?0
http://wttr.in/Innsbruck?0
另开一个终端,在命令行中输入
curl --proxy 127.0.0.1:8080 "http://wttr.in/Dunedin?0"
可以看到此响应
同时回到mitmproxy控制台,可以看到mitmproxy抓到了这条协议
按“Enter”键可以看到详细信息
综上,我们要抓到电脑/手机上所有的包,只需要给电脑/手机配置代理就好了
配置代理(Mac)
设置 -> 网络 -> wifi -> 详细信息 -> 代理 -> 网页代理(HTTP)-> 输入服务器ip和mitmproxy监听的端口号 -> 好
开启代理之后,此台电脑上的所有http请求都能被mitmproxy抓到了
但是如果要抓https协议包呢?
怎么抓HTTPS协议包
mitmproxy中mitm表示(man-in-the-middle)即“中间人”的概念,也就是伪装成服务器,从而拿到客户端的请求包,再由其将这些包转发给真正的服务器,从而拿到服务器发回给客户端的响应
而HTTPS是经过加密的,非明文传输的协议,它只会对具有ca证书认证的服务器协商交换私钥,从而进行数据交换,所以要让mitmproxy抓到https协议包,就必须让客户端详细mitmproxy是可靠的具有ca认证的服务器
在上面,我们已经开启了http代理,输入网址
http://mitm.it
如果出现了以下页面,说明mitmproxy抓到了此http协议包,且返回了其ca证书的下载地址
那我们只需要根据自己的电脑类型,选择对应的ca证书进行下载即可,下载之后双击即可
在mac电脑中,我们可以点击钥匙串访问这一app来查看证书是否已经配置到本机
接下来就可以根据上述配置代理的流程,开启https代理,然后mitmproxy就可以抓到https请求了
当然,作为抓包软件,拦截,修改,回放这些操作mitmproxy也都可以完成,这里作为快速上手不做过多的赘述
按i快捷键进入 set Intercept ''
~u 表示要拦截的指定的URL
~q 表示仅拦截请求,但不拦截响应
&表示组合
a快捷键表示恢复
X快捷键表示杀死
e快捷键表示edit
r快捷键表示replay
编写python脚本
我们一般只用到这三种方法
需要具体了解别的方法可以看看这篇博客
使用 mitmproxy + python 做拦截代理 | Wolfogre’s Blog
def request(self, flow:mitmproxy.http.HTTPFlow)
def response(self, flow:mitmproxy.http.HTTPFlow)
def http_connect(self, flow:mitmproxy.http.HTTPFlow)
而脚本的编写需要符合mitmproxy规定的套路
你可以直接编写包含上述方法的文件
或者你可以调用包含addons的文件,addons = [](addons是个列表,每个元素是一个类实例,这些类有若干的方法,这些方法实现了某些mitmproxy提供的事件,mitmproxy会在某个事件发生时调用对应的方法,而这些类,称为一个个的addon)
推荐使用这种方法,这种方法更好管理,同时扩展性更强
mitmproxy -s 文件路径