python+mitmproxy抓包的实现

 更新时间:2025年04月29日 09:39:47   作者:funcdefmain  
mitmproxy是基于Python的第三方库,配合Python脚本可以篡改请求和响应数据,使用起来相对简单,下面就来介绍一下python+mitmproxy抓包的实现,感兴趣的可以了解一下

什么是mitmproxy

Mitmproxy 就是用于 MITM 的 Proxy,MITM 即中间人攻击(Man-in-the-middle attack)。不同于 fiddler ,charles或 wireshark 等抓包工具,mitmproxy 不仅可以抓取请求响应帮助开发者查看、分析,更可以通过自定义python脚本进行二次开发。

安装

pip安装

pip install mitmproxy
# 验证
mitmproxy --version

安装证书

打开系统代理,将系统代理设置为127.0.0.1:8080(mitmproxy默认代理)或192.168.xxx.xxx:8080(本机ip,用于局域网)

cmd输入mitmproxy, 浏览器访问 http://mitm.it/,下载证书安装。

代码安装(自动化)

设置系统代理(win)

import ctypes
import winreg


def set_proxy(enable_proxy, proxy_address="http://127.0.0.1:8080"):
    try:
        # 代理服务器地址和端口
        proxy_server = proxy_address

        # 打开注册表键
        key_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_SET_VALUE)

        # 设置代理服务器
        if enable_proxy:
            winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, proxy_server)
            winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 1)
        else:
            # 关闭代理
            winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 0)

        # 刷新代理设置
        INTERNET_OPTION_REFRESH = 37
        INTERNET_OPTION_SETTINGS_CHANGED = 39
        internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
        internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)
        internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)

        # 关闭注册表键
        winreg.CloseKey(key)
        print("系统代理设置成功!")
    except Exception as e:
        print(f"设置系统代理失败: {e}")


if __name__ == "__main__":
    # 设置代理(启用代理)
    set_proxy(enable_proxy=True, proxy_address="http://127.0.0.1:8080")
    # 设置代理(关闭代理)
    # set_proxy(enable_proxy=False)

安装证书(certutil.exe -addstore root mitmproxy-ca-cert.cer)

import subprocess
import platform


def is_mitmproxy_cert_installed():
    try:
        # 使用 PowerShell 检查证书是否存在
        res = subprocess.check_output(['powershell',
                                       'Get-ChildItem -Path Cert:\CurrentUser\Root | Where-Object {$_.Subject -like "*mitmproxy*"}'])
        if res:
            return True
        return False
    except subprocess.CalledProcessError as e:
        return False


def install_mitmproxy_certificate(cert_path):
    system_platform = platform.system()
    if system_platform == "Windows":
        # Windows系统下使用certutil命令
        try:
            res = subprocess.run(["certutil.exe", "-addstore", "root", cert_path], check=True, capture_output=True,
                                 text=True)
            print(res)
            print("Mitmproxy证书已成功安装到根证书存储中。")
        except subprocess.CalledProcessError as e:
            print(f"安装Mitmproxy证书失败: {e}")


if __name__ == "__main__":
    if is_mitmproxy_cert_installed():
        print("Mitmproxy证书已安装")
    else:
        print("Mitmproxy证书未安装")
        # 替换为实际的证书路径
        certificate_path = r"mitmproxy-ca-cert.cer"
        install_mitmproxy_certificate(certificate_path)

# "certmgr.msc"

运行

可以用 mitmproxymitmdumpmitmweb 这三个命令中的任意一个

  • mitmproxy (只能在命令行窗口)命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据
  • mitmweb 命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据
  • mitmdump 命令启动后,没有界面,结合自定义脚本,默默工作

代码启动

方式一

import os

import set_proxy

if __name__ == '__main__':
    try:
        set_proxy(enable_proxy=True, proxy_address="http://127.0.0.1:8080")
        os.system("mitmweb")
        # os.system("mitmdump -s .\my_script.py")
    except KeyboardInterrupt:
        set_proxy(enable_proxy=False)

方式二

import asyncio
import os

from mitmproxy import options
from mitmproxy.tools.dump import DumpMaster


import set_proxy
import my_script


