一、安装
前言:如果只是拿 mitmproxy 做一个替代 fiddler 的工具,没有什么定制化的需求,那完全只需要“安装 mitmproxy 工具”即可,去 mitmproxy 官网 上下载一个 installer 便可开箱即用,不需要提前准备好 python 开发环境。但显然,这不是这里要讨论的,我们需要的是“安装 python 的 mitmproxy 包”,本文只提及到python使用的mitmproxy脚本的简易使用(windows)
1 安装mitmproxy
直接使用pip安装即可
pip install mitmproxy
完成后,系统将拥有 mitmproxy
、mitmdump
、mitmweb
三个命令,由于 mitmproxy
命令不支持在 windows 系统中运行(这没关系,不用担心),我们测试一下安装是否成功,执行:
mitmdump --version
应当可以看到类似于这样的输出:
mitmdump
2 配置mitmproxy
用户目录下边
C:UsersDell.mitmproxy # 对应用户目录下都有一个.mitmproxy目录
不知道用不用装,我是都安装了。
2.1 控制面板==》 网络和 Internet ==》连接 ==》局域网设置 (本地pc设置)
2.2谷歌浏览器:chrome://settings/system ==》打开您计算机的代理设置 ==》(浏览器拦截,列如抓取web)
2.3 手机配置就是配置ip代理和端口
打开手机浏览器:输入http://mitm.it/
根据图表点击自己手机对应的证书,进行安装。
注意:ip地址都为局域网的该机器ip
3 使用mitmproxy
直接上代码吧
from mitmproxy import ctx # 所有发出的请求数据包都会被这个方法所处理 # 所谓的处理,我们这里只是打印一下一些项;当然可以修改这些项的值直接给这些项赋值即可 def request(flow): # 获取请求对象 request = flow.request # 实例化输出类 info = ctx.log.info # 打印请求的url info(request.url) # 打印请求方法 info(request.method) # 打印host头 info(request.host) # 打印请求端口 info(str(request.port)) # 打印所有请求头部 info(str(request.he aders)) # 打印cookie头 info(str(request.cookies)) # # 所有服务器响应的数据包都会被这个方法处理 # # 所谓的处理,我们这里只是打印一下一些项 def response(flow): # 获取响应对象 response = flow.response # 实例化输出类 info = ctx.log.info # 打印响应码 info(str(response.url)) # # 打印所有头部 info(str(response.headers)) # # 打印cookie头部 info(str(response.cookies)) # 打印响应报文内容 info(str(response.text)) print(response.content)
启动
mitmdump.exe -s ****.py 上边文件的路径文件
刷新浏览器 查看控制台打印的数据
4 实践mitmproxy
获取cookie或者请求头认证数据
# -*- coding:utf-8 -*- import os import sys import json import base64 import arrow import mitmproxy.http import redis from everett.ext.yamlfile import ConfigYamlEnv from everett.manager import ConfigManager from mitmproxy import ctx config = ConfigManager([ ConfigYamlEnv('./config/common.yaml'), ConfigYamlEnv( './config/{}.yaml'.format(os.environ.get('BEAR_SEARCH_ENV'))) ]) redis_handler = redis.Redis(host=config( 'redis_host', parser=str), port=config('redis_port', parser=str), db=15, password=config('redis_password', parser=str)) class BearServer(object): def request(self, flow: mitmproxy.http.HTTPFlow): if 'authorization' in flow.request.headers: bear = flow.request.headers['authorization'] if bear: bear = bear.replace('Bearer ', '').strip() bear_list = bear.split('.') if len(bear_list) == 3: bear_info = base64.b64decode(bear_list[1]) bear_info = json.loads(bear_info) exp_time = int(bear_info.get('exp')) iat_time = int(bear_info.get('iat')) if exp_time > 0: try: redis_handler.zremrangebyscore( 'bear_zset', 0, iat_time) if not redis_handler.zscore('bear_zset', bear): redis_handler.zadd( 'bear_zset', {bear: exp_time}) except Exception as e: raise e ctx.log.info('获取到的bear是:{}'.format(bear)) addons = [ BearServer() ]
配合supervisor启动服务
[program:bear_proxy_server] directory=/www/app_bear_proxy command=pipenv run mitmdump -s server.py -p 9900 --set block_global=false stderr_logfile=/var/log/supervisor/bear_proxy_server/bear_proxy_server_error.log stdout_logfile=/var/log/supervisor/bear_proxy_server/bear_proxy_server_out.log priority=1 autostart=true autorestart=true stopasgroup=true killasgroup=true
很多种用法
参考:
<wolfogre's blog:https://blog.wolfogre.com/posts/usage-of-mitmproxy/
mitmproxy官方:https://docs.mitmproxy.org/stable/