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写的一个简单监控系统
Jun 19 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
django使用html模板减少代码代码解析
Dec 12 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
详解python算法之冒泡排序
Mar 05 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
python字符串的index和find的区别详解
Jun 20 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 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实现更新中间关联表数据的两种方法
2014/09/01 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python 字典与字符串的互转实例
2017/01/13 Python
Python yield 使用方法浅析
2017/05/20 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python for和else语句趣谈
2019/07/02 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
python中什么是面向对象
2020/06/11 Python
python递归函数用法详解
2020/10/26 Python
python中Mako库实例用法
2020/12/31 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
党员个人对照检查材料
2014/10/01 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
学习委员竞选稿
2015/11/20 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
python glom模块的使用简介
2021/04/13 Python
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python