mitmproxy使用总结

mitmproxy是一个免费开源的交互式HTTPS代理,用于抓包和修改HTTP/HTTPS流量。它支持通过Python脚本扩展功能,如定制请求和响应处理。用户可以在Windows、Linux等系统上安装,通过mitmdump和mitmweb命令进行抓包和可视化。文章还介绍了如何配置证书、在Docker中搭建mitmproxy环境以及如何编写脚本来捕获和处理网络流量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mitmproxy is a free and open source interactive HTTPS proxy.
这官网上的一句话说明mitmproxy的身份,MITM 即中间人攻击(Man-in-the-middle attack),与charles、fidder之类的抓包工具不同的是可以增加一些自定义处理的扩展脚本(Python语言)来实现一些功能;

安装

地址

官网地址: https://mitmproxy.org/
github地址: https://github.com/mitmproxy
pypi地址: https://pypi.org/project/mitmproxy/

pip安装

pip install mitmproxy

安装验证

完成后,系统将拥有 mitmproxy、mitmdump、mitmweb 三个命令,由于 mitmproxy 命令不支持在 windows 系统中运行(这没关系,不用担心),可以拿 mitmdump 测试一下安装是否成功,执行

mitmdump --version

来源:

Mitmproxy的使用_mitmproxy使用_xian_wwq的博客-优快云博客

docker搭建mitmproxy环境

docker pull mitmproxy/mitmproxy
docker run --rm -it -p 8082:8080 -p 8081:8081 -v /data/mitm/script/mitm/:/mitm/ mitmproxy/mitmproxy mitmweb -s /mitm/addons.py --set block_global=false --web-iface 0.0.0.0 

证书配置

pc电脑安装证书

mitmproxy 中想要截取 HTTPS 请求,就需要设置证书,mitmprxoy 在安装设置后会提供一套 CA 证书,只要客户端信任了 mitmproxy 提供的证书,就可以通过 mitmproxy 获取 HTTPS 请求的具体内容,否则 mitmproxy 无法解析 HTTPS 请求,启动 mitmdump 会产生 CA 证书:
打开文件夹资源管理器:C:\Users\Administrator\.mitmproxy

点击 mitmproxy-ca.p12 进入证书导入向导,直接点击下一页

 

 

 

 

 

 

手机模拟器安装证书

将 mitmproxy-ca-cert.pem 直接拖拽到模拟器中,会自动保存至共享文件夹

 

打开设置--点击安全--选择从SD卡安装--找到证书文件--点击安装

来源

mitmproxy 的安装使用 与 模拟器上的证书配置_mitmproxy证书_Yy_Rose的博客-优快云博客

命令使用

mitmproxy 安装以后提供了三个执行程序:mitmproxy, mitmdump, mitmweb,直接在控制台输入即可。
mitmproxy:提供了 shell 交互式的抓包界面,但是只能在 Linux 环境中使用
mitmdump:后台抓包,一般windows下都是使用这个命令,本文案例就是使用它来执行抓包。
mitmweb:会在默认浏览器打开一个抓包可视化的界面,一般很少用到。
常用的参数:
-w 指定输出的文件
-s 指定抓包时执行的脚本

mitmdump -s xxx.py

来源

通过mitmproxy爬取西瓜视频app数据保存到mongodb数据库_1yshu的博客-优快云博客_西瓜视频抓包

脚本定制

我们经常用的方法是这两个

def request(self, flow: mitmproxy.http.HTTPFlow):
def response(self, flow: mitmproxy.http.HTTPFlow):

request()

属性    描述
request = flow.request    获取到request对象,对象包含了诸多属性,保存了请求的信息
request.url    请求的url(字符串形式),修改url并不一定会生效,因为url是整体的,包含了host、path、query,最好从分体中修改
request.host    请求的域名,字符串形式
request.headers    请求头,Headers形式(类似于字典)
request.content    请求内容(byte类型)
request.text    请求内容(str类型)
request.json()    请求内容(dict类型)
request.data    请求信息(包含协议、请求头、请求体、请求时间、响应时间等内容)
request.method    请求方式,字符串形式,如POST、GET等
request.scheme    协议,字符串形式,如http、https
request.path    请求路径,字符串形式,即url中除了域名之外的内容
request.query    url中的键值参数,MultiDictView类型的数据(类似于字典)
request.query.keys()    获取所有请求参数键值的键名
request.query.get(keyname)    获取请求参数中参数名为keyname的参数值
 

