Mac安装mitmproxy及操作对监控的请求
在 macOS 上安装和配置 mitmproxy 是一个相对简单的过程,可以使用常见的包管理工具如 Homebrew 或直接通过 Python 的包管理工具 pip。以下是详细的安装步骤:
方法一:使用 Homebrew 安装
Homebrew 是 macOS 上流行的包管理工具。它可以快速安装 mitmproxy。
安装过程:
1、更新 Homebrew
运行以下命令以确保 Homebrew 是最新的:
brew update
2、安装 mitmproxy
使用 Homebrew 安装 mitmproxy:
brew install mitmproxy
3、验证安装
安装完成后,可以通过以下命令验证版本:
mitmproxy --version
4、输出版本信息即表示安装成功。
启动 mitmproxy 或 mitmweb
启动 mitmproxy:
mitmproxy --listen-host 0.0.0.0 --listen-port 8080
启动 mitmweb(显示 GUI):
mitmweb --listen-host 0.0.0.0 --listen-port 8080
方法二:使用 Python 的 pip 安装
如果没有使用 Homebrew,也可以通过 Python 的包管理工具 pip 安装 mitmproxy,因为它是用 Python 编写的。
安装过程:
1、确保 macOS 上已安装 Python 3
检查 Python 版本,运行以下命令:
python3 --version
如果尚未安装,可以通过 Homebrew 安装:
brew install python
2、升级 pip
在安装 mitmproxy 之前,建议确保 pip 已更新:
python3 -m pip install --upgrade pip
3、安装 mitmproxy
使用 pip 安装 mitmproxy:
python3 -m pip install mitmproxy
4、验证安装
检查 mitmproxy 版本确认安装是否成功:
mitmproxy --version
启动 mitmproxy 或 mitmweb
启动 mitmproxy:
mitmproxy --listen-host 0.0.0.0 --listen-port 8080
启动 mitmweb(显示 GUI):
mitmweb --listen-host 0.0.0.0 --listen-port 8080
配置 mitmproxy
配置代理
1、设置代理:
在 macOS 的系统设置中,进入 Wi-Fi > 网络设置 > 高级选项 > 代理。
配置 HTTP/HTTPS 代理地址为 127.0.0.1:8080 或运行 mitmproxy 的本地 IP 和端口号。
2、配置证书信任(确保可以抓 HTTPS 流量)
mitmproxy 默认会拦截 HTTPS 流量,但需要用户设备信任其自签名证书。以下是设置证书信任的步骤:
1、安装证书:
在设备浏览器中访问 http://mitm.it,并按照提示下载 mitmproxy 的证书。
下载后会生成一个 *.pem 文件。
2、将证书导入 macOS 的钥匙串中:
双击 .pem 文件,系统会自动导入到钥匙串工具中。
在 钥匙串访问 中找到导入的证书。
右击证书,选择 信息,然后设置为 始终信任。
3、验证证书是否生效:
再次运行 mitmproxy 或 mitmweb,进行流量捕获测试。
常见问题和解决方法
- mitmproxy 未显示流量
解决办法:
确保代理端口设置正确,应用是否连接到 127.0.0.1:8080。
配置证书信任,确保 HTTPS 请求能够被解密。 - Python 版本不兼容
如果系统自带的 Python 版本较低(如 2.x),建议安装最新版 Python:
brew install python
- GUI (mitmweb) 不显示流量
流量过多时可能存在延迟,增加资源限制:
mitmweb --set connection_strategy=eager
检查过滤器是否存在:
清空过滤器规则,显示所有流量。
mitmproxy 提供了扩展 API,允许编写 Python 脚本对流量进行操作,如捕获、过滤和处理 HTTP 请求。
以下是一个 Python 脚本,能够捕获 HTTP 请求并存储到集合中:
from mitmproxy import http
import json# 全局请求列表
http_requests = []
def read_json(file_path):"""读取 JSON 文件数据"""try:with open(file_path, 'r', encoding='utf-8') as file:data = json.load(file) # 加载 JSON 数据为 Python 对象return dataexcept FileNotFoundError:print(f"{file_path} 不存在,将创建新文件。")return {} # 如果文件不存在,返回一个空字典except json.JSONDecodeError:print(f"无法解析 {file_path},请确保文件内容是合法的 JSON。")return {}def request(flow: http.HTTPFlow) -> None:"""每次捕获 HTTP 请求时执行此回调函数"""global http_requests# 提取请求的基本信息url = flow.request.urlmethod = flow.request.methodheaders = dict(flow.request.headers)content = flow.request.text# 将请求信息存入集合request_data = {"url": url,"method": method,"headers": headers,"content": content,}http_requests.append(request_data)print(f"捕获请求: {url}")def response(flow: http.HTTPFlow) -> None:"""每次捕获 HTTP 响应时执行此回调函数"""global http_requestsurl = flow.request.urlprint(f"完成响应: {url}")def done():"""在 mitmproxy 运行结束时保存请求集合的数据"""global http_requests# 将捕获的请求保存到文件with open("http_requests.json", "w", encoding="utf-8") as f:json.dump(http_requests, f, indent=4)print(f"捕获了 {len(http_requests)} 个 HTTP 请求,已保存到 'http_requests.json'")
如何使用以上脚本
-
保存脚本文件
将上述代码保存到文件中,例如 capture_requests.py。 -
启动 mitmproxy 并加载脚本
通过 mitmproxy 或 mitmdump 加载脚本。例如:
mitmproxy -s capture_requests.py
或者使用 mitmdump(无界面模式):
mitmdump -s capture_requests.py
- 捕获流量
确保目标设备正确配置代理到运行 mitmproxy 的机器,同时安装并信任 CA 证书。完成流量操作后,脚本会自动将请求数据保存到 http_requests.json。