python如何利用Mitmproxy抓包


Posted in Python onOctober 10, 2020

一、使用

安装

pip install mitmproxy
  • mitmproxy 是具有控制台界面的交互式,支持SSL的拦截代理
  • mitmdump是mitmproxy的命令行版本。想想tcpdump为HTTP
  • mitmweb 是一个基于web的界面,适用于mitmproxy

mitmproxy(mac)、mitmdump、mitmweb(win) 这三个命令中的任意一个即可

mitmweb -s mitm.py 命令行启动默认端口8080
mitmweb -p 8888 -s mitm.py 指定端口8888
ctrl+c退出

启动后设置电脑或手机代理(电脑ip,端口8888),安装证书
打开 cmd,执行 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=10.12.2.28:8888 --ignore-certificate-errors

二、过滤、修改

"""
flow.request.scheme 请求协议
flow.request.host 请求host
flow.request.url  请求URL链接
flow.request.method 请求方法
flow.request.query 请求URL查询参数
flow.request.path 请求URL https://www.baidu.com/ 
flow.request.path_components #请求URL不包含域名的元祖 ('project', 'classify', 'list')
flow.request.urlencoded_form 请求POST数据
flow.response.status_code HTTP响应状态码
flow.response.headers HTTP响应头信息
flow.response.get_text HTTP响应内容

"""

class Counter:
 def __init__(self):
  self.result = {} # 存接口请求和返回信息
  # url filter 去掉
  self.url_filter = ['baidu.com','qq.com','360']
  # url screen 仅访问
  self.url_race = ['10.162.16.39:8091']
  # http static extension
  self.static_ext = ['js', 'css', 'ico', 'jpg', 'png', 'gif', 'jpeg', 'bmp','xml']
  # http Content-Type
  self.static_files = ['text/css','image/jpeg', 'image/gif','image/png','text/html','application/octet-stream','application/x-protobuf']
  # http Content-Type media resource files type
  self.media_types = ['image', 'video', 'audio']

 def parser_data(self,query,data = {}):
  for key, value in query.items():
   data[key] = value
  return data

 def get_extension(self, url_tup):
  if not url_tup:
   return ''
  else:
   end_path = url_tup[-1]
   split_ext = end_path.split('.')  #1148e88a9d97.jpg #list
   return '' if not split_ext or len(split_ext) == 1 else split_ext[-1]

 # 拒绝连接
 def http_connect(self, flow: mitmproxy.http.HTTPFlow):
  for i in self.url_filter: #过滤url
   if i in flow.request.host:
    flow.response = http.HTTPResponse.make(404)

 #存在筛选就返回true拦截,Flase通过
 def capture_pass(self,request,response):
  if self.url_race:
   if request.host not in self.url_race: #筛选url
    return True
  url_tup = request.path_components #获取url的tup
  extension = self.get_extension(url_tup)
  if extension in self.static_ext: #判断后缀
   return True
  try:
   content_type = response.headers['Content-Type'].split(';')[0]
   if not content_type:
    return False
   elif content_type in self.static_files: #判断Content-Type
    return True
   else:
    http_mime_type = content_type.split('/')[0]
    if http_mime_type in self.media_types: #判断Content-Type的files type
     return True
    else:
     return False
  except Exception:
   return False



 def request(self, flow: mitmproxy.http.HTTPFlow):
  request = flow.request
  # 修改请求头
  # request.headers["shuzf"] = "shuzf"
  # # 修改get参数
  # if "shuzf" in flow.request.query.keys():
  #  request.query.set_all("shuzf", ["舒志福"])
  # # 修改post参数
  # if "shuzf" in flow.request.urlencoded_form.keys():
  #  request.urlencoded_form.set_all('shuzf', '舒志福')
  scheme = request.scheme
  domain = request.host
  self.result['url'] = parse.unquote(request.url) # url解码
  self.result['method'] = request.method
  self.result['request_headers'] = {}
  for item in request.headers:
   self.result['request_headers'][item] = request.headers[item]
  self.result['get_data'] = self.parser_data(request.query) # 将表单转字典
  self.result['post_data'] = self.parser_data(request.urlencoded_form) # 将表单转字典

 def response(self, flow: mitmproxy.http.HTTPFlow):
  request = flow.request
  response = flow.response
  # # 修改返回头
  # response.headers["shuzf"] = "shuzf"
  # # 修改返回体
  # text = response.text
  # text = text.replace("shuzf", "舒志福")
  # flow.response.set_text(text)
  if not self.capture_pass(request,response):
   print(request.url)
   self.result['status_code '] = response.status_code
   self.result['response_headers'] = {}
   for item in response.headers:
    self.result['response_headers'][item] = response.headers[item]
   # HTTPResponse内部使用了iso-8859-1编码,先进行解码为Unicode再进行utf-8编码 response.text.encode("iso-8859-1").decode("utf-8")
   self.result['response_content'] = response.text 
   # 添加result至数据库
   new_url = Proxy(url=self.result['url'],res=self.result['response_content'], content=json.dumps(self.result))

   session.add(new_url)
   session.commit()

   # 关闭session:
   # session.close()

addons = [Counter()] # 实例类

以上就是python利用Mitmproxy抓包的详细内容,更多关于python Mitmproxy抓包的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python笔记(叁)继续学习
Oct 24 Python
Python正则表达式的使用范例详解
Aug 08 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python制作exe文件简单流程
Jan 24 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python csv文件记录流程代码解析
Jul 16 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
图神经网络GNN算法
May 11 Python
python批量生成条形码的示例
Oct 10 #Python
python如何对链表操作
Oct 10 #Python
Python timeit模块原理及使用方法
Oct 10 #Python
python实现自动打卡的示例代码
Oct 10 #Python
Python类绑定方法及非绑定方法实例解析
Oct 09 #Python
Python批量获取并保存手机号归属地和运营商的示例
Oct 09 #Python
Python判断变量是否是None写法代码实例
Oct 09 #Python
You might like
APMServ使用说明
2006/10/23 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
DOM精简教程
2006/10/03 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
Web开发之JavaScript
2012/03/29 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jQuery元素选择器用法实例
2014/12/23 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
考试退步检讨书
2014/01/15 职场文书
小学体育教学反思
2014/01/31 职场文书
低碳环保倡议书
2014/04/14 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python