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自动化部署工具Fabric的简单上手指南
Apr 19 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
django缓存配置的几种方法详解
Jul 16 Python
Python字符串逆序的实现方法【一题多解】
Feb 18 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
TensorFlow 显存使用机制详解
Feb 03 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 Python
Python如何用re模块实现简易tokenizer
May 02 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
用ODBC的分页显示
2006/10/09 PHP
PHP实现用户认证及管理完全源码
2007/03/11 PHP
收藏的一个php小偷的核心程序
2007/04/09 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
Python实现EM算法实例代码
2020/10/04 Python
PHP如何与mysql建立链接
2013/05/05 面试题
接口可以包含哪些成员
2012/09/30 面试题
幼儿园教学管理制度
2014/02/04 职场文书
大学新闻系求职信
2014/06/03 职场文书
节能环保标语
2014/06/12 职场文书
师范生求职信
2014/06/14 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
2014年教师工作总结
2014/11/10 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
英文产品推荐信
2015/03/27 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
OpenCV全景图像拼接的实现示例
2021/06/05 Python
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS