mitmproxy

news2024/10/7 20:26:49

我们经常了解到的抓包工具有wireshark、fiddler、charles等,mitmproxy也是一个代理工具,突出的优点是可以命令行方式或脚本的方式进行代理,可以对请求数据进行二次开发(二次定制)
官网:https://mitmproxy.org/
官方文档:https://docs.mitmproxy.org/stable/
本章的学习是参考了这篇优秀教程:使用 mitmproxy + python 做拦截代理

本文侧重点是二次定制内容

安装

mitmproxy是基于python环境进行二次定制的,我们需要先配置python环境,python环境的配置可以网上找教程,这里不细述了。
注意:最好是配置python3.8及以上的python环境,如果是以下的版本,则最好安装5.2.0版本的mitmproxy,因为其他的版本有编码问题

配置好python环境,通过pip安装mitmproxy
pip install mitmproxy
通过mitmdump --version可以查看mitmproxy是否安装成功,安装成功的话,命令打印内容如下:

Mitmproxy: 9.0.1
Python:    3.10.7
OpenSSL:   OpenSSL 3.0.7 1 Nov 2022
Platform:  Windows-10-10.0.19044-SP0

安装证书

现在很多请求都是https的,https的抓包需要安装证书。第一次启动mitmproxy时,就会在当前用户目录下生成.mitmproxy目录,目录存放了证书相关信息,官网对于证书的描述如下:
在这里插入图片描述

windows端

启动时是用的Administrator用户,所以我是在Administrator目录下找到.mitmproxy目录:
在这里插入图片描述
根据官网的描述,windows用的是mitmproxy-ca-cert.p12这个,双击完成证书安装
在这里插入图片描述
在这里博主遇到了一个坑,就是证书已经安装了,但是访问https还是报了有风险,可以通过netstat -ano | findstr "端口号"查看端口被占用情况,如果有多个应用占用,我们就重启mitmproxy,使用Ctrl+c停止当前的mitmproxy,然后使用mitmdump -p 新端口命令占用其他端口,再去抓包https就不会有报错了。

Android端

Android端的大部分请求都是https,如果想抓包Android的请求,需要:

  • 步骤1:Android设备与mitmproxy代理在同一个局域网内,比如连接同一个wifi
  • 步骤2:Android设备连接的网络设置代理,让请求通过mitmproxy代理
  • 步骤3:Android设备下载证书并安装(证书安装了才支持正常进行https抓包)
    Android设备设置代理
    在这里插入图片描述
    Android设备访问mitm.it网站下载证书,然后进行安装
    在这里插入图片描述
    注意:有些手机对证书做了限制,无法正常下载和安装证书,我们可以在mitmproxy所在设备中,设置浏览器通过代理,然后用浏览器访问mitm.it网站,下载对应证书,传输给手机,手机在【设置】中搜索“证书”,选择【安装证书】进行安装。

启动mitmproxy

我们可以通过mitmproxymitmdumpmitmweb中任意一个命令即可启动mitmproxy,这3个命令的功能是一致的,只是交互界面不太一样
如下是mitmproxy的交互界面:类似于命令行界面,实时展示抓包到的请求,能通过命令行窗口底下的提示进行请求过滤、数据查看等
在这里插入图片描述
mitmdump类似于linux的tail,只能默默看着数据一溜烟的更新,还不能过滤
在这里插入图片描述

mitmweb命令启动后,除了命令行会像mitmdump一样打印抓包到的请求外,还会自动打开一个web页面,显示抓包到的请求,在web页面,可以对请求进行过滤、查看等

在这里插入图片描述
mitmweb命令启动后,前2行会打印监听端口web服务端口,如上,mitmweb执行后,第一行说明mitmproxy监听了8080端口,第二行说明了可以通过 http://127.0.0.1:8081/ 打开web页面(会自动打开)
在这里插入图片描述
在web界面,Search是对请求数据进行过滤;Intercept对匹配的请求进行暂停操作(可),类似于fiddler或charles的断点。

