Python3自定义http/https请求拦截mitmproxy脚本实例


Posted in Python onMay 11, 2020

脚本内容

代码如下:

from mitmproxy import http, ctx
from multiprocessing import Lock


class Filter:
  def __init__(self, filter_info):
    self.log_info = ""
    self.mutex = Lock()
    self.filter_info = filter_info
    self.response_file = None
    self.switch_on = False
    self.log_file = "log.txt"

  def log(self, info) -> None:
    self.log_info += f"{info}\n\n"

  def write_log(self, mode="w+") -> None:
    self.mutex.acquire()
    with open(self.log_file, mode) as f:
      f.write(self.log_info)
    self.mutex.release()

  def is_target_flow(self, flow: http.HTTPFlow) -> bool:
    for info in self.filter_info:
      if info["str_in_url"] in flow.request.url:
        self.log_file = info["log_file"]
        self.switch_on = info["switch_on"]
        if info["response_file"] != None:
          self.response_file = info["response_file"]
        return True
    else:
      return False

  def modify_response(self, flow: http.HTTPFlow) -> http.HTTPFlow:
    if self.switch_on and self.response_file:
      with open(self.response_file, "r") as f:
        flow.response.content = f.read().encode()
    return flow

  def request(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——METHOD——\n{flow.request.method}")
      self.log(f"——HOST——\n{flow.request.pretty_host}")
      self.log(f"——URL——\n{flow.request.pretty_url}")
      query = [i + ":" + flow.request.query[i] + "\n" for i in flow.request.query]
      self.log(f"——QUERY STRING——\n{''.join(query)}")
      if flow.request.urlencoded_form:
        form = [i + ":" + flow.request.urlencoded_form[i] + "\n" for i in flow.request.urlencoded_form]
        self.log(f"——FORM——\n{''.join(form)}")
      self.write_log()

  def response(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——RESPONSE before modified——\n{flow.response.content.decode()}")
      flow = self.modify_response(flow)
      self.log(f"——RESPONSE after modified——\n{flow.response.content.decode()}")
      self.write_log(mode="a")


filter_info = [
  {
    "str_in_url": "getSimpleNews",
    "log_file": "getSimpleNews_log.txt",
    "switch_on": True,
    "response_file": "getSimpleNews_response.txt",
  },
  {
    "str_in_url": "getQQNewsComment",
    "log_file": "getQQNewsComment_log.txt",
    "switch_on": True,
    "response_file": None,
  }
]
addons = [
  Filter(filter_info)
]

使用方法

运行mitmproxy指定使用该脚本和端口号即可:

mitmproxy -p 6666 -s xxx.py

在mitmproxy运行时:

1. 会拦截url中包含str_in_url字符串的请求

2. 会把response.content修改为当前mitm运行所在目录下的response_file文件中的内容

3. 打印信息在当前mitm运行所在目录下的log_file文件中

4. 如果无需修改response设置switch_on为False即为开关关闭

5. 如果不修改response的话response_file需要写None

补充知识:mitmproxy 监听指定端口

安装

使用python3的安装方式

https://mitmproxy.org/

监听指定端口

例子:Presto SQL请求的监听

Presto地址:http://datacenter4:18080

mitmproxy命令(端口8484)
mitmproxy \
--mode reverse:http://datacenter4:18080 \
--listen-host datacenter4 \
--listen-port 8484 \
--replacements :~s:\/\/datacenter4/:\/\/datacenter4:18080/

然后JDBC访问Presto使用:jdbc:presto://datacenter4:8484

效果

Python3自定义http/https请求拦截mitmproxy脚本实例

以上这篇Python3自定义http/https请求拦截mitmproxy脚本实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的JSON使用
Apr 28 Python
详解Django中的权限和组以及消息
Jul 23 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
python如何实现int函数的方法示例
Feb 19 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
单利模式及python实现方式详解
Mar 20 Python
python实现人民币大写转换
Jun 20 Python
Windows下PyCharm安装图文教程
Aug 27 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
如何基于python操作json文件获取内容
Dec 24 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 #Python
Pycharm如何导入python文件及解决报错问题
May 10 #Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 #Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 #Python
python对接ihuyi实现短信验证码发送
May 10 #Python
python调用API接口实现登陆短信验证
May 10 #Python
aws 通过boto3 python脚本打pach的实现方法
May 10 #Python
You might like
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python字符串string的内置方法实例详解
2018/05/14 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
求职简历推荐信范文
2013/12/02 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
期末考试复习计划
2015/01/19 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
导游词之崇武古城
2019/10/07 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
Java中的继承、多态以及封装
2022/04/11 Java/Android