mmitmproxy 抓包工具使用

2024-08-31 16:28

本文主要是介绍mmitmproxy 抓包工具使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mitmproxy 抓包工具使用

前言

本章内容均来自,《Python3 网络爬虫开发实战》- 崔庆才,在学习过程中,遇到写问题故此记录一下

学习本文章前确保准备好如下内容:

  • 安装并成功运行 mumu 安卓模拟器

mitmproxy 介绍

mitmproxy是一个支持HTTP/HTTPS 协议的抓包程序,和 Fiddler、Charles有类似的功能,只不过它以控制台的形式操作。

mitmproxy还有两个关联组件。一个是mitmdump,这是mitmproxy的命令行接口,利用它我们可以对接 Python 脚本,用Python 实现监听后的处理。另一个是mitmweb,这是一个 Web 程序,通过它我们可以清楚地观察到mitmmproxy捕获的请求。

mitmproxy 功能

mitmproxy有如下几项功能:

  • 拦截 HTTP/HTTPS 的请求和响应;
  • 保存并分析HTTP会话;模拟客户端发起请求
  • 模拟服务端返回响应;
  • 利用反向代理将流量转发给指定服务器;
  • 支持 Mac 系统和 Linux 系统上的透明代理;
  • 利用 Python 实时处理 HTTP请求和响应。

整体来看,mitmproxy相当于一个命令行版本的Charles,同样可以捕获与修改请求内容和响应内容。其实,相比 Charles,mitmproxy最有优势的是它的关联组件 mitmdump,mitmdump 可以使用 Python脚本实时处理请求和响应,功能非常强大。

准备工作

安装 mitmproxy

安装参考链接: https://setup.scrape.center/mitmproxy

mumu模拟器证书配置

1.打开文件共享
在这里插入图片描述

在这里插入图片描述

  1. mitmproxy-ca-cert.pem 复制到 共享文件中 >
    在这里插入图片描述

  2. 添加代理

查看IP -> 启动 MuMu 模拟器,点 设置 -> 网络和互联网 -> 互联网 -> WLAN 开启状态 -> WiredSSID -> 代理 。配置代理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4. 安装证书

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

基本使用

运行 mitmproxy

mitmproxy 

在这里插入图片描述

在手机上访问百度,mitmproxy 页面上都会呈现出这个工程的请求。
在这里插入图片描述

这也相当于我们之前在浏览器开发者工具中监听得到的内容。

  • 图中左下角显示的 19/46代表一共产生了 46个请求,箭头当前所指的请求是第19个。
  • 每个请求的开头都有一个CET或POST,这是请求方法,
  • 后面紧接的内容是请求URL,URL之后是请求对应的响应状态码,
  • 其后是响应内容的类型(例如 text/html 代表网页文档、image/jpeg代表图片),
  • 再后面是响应体的大小和响应时间。

总之当前页面呈现了所有请求和响应的概览,我们可以通过这个页面观察所有的请求。

如果想查看某个请求的详情,可以通过上下键切换,选中这个请求后按下回车键,进入请求的详情页面,如图所示。

在这里插入图片描述

  • 从图中,可以看到请求头的详细信息,例如Host、Cookie等。
  • 图的上方有 Request、Response和 Detai1三个选项,
  • 当前是打开了Request选项。
  • 按下Tab键切换至 Response 选项卡,查看请求对应的响应详情,

开始的内容是响应头的信息,下拉之后可以看到响应体的信息。针对当前请求,响应体就是网页的源代码。此时再按 Tab键,切换到最后一个选项卡Detai1,即可看到当前请求的详细信息,如服务器的 IP 和端口、HTTP 协议版本、客户端的IP 和端口等.
在这里插入图片描述

mitmproxy 还提供了命令行式的编辑功能,使我们可以重新编辑请求。按下E键即可进入编辑页这时它会询问要编辑哪部分内容,选项有cookies、query、url等,如图所示
在这里插入图片描述
按下要编辑内容对应的索引键即可进入编辑页面,例如按下数字6键,进入编辑请求URL的参数 Query Strings的页面,如图 12-24所示。我们可以按下D键删除当前的QueryStrings,然后按下 A键新增一行,输人新的 Key 和 Value。

