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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
解决python线程卡死的问题
Feb 18 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Numpy 多维数据数组的实现
Jun 18 Python
实例详解Python的进程,线程和协程
Mar 13 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中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
php字符集转换
2017/01/23 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
Python 的 with 语句详解
2014/06/13 Python
Python类定义和类继承详解
2015/05/08 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
大专生自荐信
2013/10/04 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
《悯农》教学反思
2014/04/28 职场文书
公司外出活动方案
2014/08/14 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
我是特种兵观后感
2015/06/11 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
安全教育培训心得体会
2016/01/15 职场文书
商业计划书格式、范文
2019/03/21 职场文书