mitmproxy的使用初试
mitmproxy 是一款开源的交互式 HTTP/HTTPS 代理工具集,专为流量拦截、调试和修改而设计。
安装
软件安装
Python 3.7+(推荐3.8+)
pip install mitmproxy
安装完毕后,分别有3个命令可以用:
- mitmproxy(终端交互界面)
- mitmweb(Web可视化界面)
- mitmdump(命令行工具)
每一个命令都是可以独立运行。
安装证书
启动,运行命令:
mitmproxy
mitmproxy启动后默认的监听端口为:8080。
设置系统的代理:
然后用浏览器访问:http://mitm.it/,我现在用的windows,所以下载的win的证书。
这个地址如果没设置代理,会无法访问。
证书安装完,就可以关掉mitmproxy了。
使用mitmdump获取响应并转发到指定的url
要转发数据到指定url,必须写个python的脚本来实现:dump.py
from mitmproxy import http
import requests
import jsonprint("脚本已加载!")
TARGET_URL = "http://127.0.0.1:6548/input.php"# 创建不使用代理的requests会话
session = requests.Session()
session.trust_env = False # 不使用系统代理def request(flow: http.HTTPFlow):print(f"拦截到请求: {flow.request.url}")flow.request.headers["X-Test"] = "modified"def response(flow: http.HTTPFlow):print(f"拦截到响应: {flow.request.url}")try:# 获取响应内容response_data = {"url": flow.request.url,"status_code": flow.response.status_code,"headers": dict(flow.response.headers),"content": flow.response.content.decode("utf-8")}# 发送到目标URLsession.post(TARGET_URL,json=response_data,headers={"Content-Type": "application/json"})print(f"Successfully forwarded response from {flow.request.url}")except Exception as e:print(f"Error forwarding response: {str(e)}")
写的python脚本转发url时要注意一点,要禁止使用系统代理,否则会在请求拦截上进入死循环。
通过url转发数据,后续的处理就可以使用任意语言了。例如我这里使用的PHP:
input.php
<?php$input = file_get_contents('php://input');file_put_contents('input.txt', $input . PHP_EOL . '-----------------------' . PHP_EOL, FILE_APPEND);
echo 'done', PHP_EOL;
正式运行
mitmdump -s dump.py
mitmdump的默认端口也是8080,把系统代理配置好,然后访问:https://httpbin.org/get
看下是否有内容保存了