mitmdump 实时抓包处理

news2025/1/11 23:51:24

mitmdump 是 mitmproxy 的命令行接口,可以对接 Python 脚本处理请求和响应,这是比 Fiddler , Charles 等工具更加方便的地方,有了它,我们不用再手动抓取和分析HTTP 请求和响应,只要写好请求和响应的处理逻辑就好了。

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

实例引入

使用命令启动 mitmdump:    mitmdump -s script.py

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

我们可以在 script.py 脚本里写入如下内容

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

其中定义了一个 request 方法,参数为 flow ,这是一个 HTTPFlow 对象,调用其 request 属性即可获取当前请求对象的请求头 User-Agent 修改成 MitmProxy , 然后打印出所有请求头

运行启动命令后,在手机端访问 http://www,httpbin.org/get   同时电脑端的控制台输出

手机端显示的

控制台输出的结果

日志输出

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

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

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

请求

我们来看看 mitmdump 还有哪些使用的功能

from mitmproxy import ctx
# mitmdump 常用的功能
def request(flow):
    request = flow.request
    info = ctx.log.info
    info(request.headers)
    info(request.url)
    info(str(request.headers))
    info(str(request.cookies))
    info(request.host)
    info(request.method)
    info(request.port)
    info(request.scheme)

这里的 request 方法是 mitmdump 针对请求提供的处理接口。 将 script.py 脚本修改为如上内容,然后手机打开 http://www.httpbin.org/get , 即可看到电脑端控制台输出了一些列的请求。这里我们找到第一个请求,控制台打印出了该请求的一些常见属性,如请求 URL, 请求头,请求Cookie ,请求 Host ,请求方法,请求端口,请求协议等

我们可以根据需要修该里面的参数,例如修改 URL 为 www.baidu.com

def request(flow):
    url = 'https://www.baidu.com'
    flow.request.url = url

浏览器上方的地址栏呈现的网址还是原来的,页面却变成了百度首页。我们简单的脚本就成功修改了目标网站,意味着这种方式修改和伪造请求变得轻而易举,这也是中间攻击

注意: 这里提醒我们 url 正确并不意味着网站也正确,我们要提高防范意识

响应

对于爬虫来说,更加关心的其实是响应内容,响应体才是要爬取的结果。和请求一样,mitmdump 正对响应也提供了对应的处理接口, 就是 response 方法

# 响应
def response(flow):
    response = flow.response
    info = ctx.log.info
    info(str(response.status_code))
    info(str(response.headers))
    info(str(response.cookies))
    info(str(response.text))

将 script.py 改成如上代码,然后手机访问 https://www.httpbin.org/get 电脑端控制台就输出了如上的内容有 响应状态码,响应头 ,响应 cookie 和响应体几个属性,其中最后一个是网页的源代码

实战准备

我们将 APP中的接口数据爬取下来存储到 文本文件中

手机上安装APP:https://app5.scrape.center/

抓取分析

首先获取一下当前页面的 URL 和返回内容,编写一个脚本, 名叫 spider.py

def response(flow):
    print(flow.request.url)
    print(flow.response.text)

这里只是打印出了请求 URL 和响应体这两个最关键的部分,然后启动

mitmdump -s spider.py

在手机上打开下载好的 app5 ,便可以看到电脑端控制台输出了相应的内容,接着不断下拉,可以看到手机屏幕上的数据一页一页的加载,电脑的控制台输出了类似 JSON 数据的结果

选取其中一个 URL 观察一下, 具体为: 

https://app5.scrape.center/api/movie/?offset=30&limit=10&token=YjczZWE0NDEzOGIxOTg5YTU3MDU0NGNkYjU0NzkyZmIwMzU1Mjk2MiwxNzIzNjI0OTA1%0A

可以看到出了 offset limit 参数,里面还有一个 token ,我们把结果中响应体复制下来,并格式化处理  Json Beautifier - Json Formatter | Json Viewer | Json Editor 可以搜索 json beautifier 来格式化

