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中argparse模块用法实例详解
Jun 03 Python
浅析Python基础-流程控制
Mar 18 Python
python3音乐播放器简单实现代码
Apr 20 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python SQLite3简介
Feb 22 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
python3连接kafka模块pykafka生产者简单封装代码
Dec 23 Python
PyTorch安装与基本使用详解
Aug 31 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
透析PHP的配置文件php.ini
2006/10/09 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
JS 判断代码全收集
2009/04/28 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python中扩展包的安装方法详解
2017/06/14 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python的变量与赋值详细分析
2017/11/08 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python 中@property的用法详解
2020/01/15 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
任课老师推荐信范文
2013/11/24 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
个人批评与自我批评
2014/10/15 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
辩论会主持词
2015/07/03 职场文书
爱国主义主题班会
2015/08/14 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书