探索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 脚本

使用

  1. 可以通过上下移动鼠标滚轮的切换请求,选中某一请求后单击可查看请求详情
  2. 然后通过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的区别。

  1. Wireshark:

    • Wireshark是一个网络协议分析工具,可以捕获并显示网络流量。它能够拦截、监听和分析网络数据包,并提供详细的协议解析信息。Wireshark通常用于网络故障排除、协议分析和安全审计等任务。
  2. Filter:

    • Filter是一个基于规则的本地代理工具,可以根据用户自定义的规则对网络请求进行过滤和修改。它通常用于拦截和修改特定请求,如广告屏蔽、修改请求头等。Filter主要用于个人使用,对于对网络请求的控制有较高的灵活性。
  3. Charles:

    • Charles是一种功能强大的网络代理工具,主要用于拦截、查看和修改网络请求和响应。它可以用于调试、监测和测试网络应用程序,支持HTTP/HTTPS协议,并提供了丰富的调试和截获请求的功能。Charles提供了图形界面和易用的工具,适用于开发人员和测试人员。
  4. Mixproxy:

    • Mixproxy是一个开源的代理服务器,可以部署在服务器上,用于转发和代理网络请求。它具有可配置的代理规则和路由机制,可以用于构建复杂的代理服务,如反向代理、负载均衡等。Mixproxy适用于搭建代理服务器和网络中间件。

总结:

  • Wireshark是一个网络协议分析工具,用于捕获和显示网络流量。
  • Filter是一个本地代理工具,用于过滤和修改网络请求。
  • Charles是一个功能强大的网络代理工具,用于拦截、查看和修改网络请求和响应。
  • Mixproxy是一个开源的代理服务器,用于转发和代理网络请求。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务