"count": 103,
  "results": [
    {
      "id": 30,
      "name": "上帝之城",
      "alias": "Cidade de Deus",
      "cover": "https://p1.meituan.net/movie/b553d13f30100db731ab6cf45668e52d94703.jpg@464w_644h_1e_1c",
      "categories": [
        "剧情",
        "犯罪"
      ],
      "published_at": null,
      "minute": 130,
      "score": 8.8,
      "regions": [
        "巴西",
        "法国"
      ],
      "drama": "巴西里约热内卢的贫民窟,这里是“上帝之城”,更是魔鬼也会叹息着转身的地方。阿炮(亚历山大·罗德里格斯 饰)带着我们到了这里,他见证了这里二十多年来被残暴、贪婪、复仇、野心、背叛、掠夺所裹挟的混乱生活 以及最终导致的一场灾难性的黑帮争斗。虽然从小就要辗转于匪徒间求生存,但胆小怕事的性格与自我保护的本能却使他一直能平安度日。60年代初,阿毛、阿夹和阿呆是这里的“少年三侠”,在抢劫完旅馆之后,他们三人分道扬镳,阿夹重回上帝的怀抱,而阿呆和阿毛纷纷付出了生命的代价。70年,当年“少年三

通过对比可以发现这里的内容和 app5 里的内容是一样的,所以我们成功截获了响应体

那么这里为什么不能像前面那样直接用 Python 请求爬取数据? 因为这次 App 的接口带有 token 的加密参数,仅凭抓包是没法知道它是如何生成的,而通过 Python  则需要模拟 token 的生成逻辑

这里我们已经直接通过 mitmdump 抓取结果, 相当于是请求 App 构造的,我们直接拿到了响应结果,不需要再去构造请求了

数据抓取

现在我们稍微完善一下 spider.py 脚本,增加一些过滤 URL 和处理响应结果的逻辑

import json 
from mitmproxy import ctx

def response(flow):
    url = 'https://app5.scrape.center/api/movie/'
    if flow.request.url.startsswith(url):
        text = flow.response.text
        if not text:
            return
        data = json.loads(text)
        items = data.get('results')
        for item in items:
            ctx.log.info(str(item))

之后重新打开 app5 ,并在电脑端控制台观察输出结果

可以看到输出了每部电影的数据,数据以 JSON 形式呈现

提取保存

现在再修改一下 spider.py 脚本,将返回的结果保存下来,保存为文本文件即可

import json
from mitmproxy import ctx
import os

OUTPUT_FOLDER = 'movies'
os.path.exists(OUTPUT_FOLDER) or os.makedirs((OUTPUT_FOLDER))

def response(flow):
    url = 'https://app5.scrape.center/api/movie/'
    if flow.request.url.startswith(url):
        text = flow.response.text
        if not text:
            return
        data = json.loads(text)
        items = data.get('results')
        for item in items:
            ctx.log.info(str(item))
            with open(f'{OUTPUT_FOLDER}/{item["name"]}.json', 'w', encoding='utf-8') as f:
                f.write(json.dumps(item, ensure_ascii=False, indent=2))

然后重新打开 app5 , 滑动一下屏幕,这时候观察 movies 文件夹,会发现生成了一些 JSON 文件,这些文件以电影名称命名

打开任意一个json 文件,可以看到都实时保存了下来

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

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

相关文章

jenkins jdk8下载

jdk8 对应的 jenkins版本是2.346.1 http://updates.jenkins-ci.org/download/war/2.346.1/jenkins.warjenkins和jdk安装教程(安装支持jdk8的最新版本) https://blog.csdn.net/u013078871/article/details/127200623刚买的腾讯云安装jenkins步骤,服务器安装jenkins步…

基于华为atlas的皮带跑偏、空载、堆煤、启停探索

生乎吾前,其闻道也固先乎吾,吾从而师之;生乎吾后,其闻道也亦先乎吾,吾从而师之。吾师道也,夫庸知其年之先后生于吾乎?是故无贵无贱,无长无少,道之所存,师之所…

超详细!!!electron-vite-vue开发桌面应用之配置路由router(五)

云风网 云风笔记 云风知识库 一、安装依赖 npm install vue-router二、配置项目文件路径 三、配置路由router 在src下新建一个router目录,然后在里面添加一个index.ts文件,在里面配置路由 import { createRouter, createWebHashHistory } from vue-…

针对thinkphp站点的漏洞挖掘和经验分享

0x1 前言 浅谈 目前在学习和研究thinkphp相关漏洞的打法,然后最近对于thinkphp资产的收集方面有了一个简单的认识,然后写一篇新手看的thinkphp相关的漏洞收集和挖掘的文章来分享下。然后后面是给师傅们分享下后台文件上传,然后直接打一个ge…

RCE-eval长度限制绕过技巧

目录 限制16字符 题目源码 方法一&#xff1a;$_GET[1] 方法二&#xff1a;file_put_contents 方法三&#xff1a;usort(…$_GET); 限制7字符 题目源码 限制16字符 题目源码 <?php $param $_REQUEST[param]; If ( strlen($param) < 17 && stripos($param…

微服务系列:Spring Cloud 之 Feign、Ribbon、Hystrix 三者超时时间配置

Feign 自身有超时时间配置 Feign 默认集成的 Ribbon 中也有超时时间配置 假如我们又使用了 Hystrix 来实现熔断降级&#xff0c;Hystrix 自身也有一个超时时间配置 注: spring-cloud-starter-openfeign 低一点的版本中默认集成的有 Hystrix&#xff0c;高版本中又移除了。 …

Gin框架接入Prometheus,grafana辅助pprof检测内存泄露

prometheus与grafana的安装 grom接入Prometheus,grafana-CSDN博客 Prometheus 动态加载 我们想给Prometheus新增监听任务新增ginapp项目只需要在原来的配置文件下面新增ginapp相关metric 在docker compose文件下面新增 执行 docker-compose up -d curl -X POST http://lo…

C++ 设计模式——模板方法模式

模板方法模式 模板方法模式逐步重构并引入模板方法模式初始实现提取共性并引入模板方法模式实现具体类 完整代码示例模板方法模式的 UML 图UML 图详细介绍 模板方法模式适用于以下场景 模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#x…

C++11代码实战经典—MySQL数据库连接池

课程总目录 文章目录 一、项目介绍1.1 关键技术点1.2 项目背景1.3 连接池功能点介绍1.4 MySQL Server参数介绍1.5 项目功能点设计和技术细节 二、MySQL数据库编程三、项目代码逐步实现3.1 连接池单例模式实现3.2 实现加载配置项3.3 连接池的构造函数3.4 实现生产者3.5 实现消费…

其他浏览器正常,火狐浏览器ui-grid换行问题

ui-grid火狐浏览器兼容性问题 ui-grid表格插件问题描述解决方案 ui-grid表格插件 火狐浏览器 UI-grid 兼容性问题 其他如Edge、谷歌、360浏览器正常情况下 火狐浏览器 问题描述 如上图一和图二显示&#xff0c;UI-gird在火狐换行了&#xff1a;从图片来看&#xff1b;后面…

【车载开发系列】ASPICE标准实践---使用Drome系统保证一致性

【车载开发系列】ASPICE标准实践—使用Drome系统保证一致性 【车载开发系列】ASPICE标准实践---使用Drome系统保证一致性 【车载开发系列】ASPICE标准实践---使用Drome系统保证一致性一、一致性的目的二、ASPICE标准三、ASPICE标准实施难点四、保证一致性的实践1. 参与评审2. 可…

ES6-ES13学习笔记

目录 初识ES6 变量声明 解构赋值 对象解构 ​编辑 数组解构 ​编辑模版字符串 字符串扩展 includes() repeat() startsWith() endsWith() 数值扩展 二进制和八进制表示法 &#xff08;Number.&#xff09;isFinite()与isNaN() Number.isInteger() Math.trunc …

vue前端可以完整的显示编辑子级部门,用户管理可以为用户分配角色和部门?

用户和角色是一对多的关系用户和部门是多对多得关系<template><div class="s"><!-- 操作按钮 --><div class="shang"><el-input v-model="searchText" placeholder="请输入搜索关键词" style="width:…

上海凯泉泵业入职测评北森题库题型分析、备考题库、高分攻略

上海凯泉泵业&#xff08;集团&#xff09;有限公司是一家大型综合性泵业公司&#xff0c;专注于设计、生产、销售泵、给水设备及其控制设备。作为中国泵行业的领军企业&#xff0c;凯泉集团拥有7家企业和5个工业园区&#xff0c;总资产达到25亿元&#xff0c;生产性建筑面积35…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求&#xff0c;特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符&#xff0c;PDF中的条码可以包含各种类型的信息&#xff0c;如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Linux 【进程替换】详细讲解

替换原理 进程是由PCB和内核数据结构以及进程的代码和数据形成 用 fork 创建子进程后执行的是和父进程相同的程序 ( 但有可能执行不同的代码分支 ), 子进程往往要调用一种 exec 函数来进行进程替换 ,对子进程进行替换由于原先子进程与父进程使用的是同一物理内存空间&#xff0…

前端 JavaScript 的 _ 语法是个什么鬼?

前言 我们有时候会看这样的前端代码&#xff1a; const doubled _.map(numbers, function(num) { return num * 2; });刚接触前端的童鞋可能会有点惊奇&#xff0c;不知道这个 _ 是什么语法&#xff0c;为什么这么神通广大&#xff1f; 其实 _ 是 Lodash 或 Underscore.js …

Django Project | 云笔记练习项目

文章目录 功能整体架构流程搭建平台环境子功能先创建用户表 并同步到数据库1.用户注册密码存储 -- 哈希算法唯一索引引发的重复问题 try登陆状态保持 -- 详细看用户登录状态 2. 用户登录会话状态时间 cookie用户登录状态校验 3. 网站首页4.退出登录5.笔记模块 列表页添加笔记 …

AFSim 仿真系统----脚本

概述 脚本为用户提供了一种在模拟中基于发生的事件执行复杂指令集的方式。该语言类似于 C# 和 Java&#xff0c;对于具备基本编程技能的人来说应该会很熟悉。它采用块结构&#xff0c;包含熟悉的声明、赋值和控制流语句&#xff0c;允许用户检查和操作模拟环境。 脚本本质上是由…

【Linux】sersync 实时同步

原理 rsync 是不支持实时同步的&#xff0c;通常我们借助于 inotify 这个软件来实时监控文件变化&#xff0c;一旦inotify 监控到文件变化&#xff0c;则立即调用 rsync 进行同步&#xff0c;推送到 rsync 服务端。 环境准备 步骤1&#xff1a;获取数据包 获取 sersync 的包…