response()

属性    描述
response = flow.response    获取到response对象,对象包含了诸多属性,保存了请求的响应信息
response.status_code    响应码
response.text    响应数据(str类型)
response.content    响应数据(Bytes类型)
response.headers    响应头,Headers形式(类似于字典)
response.cookies    响应的cookie
response.set_text()    修改 响应数据
response.get_text()    响应数据(str类型)
flow.response = flow.response.make(status_code, content, headers)    设置响应信息
 

来源:

https://www.cnblogs.com/yoyo1216/p/16165758.html

mitmproxy_wenxiaoba的博客-优快云博客

python脚本样例

import mitmproxy.http
import pickle
import os
import json
 
 
class GetSeq:
 
    def __init__(self, domains=[], url_pattern=None, ):
        self.num = 1
        self.dirpath = "./flows/"
        if not os.path.exists(self.dirpath):
            os.mkdir(self.dirpath)
        self.domains = domains
        self.url_pattern = url_pattern
 
    def http_connect(self, flow: mitmproxy.http.HTTPFlow):
        """
            An HTTP CONNECT request was received. Setting a non 2xx response on
            the flow will return the response to the client abort the
            connection. CONNECT requests and responses do not generate the usual
            HTTP handler events. CONNECT requests are only valid in regular and
            upstream proxy modes.
        """
 
    def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
        """
            HTTP request headers were successfully read. At this point, the body
            is empty.
        """
 
    def request(self, flow: mitmproxy.http.HTTPFlow):
        """
            The full HTTP request has been read.
        """
 
    def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
        """
            HTTP response headers were successfully read. At this point, the body
            is empty.
        """
 
    def response(self, flow: mitmproxy.http.HTTPFlow):
        """
            The full HTTP response has been read.
        """
 
        # 自行更改这里的保存代码,此处仅供参考
        def save_flow():
            fname = "{}flow-{:0>3d}-{}.pkl".format(self.dirpath, self.num, flow.request.host)
            pickle.dump({
                "num": self.num,
                "request": flow.request,
                "response": flow.response
            }, open(fname, "wb"))
 
            log_data = dict(
                num = self.num,
                url = flow.request.url,
                fname = fname
            )
 
            with open("flow_que.log", "a+", encoding="utf8") as f:
                s = json.dumps(log_data)
                f.write(s)
 
            self.num += 1
 
 
        # 添加自己的过滤需求
        if flow.request.headers.get('content-type', None) == "application/json":
            save_flow()
 
        if len(self.domains) == 0: save_flow()
        for domain in self.domains:
            if domain in flow.request.url:
                save_flow()
                
 
 
    def error(self, flow: mitmproxy.http.HTTPFlow):
        """
            An HTTP error has occurred, e.g. invalid server responses, or
            interrupted connections. This is distinct from a valid server HTTP
            error response, which is simply a response with an HTTP error code.
        """
 
addons = [
    GetSeq(
        domains=[
            "baidu.com",
        ],
        url_pattern = None,
    )
]

 保存json进入mysql

import mitmproxy.http
import pickle
import os
import json

import pymysql
from pymysql.converters import escape_string


