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 相关文章推荐
在Docker上部署Python的Flask框架的教程
Apr 08 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
详解在Python中处理异常的教程
May 24 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
tensorflow中next_batch的具体使用
Feb 02 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
Python lambda表达式用法实例分析
Dec 25 Python
神经网络相关之基础概念的讲解
Dec 29 Python
Python sqlite3查询操作过程解析
Feb 20 Python
对python中arange()和linspace()的区别说明
May 03 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
php实例化一个类的具体方法
2019/09/19 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python用requests实现http请求代码实例
2019/10/31 Python
python列表推导式入门学习解析
2019/12/02 Python
Python如何定义接口和抽象类
2020/07/28 Python
python time.strptime格式化实例详解
2021/02/03 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
旷课检讨书大全
2014/01/21 职场文书
幼儿老师求职信
2014/06/30 职场文书
收银员岗位职责
2015/02/03 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
办公室日常管理制度
2015/08/04 职场文书
文明上网主题班会
2015/08/14 职场文书