mitmproxy是一个使用python编写的中间人代理工具,跟Fiddle、Charles等等的抓包工具是差不多的,同样可以用于拦截、修改、保存http/https请求。比起Fiddle、Charles,mitmproxy有一个最大的特点是支持python自定义脚本。
安装mitmproxy工具的话直接到以下网址直接下载,一键安装即可立即使用,也很简单,移动端设置一下端口就直接可以抓包。
安装完成后,系统会拥有3个命令mitmproxy、mitmdump、mitmweb,该三个命令的区别是交互界面不同而已。
mitmproxy是会直接提供一个命令行界面,可以实时看到请求的链接。
mitmdump是没有界面,通过自定义脚本默默的按照自定义脚本工作。
mitmweb是通过web界面,实时看到请求的链接。
在命令行上直接输入以上三个命令之一即可开始抓包
mitmproxy官网:https://mitmproxy.org
mitmproxy GitHub:https://github.com/mitmproxy/mitmproxy
以Windows安装mitmproxy为例
一、抓包原理
与Fiddle,Charles一样,mitmproxy运行于自己的PC上,mitmproxy会在PC的8080端口运行,然后开启一个代理服务,这个服务实际上是一个HTTP/HTTPS的代理。
手机和PC在同一个局域网内,设置代理为mitmproxy的代理地址,这样手机在访问互联网的时候流量数据包就会流经mitmproxy,mitmproxy再去转发这些数据包到真实的服务器,服务器返回数据包时再由mitmproxy转发回手机,这样mitmproxy就相当于起了中间人的作用,抓取到所有Request和Response,另外这个过程还可以对接mitmdump,抓取到的Request和Response的具体内容都可以直接用Python来处理,比如得到Response之后我们可以直接进行解析,然后存入数据库,这样就完成了数据的解析和存储过程。
二、Windows安装mitmproxy
pip install mitmproxy
三、查看mitmproxy版本
启动mitmproxy一共有三种命令方式
mitmproxy mitmdump mitmweb
mitmproxy
类似于vim编辑器,使用命令操作并查看每一个包的信息
mitmdump
mitmdump启动的方式结合了mitmweb打印出的脚本信息和mitmproxy方式启动的包信息,在命令行中查看可能会很难找目标信息,但不需要去进一步的去操作
mitmweb
会在本机上启动一个web服务,以便在浏览器查看包信息,相比于命令行界面操作更加简单,命令行则输出脚本运行信息
Linux系统一般用命令行输入mitmproxy mitmdump
mitmproxy --version
如果在Windows系统输入 mitmproxy --version 报错
Windows 命令一般用mitmdump 和 mitmweb
mitmdump --version
四、设置代理并安装CA证书
手机或者雷电模拟器安装证书
这里以安卓手机为例,安装CA证书
Android机打开UC浏览器输入或者自带浏览器 IOS机同理
输入mitm.it出现下图选择 Android 或者 Apple
开启抓包:mitmdump 默认端口8080
mitmdump -p 8888
五、python脚本写法
访问请求
def request(flow):
ctx.log.warn(str(flow.request.headers))
print(flow.request.headers) # 打印请求头
响应请求
def response(flow):
ctx.log.warn(str(flow.response.status_code)) # 获取响应的状态码
print(flow.response.text) # 响应的文件
日志输出
mitmdump提供了专门的日志输出功能,可以设定不同级别以不同颜色输出结果。我们把脚本修改成如下内容
from mitmproxy import ctx
def request(flow):
flow.request.headers['User-Agent'] = 'MitmProxy'
ctx.log.info(str(flow.request.headers))
ctx.log.warn(str(flow.request.headers))
ctx.log.error(str(flow.request.headers))
六、开始用python脚本抓包
python脚本可以随便放哪,只要路径正确就没有问题
mitmdump -p 8888 -s D:/Yuan/mitmdata.py
抓包过程
七、mitmproxy脚本
# -*- coding: utf-8 -*-
import mitmproxy.http
class Counter:
def __init__(self):
self.num = 0
#设置上游代理
def request(self, flow: mitmproxy.http.HTTPFlow):
if flow.request.method == "CONNECT":
return
if flow.live:
proxy = ('http://121.228.53.238', '9990')
print(flow.request.host)
flow.live.change_upstream_proxy_server(proxy)
def response(self, flow: mitmproxy.http.HTTPFlow):
# 拦截包的信息
if 'https://mbd.baidu.com/newspage/data/landingpage' in flow.request.url:
print(flow.response.text)
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]