工具使用篇(一)-Mitmproxy中间人代理

一、前言

在学习 Mitmproxy 前首先我们得先了解一下 Mitmproxy 的功能作用是什么,然后我们利用它能在实际的测试中能帮助我们解决什么问题。


Mitmproxy 简介

Mitmproxy 是一款开源的抓包工具,支持SSL的 HTTP 代理,它可以用于调试 HTTP 通信,发起中间人攻击等,不同于 Fiddler 等抓包工具,Mitmproxy 不仅可以截获请求、帮助开发者查看、分析数据包,使用者还可以通过自定义的 Python 脚本进行二次开发,以达到自己的使用需求。


Mitmproxy 解决的问题

有时候使用 Burp 进行代理,由于安全设备或者不明原因导致无法抓取到数据包,这时候可以尝试使用 Mitmproxy 进行中间人代理,先把流量代理到 Mitmproxy 再由 Mitmproxy 转发到 Burp 上。在工作上有一次在测试一个站点时无法通过 Burp 进行流量抓取,后来通过公司的一位 “文艺青年” 同事获悉是因为该站点使用了国密算法,SM2的某个密钥算法不兼容 JAVA SDK,并给出了解决方案,Mitmproxy 中间人代理,解决了使用了国密算法无法通过 Burp 抓包的问题。。

二、安装

Mitmproxy 官方提供了两种安装方式:

1
2
官方直接下载安装包直接 install 安装,网址 https://mitmproxy.org/
通过 Python 安装。本文采取后者安装方法

首先安装好 Python 版本需要不低于 3.6,且安装了附带的包管理工具 pip,这里不再赘述,自行安装。本人环境使用的是 Python 3.9.11。

1
pip3 install mitmproxy

image-20221211134605136
image-20221211134655595

查看版本是否成功安装

1
mitmdump --version

image-20221211134826164

三、Mitmproxy 使用

Mitmproxy 有三种启动命令 mitmproxymitmdumpmitmweb,任意一种命令均可启动软件,区别是交互界面的不同。

1
2
3
4
5
| 命令      | 功能                   |
| --------- | ---------------------- |
| mitmproxy | 提供命令行界面 |
| mitmdump | 提供一个简单的终端输出 |
| mitmweb | 提供在线浏览器抓包界面 |

开始使用前首先安装 mitmproxy 证书,cmd 直接输入 mitmproxy 启动软件,默认会监听 http://localhost:8080 ,然后访问 http://mitm.it/ 安装证书。出现下图则代理设置没有成功。

image-20221211141155354

设置系统代理,点击保存

image-20221211141430394

再次访问 http://mitm.it/ 选择对应的证书进行安装即可。

image-20221211141300248

安装证书

image-20221211141856418

密码无需填写

image-20221211141935950

image-20221211142028689

1、mitmproxy

cmd 命令行输入 mitmproxy 开启抓包

image-20221211142249404

点击数据包可查看具体响应,点击 q 返回主页

image-20221211142409754

也可以指定端口进行监听:mitmproxy --listen-port 9000 (mitmproxy -p 9000 亦可)

image-20221230171902531

image-20221211143116722

image-20221211143207912

2、mitmdump

录制回放请求,此命令无法查看具体的请求数据,只是默默运行在后台,所以一般不使用此命令。

通过命令:mitmdump -w dump.txt 可将 8080 端口的请求录制在 dump.txt 文件中

image-20221211145658121

然后通过命令: mitmdump -nC dump.txt 进行回放请求

image-20221211145820595

3、mitmweb

此命令能为用户提供 web 端界面,相对比较友好。

指定 8080 为监听端口,Web server listening at http://127.0.0.1:8081/,开启命令后会自动打开 web 端

image-20221211150024961

image-20221211150131731

界面相对友好,清晰可见

image-20221211150204910

四、扩展

1、自定义开发脚本

自定义脚本可以实现拦截请求,从而对请求头、请求、响应、响应头进行修改的效果。当人操作时,就能在拦截请求进行处理的时候进行数据处理

编写一个 Python 文件通过 mitmproxy 加载,文件定义了变量 addons,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon,比如一个叫 Counter 的 addon(插件),更多脚本请查看官方内置 addon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import mitmproxy.http
from mitmproxy import ctx


class Counter:
def __init__(self):
self.num = 0
# 重写指定方法
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)


addons = [
Counter()
]

将脚本保存为 addons.py ,重新启动 mitmproxy: mitmweb -s addons.py

image-20221211210114217

2、其他命令

1
2
mitmdump -w outfile #截获的数据保存到文件中
mitmdump -s script.py #指定一个脚本来处理截获的数据

五、参考

1
2
3
4
https://www.cnblogs.com/zhangmingyan/p/11358886.html
https://mp.weixin.qq.com/s?__biz=MzI2NjcxNTg0Nw==&mid=2247483709&idx=1&sn=b2b237d5354a9c691a803a371df51ed0&chksm=ea889695ddff1f832200c9edb5fcc2c5169dc4c11ddf0fe6e210196fc293f58ee974769756fb&scene=126&&sessionid=1670738515#rd
https://docs.mitmproxy.org/stable/mitmproxytutorial-replayrequests/
https://ptorch.com/docs/10/mitmproxytutorial-replayrequests