python拦截修改数据包_会Python?那么你一定要试一试mitmproxy
mitmproxy 是一款工具,也可以说是 python 的一个包,使用这个工具可以在命令行上进行抓包(现在也可以在web页面上查看上抓的数据包了),还可以对所抓到的包进行脚本处理,非常有用。
和 fiddler 或charles 等接口抓包工具相比,mitmproxy 不仅可以截获请求帮助开发者查看、分析接口报文,更可以通过自定义Python脚本进行二次开发, 获取更多的内容和能力。
比如,拦截 url 的请求,将返回内容置空,并将真实的返回内容存到数据库或者本地文件;拦截过程中出现异常时发出邮件通知;和反向代理一样,将指向某个服务地址的请求,转发到另外的服务器上。
下图,mitmproxy在网络请求中所处的位置,就能大致理解为什么可以做上面的内容了
安装
sudo pip3 install mitmproxy
运行
要启动 mitmproxy 用mitproxy, mitmdump, mitmweb, 建议用你mitmweb, 它提供了一个web页面,来查看拦截的请求, 运行mitmweb,会启动一个web服务和一个proxy服务,默认端口分别是8081和8080
访问Web Server,可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据
注:如果需要修改默认端口 ,通过--web-port和-p两个参数即可,比如web端口是8999,proxy端口是8899
mitmweb --web-port 8999 -p 8899
设置好后,在手机端或者浏览器里,设置代理地址是mitmproxy所在机器的地址,端口为上面的proxy值,这样手机端或浏览器里请求的内容,就会被mitmproxy拦截到,这块设置和fiddler/charles一样,拦截到的请求如下:
脚本
除了上面的内容,mitmproxy最主要的就是插件能力了。举个栗子,作为代理转发HTTP请求,脚本结构如下:
# -*- coding:utf-8 -*-import mitmproxy.httpclass ProxyForward: def request(self, flow: mitmproxy.http.HTTPFlow) -> None: # pretty_host takes the "Host" header of the request into account, # which is useful in transparent mode where we usually only have the IP # otherwise. if flow.request.pretty_host == "192.168.1.100": flow.request.host = "192.168.3.101"addons = [ProxyForward()]
其中request方法里,对flow.request.pretty_host做了转发,碰到192.168.1.100的请求,自动转发到192.168.3.101
将上面的脚本保存并命名到proxy.py, 然后在启动mitmproxy时,通过参数-s加载这个脚本, 如下:
mitmweb -s proxy.py
这样,向服务地址192.168.1.100请求的服务,就会被转发到192.168.3.101,这个和nginx转发类似,只是mitmproxy可以跟踪并记录请求的内容
如果需要对返回结果进行修改,增加response()方法,在该方法里进行数据的获取、修改和返回,其他的,比如修改cookie、增加请求头、伪造响应,都可以通过对应的addons来满足,而这,只需要将你脚本的内容,注入到适当的脚本生命周期里即可。
而且,最重要的事情,它还只支tcp, websocket,对应的生命周期里,可以对数据进行对应的操作。
整理了MitmProxy的几种请求的生命周期,如下:
1. 针对 HTTP 生命周期
def http_connect(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 收到了来自客户端的 HTTP CONNECT 请求。在 flow 上设置非 2xx 响应将返回该响应并断开连接。CONNECT 不是常用的 HTTP 请求方法,目的是与服务器建立代理连接,仅是 client 与 proxy 的之间的交流,所以 CONNECT 请求不会触发 request、response 等其他常规的 HTTP 事件。
def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自客户端的 HTTP 请求的头部被成功读取。此时 flow 中的 request 的 body 是空的。
def request(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自客户端的 HTTP 请求被成功完整读取。
def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自服务端的 HTTP 响应的头部被成功读取。此时 flow 中的 response 的 body 是空的。
def response(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自服务端端的 HTTP 响应被成功完整读取。
def error(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 发生了一个 HTTP 错误。比如无效的服务端响应、连接断开等。注意与“有效的 HTTP 错误返回”不是一回事,后者是一个正确的服务端响应,只是 HTTP code 表示错误而已。
2. 针对 TCP 生命周期
def tcp_start(self, flow: mitmproxy.tcp.TCPFlow):
(Called when) 建立了一个 TCP 连接。
def tcp_message(self, flow: mitmproxy.tcp.TCPFlow):
(Called when) TCP 连接收到了一条消息,最近一条消息存于 flow.messages[-1]。消息是可修改的。
def tcp_error(self, flow: mitmproxy.tcp.TCPFlow):
(Called when) 发生了 TCP 错误。
def tcp_end(self, flow: mitmproxy.tcp.TCPFlow):
(Called when) TCP 连接关闭。
3. 针对 Websocket 生命周期
def websocket_handshake(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 客户端试图建立一个 websocket 连接。可以通过控制 HTTP 头部中针对 websocket 的条目来改变握手行为。flow 的 request 属性保证是非空的的。
def websocket_start(self, flow: mitmproxy.websocket.WebSocketFlow):
(Called when) 建立了一个 websocket 连接。
def websocket_message(self, flow: mitmproxy.websocket.WebSocketFlow):
(Called when) 收到一条来自客户端或服务端的 websocket 消息。最近一条消息存于 flow.messages[-1]。消息是可修改的。目前有两种消息类型,对应 BINARY 类型的 frame 或 TEXT 类型的 frame。
def websocket_error(self, flow: mitmproxy.websocket.WebSocketFlow):
(Called when) 发生了 websocket 错误。
def websocket_end(self, flow: mitmproxy.websocket.WebSocketFlow):
(Called when) websocket 连接关闭。
4. 针对网络连接生命周期
def clientconnect(self, layer: mitmproxy.proxy.protocol.Layer):
(Called when) 客户端连接到了 mitmproxy。注意一条连接可能对应多个 HTTP 请求。
def clientdisconnect(self, layer: mitmproxy.proxy.protocol.Layer):
(Called when) 客户端断开了和 mitmproxy 的连接。
def serverconnect(self, conn: mitmproxy.connections.ServerConnection):
(Called when) mitmproxy 连接到了服务端。注意一条连接可能对应多个 HTTP 请求。
def serverdisconnect(self, conn: mitmproxy.connections.ServerConnection):
(Called when) mitmproxy 断开了和服务端的连接。
def next_layer(self, layer: mitmproxy.proxy.protocol.Layer):
(Called when) 网络 layer 发生切换。你可以通过返回一个新的 layer 对象来改变将被使用的 layer。详见 layer 的定义。
5. 通用生命周期
def configure(self, updated: typing.Set[str]):
(Called when) 配置发生变化。updated 参数是一个类似集合的对象,包含了所有变化了的选项。在 mitmproxy 启动时,该事件也会触发,且 updated 包含所有选项。
def done(self):
(Called when) addon 关闭或被移除,又或者 mitmproxy 本身关闭。由于会先等事件循环终止后再触发该事件,所以这是一个 addon 可以看见的最后一个事件。由于此时 log 也已经关闭,所以此时调用 log 函数没有任何输出。
def load(self, entry: mitmproxy.addonmanager.Loader):
(Called when) addon 第一次加载时。entry 参数是一个 Loader 对象,包含有添加选项、命令的方法。这里是 addon 配置它自己的地方。
def log(self, entry: mitmproxy.log.LogEntry):
(Called when) 通过 mitmproxy.ctx.log 产生了一条新日志。小心不要在这个事件内打日志,否则会造成死循环。
def running(self):
(Called when) mitmproxy 完全启动并开始运行。此时,mitmproxy 已经绑定了端口,所有的 addon 都被加载了。
def update(self, flows: typing.Sequence[mitmproxy.flow.Flow]):
(Called when) 一个或多个 flow 对象被修改了,通常是来自一个不同的 addon。
python拦截修改数据包_会Python?那么你一定要试一试mitmproxy相关推荐
- python拦截修改数据包_拦截指定数据、修改JS -- mitmproxy
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠. mitmdump -q:屏蔽mitmdump默认的控制台日志,只显示自己脚本中的 -s:入口脚本文件 - ...
- python拦截tcp数据包_发送低级原始tcp数据包python
我最近一直在做一个原始数据包的程序.我们最近有一个关于生包的讲座,所以我一直在努力学习和做我的教授告诉我的事情.我的程序有问题,它出现了一个错误,说目标地址是必需的,它是原始的,所以我不想做socke ...
- python构造icmp数据包_用python篡改icmp报文再发送给接收方
展开全部 程序处理上有些问题,建议深入研究一下ICMP协议.下面是Python 3的一个ICMP的简单实现,可以参考一下.32313133353236313431303231363533e78988e ...
- python拦截数据包_使用Python进行TCP数据包注入(伪造)
数据包注入是对已经建立的网络连接通过构建任意协议(TCP...UDP...)然后用原始套接字发送的方式进行妨碍的过程,这种方法被广泛使用在网络渗透测试中,比如DDOS,端口扫描等. 一个数据包由IP头 ...
- python构造icmp数据包_如何在python中构造ICMP数据包
为了学习,我目前正在尝试创建一个简单的python porgram来向某个设备发送ICMP ping数据包.为了开始,我查看了python模块Pyping:https://github.com/Akh ...
- python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法
1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...
- python拦截tcp数据包,使用python解码TCP数据包
我正在尝试解码通过TCP连接接收到的数据.数据包很小,不超过100字节.然而,当它们很多的时候,我会收到一些连接在一起的包.有没有办法防止这种情况发生?我用的是蟒蛇 我已经尝试分离数据包,我的来源在下 ...
- python解析http数据包_如何在python中嗅探HTTP数据包?
I want to sniff all the HTTP packets in my computer via python(version2.6.. is this possible? can I ...
- python读取串口数据 绘图_使用Python串口实时显示数据并绘图的例子
使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:Anaconda3Scri ...
最新文章
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
- Ubuntu之GCC:GCC编译器的简介、安装、使用方法之详细攻略
- coming music shows
- 《MySQL——外部检测与内部统计 判断 主库是否出现问题》
- Android 获取手机号及运营商信息
- 【操作系统】进程的异步性
- Ubuntu安装cacti步骤
- Atitit.软件开发提升稳定性总结
- tensorflow实现深度可分离卷积
- openwrt nas_【群晖】用群晖虚拟机安装New Pi(OpenWRT)软路由系统
- Linux 修改密码出现“鉴定令牌操作错误”
- 云端服务器怎么修改密码,云端服务器怎么设置登录密码
- uc浏览器linux系统下载文件夹,UC浏览器开发者工具Linux版
- win10删除工作组计算机,win10工作组怎么退出-退出win10工作组的教程 - 河东软件园...
- Windows 下使用 TFTPD32+HTTP PXE引导安装linux
- 清橙OJ A1095 回溯之教室排课
- 让人无语的交通拥挤费
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(5):Cortex-M3处理器能量管理
- Tensorflow深度学习学习笔记
- 如何利用 SOTER ,1 个版本内完成指纹支付开发?
热门文章
- 2021-01-24
- 从前序与中序遍历序列构造二叉树
- LeetCode450题—— 删除二叉搜索树中的节点
- 如何关闭window10自动更新
- com.alibaba.easyexcel导出指定的列_使用Python导入导出Excel表格
- 放大缩小保证div对齐_NFS Write IO 不对齐深度分析
- c++opencv显示中文_OpenCV如何入门秘籍
- php for 脚本,php for循环脚本。
- python搭建selenium_自动化测试之路3-selenium3+python3环境搭建
- php去掉编辑器自带样式,phpcms去掉CKEditor编辑器上传图片的宽高样式