mitmproxy使用总结

news2024/12/18 22:03:17

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的博客-CSDN博客

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的博客-CSDN博客

命令使用

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

mitmdump -s xxx.py

来源

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

脚本定制

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

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的博客-CSDN博客

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(踩坑史)_你是猴子请来的救兵吗!!的博客-CSDN博客_mitmproxy怎么将访问记录存入数据库

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

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

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

相关文章

aws appmesh 在ec2上部署和使用appmesh

参考资料 Getting started with AWS App Mesh and Amazon EC2 之前的文章中我们已经介绍了aws的服务网格场频appmesh,并且在eks环境中进行了部署和简单功能的测试。由于eks环境较为复杂,本文在ec2环境下手动配置appmesh网格环境 需求: 两个…

【Spring 基础】

【Spring 基础】 一、 Spring 介绍 1. 简述 Spring 技术是 JavaEE 开发必备技能,企业开发技术选型专业角度 简化开发,降低企业级开发的复杂性 IoCAOP 事务处理 框架整合,高效整合其他技术,提高企业级应用开发与运行效率 MyBat…

Linux内核中的软中断、tasklet和工作队列

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,…

5M240ZT144C5N【CPLD】5M240ZT144I5N,5M570ZT100I5N满足低功耗设计

MAX V设备系列的特点:低成本、低功耗、非易失性CPLD架构即时启动(0.5 ms或更短)配置时间待机电流低至25A,快速下电/复位操作快速传播延迟和时钟到输出时间内部振荡器模拟RSDS输出支持,数据速率高达200 Mbps模拟LVDS输出支持,数据速…

手把手教你做微信公众号

手把手教你做微信公众号 微信公众号可以通过注册的方式来建立。 1.进入微信公众平台 首先,在浏览器中搜索微信公众号,网页第一个就是,如下图所示,我们点进去。 2.注册微信平台账号 进入官网之后,如下图所示&#…

day53【代码随想录】单调栈之每日温度、下一个更大元素 I、下一个更大元素 II

文章目录前言一、每日温度(力扣739)二、下一个更大元素 I(力扣496)三、下一个更大元素 II(力扣503)【环形数组】思路一思路二前言 单调栈:栈内元素保证递增或递减的 1、每日温度 2、下一个更大…

“AI板块凉了”说法有失公允?AI板块CNTM其发展的关键!

今年区块链所有的建设都围绕着以太坊,存储板块开年也是火爆了一把,龙头FIL更是一路前行,短期虽有回落但热度依然在,后期市场热度还是会给到存储,未来可期。目前市场上新出一个区块链覆盖多个赛道的项目——Filswan和AI…

Hive的视图与索引

Hive的视图其实是一个虚表,视图可以允许保存一个查询,并像对待表一样对这个查询进行操作,视图是一个逻辑结构,并不会存储数据。 Hive中的索引只有有限的功能,Hive中没有主键和外键的概念,可以通过对一些字段…

【CS224W】(task6)Google的PageRank算法

note 求解pagerank:用power iteration(幂迭代)方法求解 rM⋅r\mathbf{r}\mathbf{M} \cdot \mathbf{r}rM⋅r ( MMM 是重要度矩阵)用random uniform teleporation解决dead-ends(自己指向自己)和spider-traps&#xff08…

Linear()全连接层+矩阵原理

Linear()全连接层矩阵原理) Linear()全连接层矩阵原理 Linear()参数 原文地址:https://blog.csdn.net/horizonwys/article/details/125933921 。 矩阵原理 在 NLP中 x 一般为一行 故 *linear()中输出为 x W x的维度为 (tok…

二叉树—— 二叉搜索树中的搜索

二叉搜索树中的搜索 链接 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val…

jsp图书借阅管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 图书借阅管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统采用serlvetdaobean,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.…

[oeasy]python0093_电子游戏起源_视频游戏_达特茅斯_Basic_家酿俱乐部

编码进化 回忆上次内容 Ed Robert 的 创业之路 从 售卖 diy 组装配件到进军 计算器市场最后 发布 牛郎星8800 intel 8080 的出现 让 人人都有 自己的 个人电脑 Bill Gate 和 Paul Allen 要去 新墨西哥州 朝圣这场 奥德赛 会发生什么呢?🤔 奥德赛 当…

【并发编程学习篇】ReentrantLock设计思想剖析

一、AQS原理剖析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如 等待队列、条件队列、独占获取、共享获取等而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一…

【python】函数详解

注:最后有面试挑战,看看自己掌握了吗 文章目录基本函数-function模块的引用模块搜索路径不定长参数参数传递传递元组传递字典缺陷,容易改了原始数据,可以用copy()方法避免变量作用域全局变量闭包closurenonlocal 用了这个声明闭包…

C语言基础相关内容

文章目录前言1. 关键字2. C语言数据类型3. 标志符4. 常量类型5. 内存模型变量内存分析数组6. printf & scanfpuchar&getchar7 main函数8 字面值常量前言 本文简明扼要的介绍了部分C语言的一些基本内容。 1. 关键字 12345678charshortintlongfloatdoubleifelsereturnd…

【人脸识别】CurricularFace:自适应课程学习人脸识别损失函数

论文题目:《CurricularFace: Adaptive Curriculum Learning Loss for Deep Face Recognition》 论文地址:https://arxiv.org/pdf/2004.00288v1.pdf 代码地址:https://github.com/HuangYG123/CurricularFace 建议先了解下这篇文章&#xff1a…

电子技术——频率补偿

电子技术——频率补偿 在本节我们介绍修改三极点或多极点放大器的开环增益函数 A(s)A(s)A(s) 的方法,使得闭环增益在我们希望的值上放大器是稳定的。这个过程称为频率补偿。 理论 最简单的频率补偿方法是引入新的极点,如图下面是一个放大器的伯德图&am…

windows安装Ubuntu子系统以及图形化界面记录

文章目录1. windows环境设置2. 开始安装3. ubuntu使用3.1 启动和退出 Linux 子系统3.2 安装位置3.3 更换源4. 安装图形化界面4.1 安装VcXsrv4.2 安装桌面环境(1)方法1:VcXsrv Gnome(2)方法2:VcXsrv Xfce4…

Python到底牛在哪?现在就业薪资高吗?

Python是什么呢?Python是一种全栈的开发语言,你如果能学好Python,前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。当下Python有多火我不再赘述,Python有哪些作用呢?据我多年P…