这里我们分别输人wd和NBA。之后按下Esc键和O键返回请求的详情页面,可以看到请求 URL里多了一个 wd=NBA 的参数,如图 所示。
在这里插入图片描述
接着按下E键和数字4键,进入编辑Path的页面,如图1所示。和上面流程一样,按下D键和 A 键修改 Path 的内容。
在这里插入图片描述

这里我们将 Path 修改为 s。之后按下 Esc 键和 O键返回请求的详情页面,可以看到请求 URL变成了 htps://m.baidu.com/s?wd=NBA,访问这个页面,结果如图12-27所示,这和用百度搜索关键词 NBA的返回结果一样。
在这里插入图片描述

接下来,按下R键重新发送修改后请求,可以看到请求旁边多了一个回旋箭头
在这里插入图片描述

mitmdump 实时抓包处理

正是由于 mitmdump可以对接 Python 脚本,因此我们在 Python 脚本中获得请求和响应的内容时就可以顺便添加一些解析、存储数据的逻辑,这样就实现了数据的抓取和实时处理。

引入

启动mitmdump:

mitmdump -s script.py

这里使用 -s参数指定了本地脚本script.py 为处理脚本,用来处理抓取的数据,需要将其放置在当前命令的执行目录下。

def request(flow):  flow.request.headers['User-Agent'] = 'Mitmproxy'  print(flow.request.headers)  

运行启动命令后,在手机端访问 http://www.httpbin.org/get,可以看到手机端显示的页面显示如图 所示。

在这里插入图片描述

日志输出

mitmdump提供了专门的日志输出功能,可以设定以不同的颜色输出不同级别的结果。
修改 script.py :

from mitmproxy import ctx  def request(flow): flow.request.headers['User-Agent'] = 'Mitmproxy' print(flow.request.headers) ctx.log.info(str(flow.request.headers)) ctx.log.warn(str(flow.request.headers)) ctx.log.error(str(flow.request.headers)) 

这里调用了 ctx模块,它有一个名为1og的功能,调用不同的输出方法可以输出不同颜色的结果,以便我们更直观、方便地调试(例如,

  • 调用info 方法输出的结果为白色,
  • 调用 warn 方法输出的结果为黄色,
  • 调用error 方法输出的内容为红色)。
    上述代码的运行结果如图所示。
    在这里插入图片描述

请求

script.py 修改如下:

from mitmproxy import ctxdef request(flow):url = 'https://www.baidu.com'flow.request.url = urlrequest = flow.requestinfo = ctx.log.infoinfo(request.url)info(str(flow.request.headers))info(str(flow.request.cookies))info(request.host)info(request.method)info(str(request.prot))info(request.scheme)

这里直接将请求URL修改成了百度,如图所示:
在这里插入图片描述

浏览器最上方呈现的网址还是 http://www.httpbin.org,而页面已经变成了百度首页。我们用简单的脚本就成功修改了目标网站,意味着这种方式使修改和伪造请求变得轻而易举,这也是中间人攻击。

响应

响应体才是要爬取的结果。和请求一样,mitmdump 针对响应也提供了对应的处理接口,就是response方法:

def response(flow):response = flow.responseinfo = ctx.log.infoinfo(str(response.status_code))info(str(response.headers))info(str(response.cookies))info(str(response.text))

将 script.py 脚本修改为如上内容,然后用手机访问 [http://www,htpbin.org/get],电脑端控制台会输出响应状态码、响应头、响应 Cookie 和响应体几个属性,其中最后一个就是网页的源代码。电脑端控制台的输出结果如图所示。

在这里插入图片描述
成功完成爬取了
我们通过response方法获取了每个请求对应的响应内容,接下来对响应信息进行提取和存储,就

这篇关于mmitmproxy 抓包工具使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过