在这里插入图片描述
我们将age编辑为233,然后点击Done按钮退出编辑状态,点击左上角的Resume进行执行生效,如下图:
在这里插入图片描述
浏览器显示响应体的内容如下:
上传的是age为20,正常情况下响应体中的age应该也是20,但是因为经过了mitmproxy代理的修改,所以响应体报文中实际展示的是代理修改后的数据233。
在这里插入图片描述

mitmproxy代理启动时,若没有指定端口的话,默认占用的是8080端口,如果想指定其他端口,则可以添加-p 端口号指定端口,比如mitmweb -p 8089表示mitmweb方式启动mitmproxy,mitmproxy监听的端口是8089

启动参数

启动mitmproxy常用的参数有:

参数格式说明
-p 端口号指定监听端口
-s xxx.py执行指定脚本
-w 文件完整路径指定输出文件
-q quiet仅匹配脚本过滤后的数据包(即不输出不符合脚本的请求信息)
"~m postm表示method,当前表示仅匹配post请求

脚本定制

在教程:使用 mitmproxy + python 做拦截代理 中,有对请求的生命周期进行说明,但是我们经常用到的是如下2个:

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

本文主要对这2个事件进行展开。

入门

我们先简单的入门下,了解事件是怎么使用的。以下是统计http或https的请求数:
count.py内容如下:

import mitmproxy.http

class CountDemo:
    # 从请求的角度来统计http请求数量,如果想从响应的角度来统计的话,可以使用response()
    def request(self, flow: mitmproxy.http.HTTPFlow):
        # 如果对象中已经有num属性,则num属性加1
        if hasattr(self, "num"):
            self.num += 1
        else:
            # 如果对象中没有num属性,则直接赋属性值为1
            setattr(self, "num", 1)
        # 显示当前请求数量
        print(f"当前http/https的请求总数量为:{self.num}")

# 变量名必须为addons,列表元素必须是相关实例(即对象)
addons = [
    CountDemo()
]

在count.py当前目录下,执行mitmweb -s count.py命令,刷新浏览器页面,显示如下:
在这里插入图片描述

request()

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

从请求数据开始处理,即请求发送到服务端前进行处理,以下是一些可能常用的属性说明:

属性描述
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.queryurl中的键值参数,MultiDictView类型的数据(类似于字典)
request.query.keys()获取所有请求参数键值的键名
request.query.get(keyname)获取请求参数中参数名为keyname的参数值

示例:
demo.py的内容如下:

import mitmproxy.http

class Demo:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        rq = flow.request
        print("---------------开始---------------")
        print(f"url:{rq.url}\n")
        print(f"host:{rq.host}\n")
        print(f"headers:{rq.headers}\n")
        print(f"method:{rq.method}\n")
        print(f"scheme:{rq.scheme}\n")
        print(f"path:{rq.path}\n")
        print(f"query:{rq.query}\n")
        print(f"content: {rq.content}\n")
        print(f"text: {rq.text}\n")
        print(f"json: {rq.json()}\n")
        print(f"data: {rq.data}\n")
        print("---------------结束---------------")

addons = [
    Demo()
]

发送一个post请求:https://postman-echo.com/post?from=en&to=zh
命令行窗口打印如下:
在这里插入图片描述

接口说明:postman-echo.com/post接口支持任意的url参数和请求体设置,响应报文会根据上传的请求头、请求的url参数、请求体进行返回。

以下从几个示例中进行理解:

修改请求头

接口信息:

请求协议:https
域名:httpbin.org
路径:/get
参数:可以任意设置
响应数据:包含请求的请求头信息、请求参数信息和请求的其他信息

需求:修改接口的请求头内容,修改字段为:user-agent、content-type、cookie
脚本modify_headers的内容如下:

import mitmproxy.http

class ModifyDemo:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        rq = flow.request
        if "httpbin.org" in rq.url:
            rq.headers["user-agent"] = "listen in mitmproxy"
            rq.headers.update({
                "content-type": "personal make",
                "cookie": "key1=value1; key2=value2"
            })
addons = [
    ModifyDemo()
]

mitmweb -s modify_headers.py命令启动mitmproxy代理,并执行modify_headers.py脚本,对比未走代理和走了代理的结果如下:
在这里插入图片描述

重定向

需求:在百度搜索的内容,重定向到必应搜索
脚本redirect.py的内容如下:

