首页 > 其他分享 >软件测试学习笔记丨Mitmproxy使用

软件测试学习笔记丨Mitmproxy使用

时间:2024-10-08 16:20:21浏览次数:8  
标签:mitmproxy 127.0 0.1 self flow 笔记 Mitmproxy 软件测试

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32334

一、简介

  • Mitmproxy是一款开源、免费的代理工具,支持Mac、Windows、Linux。
  • 相比其他代理工具,可以通过Python和Mitmproxy工具本身的插件机制,实现通过脚本对Mitmproxy的完全控制。
  • 强大的可拓展性和可定制性,可以让测试工程师以Mitmproxy工具为基础,进行二次开发,打造更适合自己业务的mock工具。

二、操作步骤

2.1 安装

  • Mitmproxy是一款跨平台工具,支持在Mac、Windows、Linux平台进行安装。
  • 最推荐的安装方式,是直接通过Python安装:
  • pip install pipx
  • pipx install mitmproxy
  • 验证是否安装成功:
  • mitmdump --version
  • 如果返回如下信息,则安装成功:
Mitmproxy: 5.2
Python:    3.8.7
OpenSSL:   OpenSSL 1.1.1g  21 Apr 2020
Platform:  macOS-10.15-x86_64-i386-64bit

2.2 证书配置

  • mitmproxy 的证书配置过程与 charles 类似

1、pc 端证书

(1)配置电脑代理,ip 配置 127.0.0.1 ,端口配置为 mitmproxy 监听端口,默认 8080

(2)启动 mitmprxy

(3)在浏览器输入地址 mitm.it,显示效果如果和下图相同,证明前面的步骤都成功了 mitmporxy

软件测试学习笔记丨Mitmproxy使用_python

(4)选择对应系统下载证书并安装。
(5)信任证书:打开证书(Mac 系统为钥匙串访问)->点击证书->双击名称含有 charles 的选项->点击信任->选择始终信任。

2、windows 证书信任

软件测试学习笔记丨Mitmproxy使用_python_02

3、手机端证书(安卓系统)

(1)在手机配置代理,ip 配置为电脑的 ip 地址,端口配置为 mitmproxy 监听端口,默认 8080。
(2)启动 mitmprxy。
(3)在手机浏览器输入地址 mitm.it
(4)选择 Android,下载并安装,即可成功抓取手机端的 https 的数据包。

2.3 三大核心工具

  • Mitmproxy的三大核心工具,分别为mitmproxy、mitmdump、mitmweb。
  • Mitmdump是Mitmproxy相比于其他代理工具,最独一无二的部分。

1、mitmproxy

  • 是一款交互式的命令行工具,通过命令mitmproxy启动,需要注意的是 mitmproxy 不支持 windows 系统。下图为 mitmproxy 启动后的效果图:

软件测试学习笔记丨Mitmproxy使用_Mac_03

2、mitmweb

  • 在 mitmweb 的图形界面中使用 mitmproxy 的主要功能,通过命令mitmweb启动。它和 Chrome 开发者工具中的 network 比较类似。下图为 mitmweb 启动后的效果图:

软件测试学习笔记丨Mitmproxy使用_软件测试_04

3、mitmdump

  • 用 mitmdump 编写强大的插件和脚本。 mitmproxy 脚本 API 提供了对 mitmproxy 的完全控制,可以自动修改消息、重定向流量、可视化消息或实现自定义命令。后面会通过实战具体介绍 mitmdump 的使用。

2.4 Mitmdump实战

1、命令

  • mitmdump 可以通过参数 -s 实现执行 python 脚本
  • 通过下面这个示例每次再发起请求时都要打印 “this is a demo”

mitm_demo.py:

from mitmproxy import http

def request(flow: http.HTTPFlow):
    #每次请求时都打印 this is a demo
    print("this is a demo")
  • 通过命令 mitmdump 执行 python 脚本:
    mitmdump -s ./mitm_demo.py

执行效果:

Loading script ./mitm_demo.py
Proxy server listening at http://*:8080
127.0.0.1:53741: clientconnect
127.0.0.1:53758: clientconnect
127.0.0.1:53759: clientconnect
127.0.0.1:53760: clientconnect
this is a demo
127.0.0.1:53758: Connection killed
127.0.0.1:53758: clientdisconnect
this is a demo
127.0.0.1:53759: Connection killed
127.0.0.1:53759: clientdisconnect

2、插件

  • mitmproxy 是通过变量addons,将一个类的实例与 mitmproxy 进行关联的。通过插件机制,可以指定在脚本运行中,与 mitmproxy 直接相关的实例。

mitm_addon.py:

from mitmproxy import ctx


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

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

addons = [
    Counter()
]
  • 有几点需要注意的是:
  • Mitmproxy 是通过 addons 这个全局变量获取以及加载插件组件。
  • 每个插件都是一个实例对象,比如上面例子中的Counter()。
  • 方法 requests 是一个事件的示例。在后面会有关于事件的具体介绍。
  • 这个插件实现了在每一次请求的时候打印累计的请求 flow 数据。

执行命令:
mitmdump -s ./mitm_demo.py

展示效果:

127.0.0.1:49625: clientconnect
We've seen 9 flows
127.0.0.1:49600: GET https://www.baidu.com/content-search.xml
              << 200 OK 220b
We've seen 10 flows
127.0.0.1:49599: GET https://www.baidu.com/home/xman/data/tipspluslist?indextype=manht&_req_seqid=0xaf491b1700068f01&asyn=1&t=1618453717212&sid=33811_33816_33745_33344_31253_33849_33758_26350_22158
              << 200 OK 78b