async def start_mitmproxy():
    opts = options.Options(listen_host='0.0.0.0', listen_port=8080)
    master = DumpMaster(opts)
    master.addons.add(my_script)
    await master.run()


if __name__ == '__main__':
    try:
        set_proxy(enable_proxy=True, proxy_address="http://127.0.0.1:8080")
        asyncio.run(start_mitmproxy())
    except KeyboardInterrupt:
        set_proxy(enable_proxy=False)

脚本

需要根据需求开发

方式一:编写一个 py 文件,文件中定义了若干钩子函数(可查 https://docs.mitmproxy.org/stable/api/events.html)

主要是request和response修改请求响应等

import logging
import mitmproxy.http

num = 0
 
def request(flow: mitmproxy.http.HTTPFlow):
    global num
    num = num + 1
    print("We've seen %d flows" % num)

方式二:编写一个 py文件,文件定义了变量 addons插件列表,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的钩子事件。

import logging


class Counter:
    def __init__(self):
        self.num = 0

    def request(self, flow):
        self.num = self.num + 1
        logging.info("We've seen %d flows" % self.num)


addons = [Counter()]

更多实例前往github查看 脚本示例。

这里记录一个重订向url的获取:用requests可以直接拿到resp.url 或者使用 flow.response.headers.get(“location”)

到此这篇关于python+mitmproxy抓包的实现的文章就介绍到这了,更多相关python mitmproxy抓包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python数据分析中常见统计方法详解

    Python数据分析中常见统计方法详解

    数据分析是现代社会中不可或缺的一部分,通过对数据的统计和分析,我们可以得出有用的信息和见解,本文将介绍在 Python 中常见的数据统计方法,希望对大家有所帮助
    2024-02-02
  • 跟老齐学Python之复习if语句

    跟老齐学Python之复习if语句

    是否记得,在上一部分,有一讲专门介绍if语句的:从if开始语句的征程。在学习if语句的时候,对python编程的基础知识了解的还不是很多,或许没有做什么太复杂的东西。本讲要对它进行一番复习,通过复习提高一下。如果此前有的东西忘记了,建议首先回头看看前面那讲。
    2014-10-10
  • 在cmd中查看python的安装路径方法

    在cmd中查看python的安装路径方法

    在本篇文章里小编给大家整理的是关于怎样在cmd中查看python的安装路径的相关内容,有兴趣的朋友们学习参考下。
    2019-07-07
  • PyQt5的QWebEngineView使用示例

    PyQt5的QWebEngineView使用示例

    这篇文章主要介绍了PyQt5的QWebEngineView使用示例,帮助大家更好的学习和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • 一文详解Python算术运算符(加减乘除取模幂)

    一文详解Python算术运算符(加减乘除取模幂)

    本章讲解了Python中的算术运算符(加减乘除取模幂)的重要性和应用场景,详细介绍了其技术原理和实践应用,并提供了常见问题与解决方案、最佳实践和性能优化技巧,为后续学习赋值运算符打下基础,需要的朋友可以参考下
    2026-05-05
  • Python 字典一个键对应多个值的方法

    Python 字典一个键对应多个值的方法

    这篇文章主要介绍了Python 字典一个键对应多个值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • pydoc​生成Python代码文档实例

    pydoc​生成Python代码文档实例

    pydoc​是一个强大且易于使用的工具,用于生成Python代码的文档,通过解析代码中的文档字符串,​pydoc​能够自动生成清晰、易读的文档,并提供一个用户友好的界面来查看和浏览文档,本文提供了一个简单的示例
    2024-01-01
  • python函数参数,名称空间,以及函数嵌套

    python函数参数,名称空间,以及函数嵌套

    这篇文章主要给大家介绍python函数参数、名称空间、以及函数嵌套的相关资料,想具体了解的小伙伴请和小编一起进入下面文章内容吧
    2021-10-10
  • TensorFlow如何实现反向传播

    TensorFlow如何实现反向传播

    这篇文章主要为大家详细介绍了TensorFlow如何实现反向传播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • keras-siamese用自己的数据集实现详解

    keras-siamese用自己的数据集实现详解

    这篇文章主要介绍了keras-siamese用自己的数据集实现详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06

最新评论