import mitmproxy.http

class RedirectDemo:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        rq = flow.request
        if "www.baidu.com" in rq.host and "wd=" in rq.url:
            sw = rq.query.get('wd')
            # 由于sw获取到的数据是ascii编码格式的内容,脚本默认的是utf-8格式的,所以url处理时需要将sw进行编码处理
            rq.url = f"https://cn.bing.com/search?q={sw.encode('utf-8')}"
            rq.host = "cn.bing.com"
            rq.query.clear()
            rq.query.update({"q": sw})

addons = [
    RedirectDemo()
]

未启动代理时,百度搜索结果和必应搜索结果如下:
在这里插入图片描述
启动mitmproxy代理后,百度搜索被重定向到了必应搜索,显示了必应搜索结果页面
在这里插入图片描述

修改请求体内容

需求:修改postman-echo.com请求体中的年龄,给httpbin.org请求体增加gender字段
分析:我们可以从text、content、json()中获取请求体的内容,但是json()是个方法,所以无法从json()方法中进行请求体的修改,但我们可以从text和content这2个属性中进行修改
modify_req_body.py的内容如下:

# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
import mitmproxy.http
import json

class ModifyReqBodyDemo:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        req = flow.request
        if "postman-echo.com" == req.host:
            jdata = req.json()
            jdata.update({"age": 26})
            req.text = json.dumps(jdata)
        if "httpbin.org" == req.host:
            con = req.content
            req.content = con.title() + ",学习进度70%".encode("utf-8")

addons = [
    ModifyReqBodyDemo()
]

执行结果如下:

在这里插入图片描述

接口说明:postman-echo.com/posthttpbin.org/post接口的逻辑是一样的,均支持任意的url参数和请求体设置,响应报文会根据上传的请求头、请求的url参数、请求体进行返回。

response()

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

从获取到请求的响应数据开始处理,即代理收到服务端返回的响应数据,但是还没将数据发送给客户端的情况下进行处理,以下是一些可能常用的属性说明:

属性描述
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)设置响应信息

示例:
脚本resp_demo.py的内容如下:

import mitmproxy.http

class Demo:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        resp = flow.response
        print(f"类型:{type(resp.status_code)},内容:{resp.status_code}\n")
        print(f"类型:{type(resp.text)},内容:{resp.text}\n")
        print(f"类型:{type(resp.content)},内容:{resp.content}\n")
        print(f"类型:{type(resp.headers)},内容:{resp.headers}\n")
        print(f"类型:{type(resp.cookies)},内容:{resp.cookies}\n")

addons = [
    Demo()
]

访问 https://httpbin.org/get?name=%E6%B8%A9%E5%B0%8F%E5%85%AB&age=18的情况如下:
在这里插入图片描述

修改响应报文体

需求:将百度搜索结果中的”国足垃圾“修改成”中国男足垃圾“(女足好样的!!!)
modify_resp_body.py脚本内容如下:

import mitmproxy.http

class ModifyRespBodyDemo:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        req = flow.request
        resp = flow.response
        if "baidu.com" in req.url:
            t = resp.text
            new = t.replace("国足垃圾", "中国男足垃圾")
            resp.text = new

addons = [
    ModifyRespBodyDemo()
]

代理执行前后变化如下:
在这里插入图片描述

修改响应状态

我们知道响应状态码是status_code字段,但是客户端并不一定是根据status_code字段值去处理响应错误的情况,flow.response提供了flow.response.make(status_code, content, headers)方法来修改响应信息

使用格式:flow.response = flow.response.make(status_code=200, content=b"", headers=())

  • status_code:响应状态码,int类型,默认为200
  • content:响应报文体内容,可以传入字符串数据
  • headers:响应头,可以传入字典数据

