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运行的17个时新手常见错误小结
Aug 07 Python
Python实现的一个自动售饮料程序代码分享
Aug 25 Python
使用python编写监听端
Apr 12 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
Python3远程监控程序的实现方法
Jul 15 Python
Python Pandas 箱线图的实现
Jul 23 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
Python读写操作csv和excle文件代码实例
Mar 16 Python
Python如何操作docker redis过程解析
Aug 10 Python
python全面解析接口返回数据
Feb 12 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
php导入模块文件分享
2015/03/17 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
Python数据集切分实例
2018/12/08 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python logging模块的使用
2020/09/07 Python
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
竞争性谈判邀请书
2014/02/06 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
个人自我剖析材料
2014/09/30 职场文书
中学生思想品德评语
2014/12/31 职场文书
世界环境日活动总结
2015/02/11 职场文书
审美与表现自我评价
2015/03/09 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js