抓包服务实现(1)—Mitmproxy抓包数据处理
mitmproxy是什么?
- 官网介绍:mitmproxy is a set of tools that provide an interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets.
- 简而言之:mitmproxy支持拦截http、https请求
mitmproxy怎么使用?
由于mitmproxy是python第三方库,首先需要安装,建议直接用python安装
这里用mac系统(两个命令供选择)
python3 -m pip install mitmproxy 或者 pip3 install mitmproxy
当然,如果想用mac自带系统安装也行
brew install mitmproxy
mitmproxy提供了三个命令,启动模式不同:
- mitmproxy提供编译器执行命令行
- mitmdump提供终端输出
- mitmweb提供浏览器界面
至于如何配置环境和启动,可自行百度搜索。但在本文中将不会用到上述三个命令,而是以一个python第三方包的形式import,利用其包含的方法进行二次开发
mitmproxy提供了很多api供调用,用来改变mitmproxy的行为
最简单的用法是打印flow,了解flow的构造
class Counter:
def request(self,flow):
print(flow)
addons=[Counter()]
注意这里不能用python直接启动,因为还没有options配置,不能让python与mitmproxy直接进行交互
执行命令mitmdump -s addons.py
为什么传参flow,这是mitmproxy的实例:flow:http.HTTPFlow,类似于Django的request。此时我们能看到flow流的构造
<HTTPFlow
request = Request(GET api.inuozhen.com:443/x/gapp/config/info?sdk_type=na&shell_v=30010000&sign=66daffc7dffee394561cd1683f85875e&lon=121.523384&shell_vn=3.0.10.000&source=287001&versionName=1.0.0.000.0420.1715&uuid=b28f57d55549413da8be467e8380c9f9&platform=gapp&network=wifi&OSVersion=9&x-innoSeed=&app_id=a4d35TZN3Bzb&lat=31.119436&oaid=3dfd34b5-dfee-c262-777f-ffddf3f71af5&dtu=004&tuid=8qW5Qh0tSoehfslLLcVjmQ&deviceCode=869615044982234&version=1470&market=qtt&app_name=com.hahyx.wzdzz&v=10000000&tk=ACHypblCHS1Kh6F-yUstxWOZRWpxIwUOz3VnbXd6ZHp6Mg&vn=1.0.0.000.0420.1715&time=1619408533693&dc=869615044982234)
response = Response(200, application/json; charset=utf-8, 980b)
client_conn = <ClientConnection: [TLSv1.2] [ALPN: h2] 10.104.94.107:58836>
server_conn = <ServerConnection: [TLSv1.3: api.inuozhen.com] [ALPN: h2] api.inuozhen.com:443>>
从上述我们不能直接解析到request、response明细,但我们至少知道了flow包含了两个属性:
request、response
知道了flow流,接下来我们就要深入二次开发
怎么二次开发?
- 首先,我们希望是以python启动的方式来打开mitmproxy。原因无非是为以后集成接口去调用打基础
参考某大佬的代码,至今都没有分析出为啥这么做
from mitmproxy import proxy, options
from mitmproxy.tools.dump import DumpMaster
class Counter:
def request(self,flow):
print(flow)
def start():
myaddon = AddHeader()
opts = options.Options(listen_port=8090)
pconf = proxy.config.ProxyC