一、安裝
前言:如果只是拿 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:\Users\Dell\.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/