class GetSeq:

    def __init__(self, domains=[], url_pattern=None, ):
        self.num = 1
        self.dirpath = "./flows/"
        if not os.path.exists(self.dirpath):
            os.mkdir(self.dirpath)
        self.domains = domains
        self.url_pattern = url_pattern

    def http_connect(self, flow: mitmproxy.http.HTTPFlow):
        """
            An HTTP CONNECT request was received. Setting a non 2xx response on
            the flow will return the response to the client abort the
            connection. CONNECT requests and responses do not generate the usual
            HTTP handler events. CONNECT requests are only valid in regular and
            upstream proxy modes.
        """

    def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
        """
            HTTP request headers were successfully read. At this point, the body
            is empty.
        """

    def request(self, flow: mitmproxy.http.HTTPFlow):
        """
            The full HTTP request has been read.
        """

    def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
        """
            HTTP response headers were successfully read. At this point, the body
            is empty.
        """

    def response(self, flow: mitmproxy.http.HTTPFlow):
        """
            The full HTTP response has been read.
        """

        # 自行更改这里的保存代码,此处仅供参考
        def save_flow():
            url=flow.request.url
            print("url*********************"+url)
            if(url.startswith("https://www.douyin.com/aweme/v1/web/aweme/post/")):
                print("url=====>>>"+url)
                self.save2db(url,flow.response.text)
        #快手
        # print("url=========>>>>>>>>>>"+flow.request.url)
        if(flow.request.url.startswith("https://www.kuaishou.com/graphql")):
            post_data=flow.request.text
            print("post_url========>>>>>>"+flow.request.url)
            print("post_data====="+post_data)
            print("resp_txt===="+flow.response.text)



        # 添加自己的过滤需求
        if(flow.request.url.startswith("https://www.douyin.com/aweme/v1/web/aweme/post/")):
            # with open("flow_que.log_"+str(self.num), "a+", encoding="utf8") as f:
            #     s = flow.response.text
            #     f.write(s)
            try:
                flow.request.urlencoded_form.keys()
                save_flow()
            except Exception as e:
                print("save error happen "+str(e))

            self.num += 1


    def error(self, flow: mitmproxy.http.HTTPFlow):
        """
            An HTTP error has occurred, e.g. invalid server responses, or
            interrupted connections. This is distinct from a valid server HTTP
            error response, which is simply a response with an HTTP error code.
        """

    def format_field( self,msg):
        print("msg=="+msg)
        #mitmdump中字符串保存mysql必须自己加引号,json的保存必须用escape_string转换一下
        return "\""+escape_string(str(msg))+"\""


    #保存mysql
    def save2db(self,url,resp_txt):
        # 连接数据库
        conn = pymysql.connect(host='192.168.10.231',
                               port=3307,
                               user='bj',
                               password='bj2016',
                               database='test')
        # 建立cursor游标
        cursor = conn.cursor()
        sql_tmp="""insert into test.mitmproxy_log (url,resp_txt) values (%s,%s) """

        url=self.format_field(url)
        resp_txt=self.format_field(resp_txt)
        sql=sql_tmp%(url,resp_txt)
        try:
            cursor.execute(sql)
            conn.commit()
        except Exception as e:
            conn.rollback()
            print("insert error "+str(e))
        finally:
            cursor.close()
            conn.cursor()

addons = [
    GetSeq(
        domains=[
            "baidu.com",
        ],
        url_pattern=None,
    )
]

来源

mitmproxy_录制接口并保存到mysql(踩坑史)_你是猴子请来的救兵吗!!的博客-优快云博客_mitmproxy怎么将访问记录存入数据库

https://www.cnblogs.com/lynsha/p/16517354.html