3、事件

  • mitmproxy 有多个事件, 每个函数或方法代表一个事件,指每一次请求响应的过程中,都会自动调用相关的方法。每一个方法的名称都是 mitmproxy 约定好的,都代表了 flow 的不同过程。
  • 许多事件通过参数接收一个 flow 对象,通过修改这些对象,插件就可以即时改变流量。
import mitmproxy.http
class Events:

    def request(self, flow: mitmproxy.http.HTTPFlow):
        """
            每次http发起请求之后会调用这个方法
        """


    def response(self, flow: mitmproxy.http.HTTPFlow):
        """
            每次http返回响应之后会调用这个方法
        """

4、mitmproxy 实现 map local

  • 创建一个本地文件,响应数据设定为
{ "status": "success" }
  • 编写脚本,在请求事件中,给响应对象赋值为设定的模拟值

mitm_map_local.py

import json

from mitmproxy import ctx, http

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

    def request(self, flow):
        if "https://httpbin.testing-studio.com/get" in flow.request.pretty_url:
            # 打开文件,读取文件数据,作为响应,给返回
            with open("./res.json", encoding="utf-8") as f:
                # 给flow.response属性进行赋值,
                # 赋值调用mitmproxy 响应对象的 make方法
                # 响应体在make函数里面所需要的数据为str
                flow.response = http.HTTPResponse.make\
                    (200,  # (optional) status code
                    f.read(),  # (optional) content
                {"Content-Type": "text/html"}  # (optional) headers
                    )

addons = [
    Counter()
]
  • 通过命令执行 python 脚本:mitmdump -s ./mitm_map_local.py
  • 浏览器访问:https://httpbin.testing-studio.com/get
  • 响应结果如图所示,成功实现 map local:https://httpbin.testing-studio.com/get

软件测试学习笔记丨Mitmproxy使用_数据_05

标签:mitmproxy,127.0,0.1,self,flow,笔记,Mitmproxy,软件测试
From: https://blog.51cto.com/u_16547786/12189997

相关文章

  • 软件测试面试中常见必问(一)内附答案
    一般面试都会按照简历当中我们写的技能或者项目进行提问,所以我们在简历当中一定要写自己能说上来的东西和对简历中的项目一定要有准备。另外,如果真的不知道就请坦诚相待,直说“不好意思,这里我不太清楚”就可以了,有的面试官也会当场告诉你答案。1.自我介绍虽然简历中都有信息,但是......
  • 深度除氟工艺-电化学法(学习笔记)
    电化学法通过以下操作达到深度除氟的目的:一、电化学原理应用电化学法主要利用电化学原理,在特定的电解装置中,通过电极的氧化还原反应,将废水中的氟离子进行转化和处理。这种转化可以是将氟离子转化为不溶性的氟化物,使其沉积在电极表面或通过其他方式从废水中分离出来。二、......
  • ROS理论与实践学习笔记——3 ROS运行管理之ROS话题名称设置
        名称重映射是为名称起别名,为名称添加前缀,该实现比节点重名更复杂些,不单是使用命名空间作为前缀、还可以使用节点名称最为前缀。两种策略的实现途径有多种:(1)rosrun命令(2)launch文件(3)编码实现3.1rosrun设置话题重映射    rosrun名称重映射语法:rorun......
  • Docker 学习笔记-基本概念与安装
    Docker学习笔记基本概念镜像:Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。DockerFile;镜像可以基于DockerFile构建,DockerFile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新......
  • 笔记——数论
    蓝月の笔记——数论篇Part0约定令\(\mathcal{P}\)为质数的集合所有时间复杂度均指上界Part1质数,\(\gcd\)质数就是只有\(1\)和本身两个因数的数,公因数就是同时使多个数的因数的数,\(\gcd\)就是最大的公因数质数求法:欧拉筛在埃氏筛的基础上优化,让每个合数都只被一个......
  • 《机器学习初步》笔记 第一章
    第一章绪论1.1引言机器学习的经典定义:利用经验(数据)改善系统自身的性能经典的机器学习过程:机器学习最重要的理论模型:PAC(概览近似正确)1.2基本术语数据集:一组记录的集合学习/训练:通过执行某个学习算法,得到模型,学的的模型对应数据的某种潜在规律示例:不包含结果(标记label)......
  • 机器学习第一章学习笔记
    第一章绪论1.1引言  在计算机系统中,“经验”通常以"数据"形式存在。书中采用"模型"泛指从数据中学得的结果。1.2基本术语  记录的集合称为一个"数据集",每条记录是关于一个事件或对象的描述,称为一个"示例"(instance)或"样本"(samp1e)。(注意:有时候整个数据集也被......
  • HTB-TwoMillion 靶机笔记
    TwoMillion靶机笔记概述HTB上的一台liunx靶机,难度定为了简单级别,它包括了对js接口的信息收集,js反混淆,未授权,越权,命令注入等漏洞。一、nmap扫描1)端口扫描nmap-sT--min-rate10000-p--oports10.10.11.221Nmapscanreportfor10.10.11.221Hostisup(0.37s......
  • 2024.7.26 集训笔记
    单调栈给定一个长度为\(n\)的数列\(a\),对每个数字求出其右/左边第一个值大于等于它的数字的位置。考虑从左到右扫整个序列,维护一个栈,里面存放可能成为答案的数字,当遍历到一个新的数\(a_i\)的时候,可以发现栈中\(\leqa_i\)的数就再也不可能成为答案了,那就把它们弹掉,此时......
  • 珂朵莉树(ODT)学习笔记
    对一个序列进行推平和查询等操作,我们难免会有过这样的想法:只维护连续段即可。但是这只是比较优的暴力,精心构造的数据可以轻松卡掉。事实上,在随机数据下,这样的算法的时间复杂度是\(\mathcal{O}(n\logn)\),这就是颜色段均摊理论,证明不会。根据这个理论产生了珂朵莉树,它可以维护区......