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字符串格式化的方法(两种)
Sep 19 Python
python入门教程 python入门神图一张
Mar 05 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python面向对象程序设计示例小结
Jan 30 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
python3获取当前目录的实现方法
Jul 29 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python制作英语翻译小工具代码实例
Sep 09 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
mysql数据库差异比较的PHP代码
2012/02/05 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
javascript中 try catch用法
2015/08/16 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
简单学习vue指令directive
2016/11/03 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
Python入门篇之条件、循环
2014/10/17 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
《伯牙绝弦》教学反思
2014/03/02 职场文书
应急处置方案
2014/06/16 职场文书
电子专业自荐信
2014/07/01 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
Go获取两个时区的时间差
2022/04/20 Golang