在这里插入图片描述
需求:如果百度搜索中包含敏感词,则返回违规说明;如果识别到是必应搜索,则直接返回404(
modify_resp_status.py脚本如下:

import mitmproxy.http

class ModifyRespStatusDemo:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        req = flow.request
        if "baidu.com" in req.host and "wd" in req.query:
            if req.query.get("wd") in ["十八禁", "AV", "迷药", "杀人"]:
                flow.response = flow.response.make(
                    status_code=400,
                    content="""<title>访问违规</title>
                                        <h1>涉及访问不健康内容,数据已上报</h1>
                                        <a href='https://www.bilibili.com/' target='_blank'>哔哩哔哩</a>
                                        """,
                    headers={"content-type": "text/html"}
                )
        elif "cn.bing.com/" in req.host:
            flow.response = flow.response.make(404)

        # 以下的写法无效
        # resp = flow.response
        # resp = resp.make(404)

addons = [
    ModifyRespStatusDemo()
]

执行结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10 张图解 K8S CNI Calico 网络模型原理与功能实战

一、概述 Calico 是一个联网和网络策略供应商。Calico 支持一套灵活的网络选项&#xff0c;因此你可以根据自己的情况选择最有效的选项&#xff0c;包括非覆盖和覆盖网络&#xff0c;带或不带 BGP。Calico 使用相同的引擎为主机、Pod 和&#xff08;如果使用 Istio 和 Envoy&am…

Nginx:配置

文章目录1、Nginx 工作原理2、Nginx 安装启动2.1、安装2.2、启动3、配置文件3.1、块配置3.2、代理 & 负载均衡3.2.1、代理正向代理反向代理3.2.2、负载均衡3.3、Nginx 缓存3.4、Nginx 限流4、http 配置使用4.1、配置结构4.2、配置命令4.2.1、设置配置命令4.2.2、设置回调方…

你也还在找程序员外包平台吗?有这几个就足够了!

大家都知道&#xff0c;如果程序员想在工作之余赚一点外快的话&#xff0c;接外包是所有兼职赚钱之中来钱比较快的一种。但是要找到一些比较靠谱的&#xff0c;能够经常使用的接外包平台&#xff0c;似乎是一件费时又费力的事情。 接下来就为大家推荐几个比较好的程序员接外包的…

Python_数据容器_列表list

一、数据容器入门 使用场景&#xff1a;批量存储、批量使用多份数据 Python中的数据容器&#xff1a; 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为一个元素。每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 总结&…

Windows下的RabbitMQ 安装

1.到rabbitmq官网下载安装程序 Messaging that just works — RabbitMQ 1.1 我选择的事RabbitMQ 3.11.3 1.2 点击链接后进入下面的界面 1.3 继续点击RabbitMQ 3.11.3 release 链接 Release RabbitMQ 3.11.3 rabbitmq/rabbitmq-server GitHub 1.4 在页面最下面可以看到下…

葡萄糖-聚乙二醇-四嗪/叶酸/多巴胺 Glucose-PEG-TZ/FA/Dopamine

葡萄糖-聚乙二醇-四嗪/叶酸/多巴胺 Glucose-PEG-TZ/FA/Dopamine 叶酸是一种水溶性维生素&#xff0c;分子式是C19H19N7O6。因绿叶中含量十分丰富而得名&#xff0c;又名蝶酰谷氨酸。在自然界中有几种存在形式&#xff0c;其母体化合物是由蝶啶、对氨基苯甲酸和谷氨酸3种成分结…

购物车案例的实现

最终效果&#xff1a; 1.计算属性 用于计算最终价格&#xff0c;对此计算使用计算属性最佳 原理是遍历books中的每一个属性&#xff0c;价格*数量 computed:{totalPrice(){let totalPrice0// 1.普通的for循环// for (let i0;i<this.books.length;i)// {// totalPriceth…

java+jsp+servlet+mysql高速公路事故管理(交通管理)系统

项目介绍&#xff1a; 一个使用javamysql开发的jspservlet高速公路事故管理系统。 功能主要包括&#xff0c;事故管理&#xff08;可以上传事故照片&#xff09;、车辆信息管理、车主信息管理、违法信息管理、可以按照柱状图&#xff08;饼状图、折线图&#xff09;分析事故…

为什么你需要Twitter群控

爆粉必备 Twitter爆粉的原理是什么&#xff1f; Twitter爆粉怎么实现呢&#xff1f;你先关注别人&#xff0c;然后和人家互动&#xff0c;比如发私信、点赞、评论转发帖子&#xff0c;让别人看到你并回关你&#xff0c;一段时间不回关&#xff0c;你就取消对他们的关注&#…

html中的固定定位的用法

文章目录 前言 一、固定定位的理解&#xff1f; 二、固定定位用在哪里&#xff1f; 1、给大家分享一个案例 2、代码编写 1、先准备一个小案例 2、效果如下&#xff0c;浏览器左上角有个盒子&#xff0c;右边有滚动条 3、我想让他像我们的csdn一样&#xff0c;这个盒子固定在右下…

科技连接美好未来 | 美格智能5G FWA解决方案持续推进

近年来&#xff0c;5G网络在全球范围的全面推广和普及&#xff0c;促使市场对高速宽带连接的需求持续增长&#xff0c;5G FWA作为低成本的网络接入选项&#xff0c;或将成为5G市场新一代的杀手级应用。 5G的持续推动&#xff0c;促使FWA出货量呈现出高速增长趋势。就2020年&…

学了C++能做什么?

相信很多人接触编程都是源于大学期间的那堂C语言程序编程&#xff0c;但是这门课却只告诉了你编程语言是什么&#xff0c;却没告诉你要怎么去熟练掌握编程。所以&#xff0c;不可避免的是许多人在毕业前夕才发现虽然学会了C&#xff0c;但是好像却不知道能干什么&#xff0c;能…

[附源码]java毕业设计学生考试成绩分析系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

浅学Go下的ssti漏洞问题

前言 作为强类型的静态语言&#xff0c;golang的安全属性从编译过程就能够避免大多数安全问题&#xff0c;一般来说也唯有依赖库和开发者自己所编写的操作漏洞&#xff0c;才有可能形成漏洞利用点&#xff0c;在本文&#xff0c;主要学习探讨一下golang的一些ssti模板注入问题…

汽车制造企业借力泛微京桥通,推动采购流程化、数字化

新常态下汽车采购数字化是趋势 随着互联网的发展、智能技术的兴起和市场竞争态势的变革&#xff0c;汽车制造企业不断融合新技术&#xff0c;打造新产品&#xff1b;同时&#xff0c;融合线上线下的营销和服务方式&#xff0c;创新运营模式&#xff0c;提升业务效率。 汽车制…

Android Java反射与Proxy动态代理详解与使用基础篇(一)

一、介绍 什么是反射&#xff1f; 反射是java语言的一个特性&#xff0c;它允程序在运行时&#xff08;注意不是编译的时候&#xff09;来进行自我检查并且对内部的成员进行操作。 反射是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法…

夯实C++基础学习笔记

第一章 内存模型和编译链接 1. 掌握进程虚拟地址空间区域划分 编程语言产生&#xff1a;指令数据 exe 磁盘加载到内存&#xff0c;不可能直接加载到内存。 x86系统&#xff1a;linux系统会给当前进程分配一个 2^32 大小的空间 4G 它不存在&#xff0c;你却看得见&#xff0…

Bio-Helix丨Bio-Helix艾美捷Ponceaus S染色液说明书

Bio-Helix艾美捷Ponceaus S染色液是一种用于评估蛋白质印迹转移效率的现成膜染色剂。该染色剂适用于硝化纤维或PVDF膜上的快速可逆蛋白质染色。Ponceau S染色是可逆的&#xff0c;可以在0.1%NaOH中短时间培养去除。 图&#xff1a; Ponceau S溶液可用于评估硝化纤维和PVDF膜上的…

正点原子stm32F407学习笔记6——外部中断实验

一、GPIO与中断线的映射关系 GPIO 的管脚GPIOx.0 ~ GPIOx.15(xA,B,C,D,E&#xff0c;F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口&#xff0c;以线 0 为例&#xff1a;它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.…

springcloud7:服务注册与发现总结篇

eureka总结 问题1&#xff1a;为什么使用服务注册&#xff1f; 服务越来越多&#xff0c;负责存储和管理维护服务地址 问题2&#xff1a;如何通过名称访问地址&#xff1f; 即服务中心存储的为名称地址的键值对&#xff0c;服务注册中心会通过名称来返回访问地址&#xff08;ip…