探索Mixproxy-构建强大代理服务的利器
前言
作为一名测试人员,工作当中必不可少的就是抓包。目前我司人员常用的是Charles,当然也有Fiddler、Wireshark等。这些都不是今天的主角,今天的主角是mitmproxy。我们将介绍一下基本用法以及工作中的实践。使用python定制mitmproxy是它的优势,让你可以处理复杂的抓包需求,这也是我将抓包工具从Charles换为mitmproxy的原因。
mitmproxy
mitmproxy 是一个开源的中间人代理工具,可以捕获 HTTP 和 HTTPS 请求,支持修改请求和响应,还提供了 Web 界面和 Python API
安装
pip install mitmproxy
启动
要启动 mitmproxy 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。 默认监听端口8080
- mitmproxy 命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。
- mitmweb 命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。
- mitmdump 命令启动后——你应该猜到了,没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。加载 python 脚本
常用参数
- -h 帮助信息
- -p 修改监听端口
- -s 加载 python 脚本
使用
- 可以通过上下移动鼠标滚轮的切换请求,选中某一请求后单击可查看请求详情
- 然后通过q命令可以返回到主界面,然后通过f命令加上要过滤的参数可以过滤请求
: Command prompt
E View event log 查看事件日志
O View options 视图选项
enter Select
q Exit the current view 退出当前视图
tab Next
Keybindings for this view
; Add comment to flow 向流程添加注释
A Resume all intercepted flows 恢复所有被拦截的流
D Duplicate flow 重复流
F Set focus follow 设置焦点跟随
L Load flows from file 从文件加载流
M Toggle viewing marked flows 切换查看标记流
S Start server replay 启动服务器重放
U Un-set all marks 取消所有标记
V Revert changes to this flow 将更改恢复到此流
X Kill this flow 杀死这个流
Z Purge all flows not showing 清除所有未显示的流
a Resume this intercepted flow 恢复截取的流
b Save response body to file 保存响应正文到文件
d Delete flow from view 从视图中删除flow
e Export this flow to file 导出该流到文件
f Set view filter 设置视图过滤器
m Toggle mark on this flow 此流上的切换标记
n Create a new flow 创建新的流程
o Set flow list order 设置流-列表按照啥顺序
r Replay this flow 重新进行请求
v Reverse flow list order 流列表-倒序排序
w Save listed flows to file 保存列出的流程到文件
z Clear flow list 清除流程列表
| Run a script on this flow 在这个流上运行一个脚本
ctrl l Send cuts to clipboard 发送剪切到剪贴板
Global Keybindings
- Cycle to next layout 循环到下一个布局
: Command prompt 命令提示符
? View help
B Start an attached browser 启动附加浏览器
C View commands 查看命令
E View event log
G Go to end 到终点
I Toggle whether the filtering via the intercept option is enabled 切换是否过滤通过拦截选项是启用的
K View key bindings Key Bindings界面
O View options 视图选项
P View flow details Flow Details界面
Q Exit immediately 立即退出
W Stream to file
enter Select
g Go to start
h Left
i Set intercept 设置拦截
j Down
k Up
l Right
q Exit the current view
space Page down
tab Next
ctrl b Page up
ctrl f Page down
ctrl right Focus next layout pane 聚焦下一个布局窗格
shift tab Focus next layout pane
例子:
i 进入请求拦截 ~u /api/coach_info & ~q 拦截指定url,过滤器~q仅拦截请求,不拦截响应
访问HTTPS
通过手机浏览器访问mitm.it/下载代理
python定制mitmproxy
mitmdump命令可以用来运行符合一定规则的python脚本,并在python脚本里面直接操作HTTP和HTTPS的请求,以及返回的数据包。
请求数据包
创建一个parse_request.py文件
def request(flow):
print(flow.request.headers)
在命令行执行命令:
mitmdump -s parse_request.py
运行命令之后,打开一个app,可以看到app请求的头部信息已经出现在终端窗口中 当然也可以查看cookie、body信息等,例如这样
def request(flow):
req = flow.request
print(f'当前请求的URL为:{req.url}')
print(f'当前请求的请求方式为:{req.method}')
print(f'当前请求的Cookies为:{req.cookies}')
print(f'当前请求的body为:{req.text}')
返回数据包
创建一个parse_response.py文件
import json
def response(flow):
resq = flow.response
print(f'返回的头部为:{resq.headers}')
print(f'返回的body为:{json.loads(resq.content)}')
实践
上面我们介绍了基本用法以及简单定制,下面我们结合工作中的问题看一下该如何定制
问题1:
测试人员发现了接口问题,截图给到开发,并告知测试场景,以为这样就可以了,结果开发笑嘻嘻的说"能给我一下curl吗?",测试人员都崩溃了,都告知你场景了,自己就可以复现啊,还让我给你。这里就可以用mitmproxy定制解决这个烦恼
from mitmproxy.addons.export import curl_command
def request(flow):
curl = curl_command(flow)
with open('curl.txt', 'w', encoding='utf-8') as f:
f.write(curl)
就这么简单,这样每次请求就可以将该请求的curl写入文件,当然你也可以集成钉钉/企业微信,请求一下自动发给开发。
问题2:
我们在测试一些复杂状态显示的时候,通常会mock数据来快速验证UI显示。
创建一个maplocal.py文件
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
with open(mock_filePath, encoding='utf-8') as f:
reader = [x for x in csv.DictReader(f)]
for r in reader:
if r['is_mock'] == "1":
if r['url'] in flow.request.pretty_url:
with open(os.path.join(base_dir, r['file'])) as f:
flow.response = http.Response.make(
200,
f.read(),
{"Content-Type": "application/json"}
)
创建一个mock.csv文件
is_mock,url,file,commit
0,https://www.baidu.com,demo.json,名称
其中demo.json就是你想要返回的数据。
当然还有很多定制,这里只介绍一下工作中常遇到的繁琐问题,更多定制等你来探索。
最后
相信你已经初步了解掌握了mitmproxy,最后我们简单说一下Wireshark、Filter、Charles和Mixproxy的区别。
-
Wireshark:
- Wireshark是一个网络协议分析工具,可以捕获并显示网络流量。它能够拦截、监听和分析网络数据包,并提供详细的协议解析信息。Wireshark通常用于网络故障排除、协议分析和安全审计等任务。
-
Filter:
- Filter是一个基于规则的本地代理工具,可以根据用户自定义的规则对网络请求进行过滤和修改。它通常用于拦截和修改特定请求,如广告屏蔽、修改请求头等。Filter主要用于个人使用,对于对网络请求的控制有较高的灵活性。
-
Charles:
- Charles是一种功能强大的网络代理工具,主要用于拦截、查看和修改网络请求和响应。它可以用于调试、监测和测试网络应用程序,支持HTTP/HTTPS协议,并提供了丰富的调试和截获请求的功能。Charles提供了图形界面和易用的工具,适用于开发人员和测试人员。
-
Mixproxy:
- Mixproxy是一个开源的代理服务器,可以部署在服务器上,用于转发和代理网络请求。它具有可配置的代理规则和路由机制,可以用于构建复杂的代理服务,如反向代理、负载均衡等。Mixproxy适用于搭建代理服务器和网络中间件。
总结:
- Wireshark是一个网络协议分析工具,用于捕获和显示网络流量。
- Filter是一个本地代理工具,用于过滤和修改网络请求。
- Charles是一个功能强大的网络代理工具,用于拦截、查看和修改网络请求和响应。
- Mixproxy是一个开源的代理服务器,用于转发和代理网络请求。