mitmproxy快速上手

705 阅读5分钟

参考以及推荐学习:

mitmproxy官方文档

使用 mitmproxy + python 做拦截代理 | Wolfogre’s Blog

使用 mitmproxy + python 做拦截代理

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 文件路径