<think>好的,我现在需要帮助用户解决如何在Python中安装mitmproxy库的问题。根据用户提供的引用内容,首先,我需要确认用户的需求是什么。用户明确提到想安装Pythonmitmproxy库,所以主要步骤应该围绕安装过程展开。 首先,我应该检查用户的Python环境是否符合要求。根据引用[2],mitmproxy需要Python版本不低于3.6,并且要有pip工具。因此,在安装之前,用户需要确保已经安装了正确版本的Python和pip。如果用户没有安装,可能需要先指导他们安装Python,但用户的问题似乎已经假设用户有Python环境,所以可能不需要详细说明Python的安装步骤,但提醒用户检查版本还是有必要的。 接下来,安装命令。引用[1]、[2]、[3]都提到了使用pip install mitmproxy这个命令。所以基本的安装步骤应该是通过pip来安装。不过,根据不同的操作系统,可能有些差异。例如,引用[2]提到在Windows系统中需要以管理员权限运行cmd或PowerShell,执行安装命令。而Linux/macOS可能不需要管理员权限,但可能需要使用sudo。这里需要分步骤说明不同系统的注意事项。 然后,安装后的验证步骤。在Windows上,由于不支持mitmproxy命令,用户需要使用mitmdump --version来检查是否安装成功,如引用[2]所示。而Linux/macOS可能可以直接运行mitmproxy --version。这部分需要分别说明,确保用户能够正确验证安装结果。 另外,用户可能遇到的问题,比如权限不足导致安装失败,这时候需要提醒用户使用管理员权限运行命令行工具。另外,环境变量的问题,如果pip不在系统路径中,用户可能需要将Python的Scripts目录添加到环境变量中,或者使用conda环境,如引用[3]提到的conda env list来查看当前环境。 此外,引用[4]提到mitmproxy的优势,特别是与Python脚本结合使用的能力,这部分可以作为补充信息,让用户了解安装后的用途,但可能不是安装步骤的核心内容,不过可以提及以增强用户的兴趣。 可能还需要考虑用户是否使用了虚拟环境,比如venv或者conda环境。如果用户使用conda,可能需要激活相应的环境后再执行安装命令,如引用[3]中的例子。这时候,指导用户如何查看当前环境是有帮助的。 总结一下,安装步骤可以分为以下几个部分: 1. 确认Python版本和pip的存在。 2. 根据不同操作系统执行安装命令,注意权限问题。 3. 验证安装是否成功。 4. 可能遇到的问题及解决方法,如权限、环境变量等。 在编写回答时,需要结构清晰,分步骤说明,同时覆盖不同操作系统的差异。此外,引用相关的引用内容作为支持,确保信息的准确性。比如,引用[2]详细描述了Windows下的安装过程,包括截图和验证步骤,所以需要将其整合到回答中。 最后,生成相关问题,可以围绕安装后的使用、常见问题解决、mitmproxy的功能等进行提问,帮助用户进一步学习。例如,如何编写mitmproxy插件,如何配置代理等,但需要根据引用内容中提到的点来生成问题,比如引用[4]提到的脚本和API的使用,可以生成相关问题。 现在需要确保回答符合用户的要求,使用中文,结构清晰,正确引用来源,并且没有使用任何markdown格式。同时,检查是否有遗漏的步骤或可能的错误点,比如是否需要安装其他依赖库,但根据引用内容,似乎直接使用pip install即可,不需要额外步骤。</think>### 如何在Python中安装mitmproxy库? #### 1. 环境要求 - **Python版本**:不低于3.6(推荐使用最新稳定版)[^2]。 - **包管理工具**:确保已安装`pip`(Python默认包含)。 #### 2. 安装步骤(通用方法) **所有操作系统**均可通过以下命令安装: ```bash pip install mitmproxy ``` #### 3. 操作系统差异 - **Windows系统**: 1. 以管理员身份运行**CMD**或**PowerShell**。 2. 执行安装命令: ```bash pip install mitmproxy ``` 3. 验证安装: ```bash mitmdump --version ``` 若显示版本号(如`10.2.4`),则安装成功。 - **Linux/macOS系统**: 1. 普通用户可能需要添加`sudo`权限: ```bash sudo pip install mitmproxy ``` 2. 验证安装: ```bash mitmproxy --version ``` #### 4. 常见问题解决 - **权限不足**:Windows需使用管理员权限运行终端;Linux/macOS可尝试`sudo`。 - **环境变量问题**:若提示命令未找到,需将Python的`Scripts`目录添加到系统环境变量(如Windows默认路径为`C:\PythonXX\Scripts`)[^3]。 - **虚拟环境**:若使用`conda`或其他虚拟环境,需先激活对应环境再安装。 #### 5. 安装后验证 - 运行以下命令启动代理: ```bash mitmproxy ``` 若成功启动交互式界面,则表明安装完成(Windows需使用`mitmweb`或`mitmdump`代替)[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值