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改变日志(logging)存放位置的示例
Mar 27 Python
python实现通过shelve修改对象实例
Sep 26 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
python 对象和json互相转换方法
Mar 22 Python
python实现自主查询实时天气
Jun 22 Python
python生成lmdb格式的文件实例
Nov 08 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
python实现字典嵌套列表取值
Dec 16 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
Python unittest生成测试报告过程解析
Sep 08 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
js中window.open()的所有参数详细解析
2014/01/09 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
详解Python中的元组与逻辑运算符
2015/10/13 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
python如何查看网页代码
2020/06/07 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
优秀实习生感言
2014/03/01 职场文书
委托书范文
2014/04/02 职场文书
工厂车间标语
2014/06/19 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
开业典礼致辞
2015/07/29 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书