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的Supervisor进行进程监控以及自动启动
May 29 Python
Python日志模块logging简介
Apr 13 Python
python实现括号匹配的思路详解
Aug 23 Python
Python列表切片操作实例总结
Feb 19 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
python实现五子棋小程序
Jun 18 Python
python redis 批量设置过期key过程解析
Nov 26 Python
如何理解python中数字列表
May 29 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
django创建css文件夹的具体方法
Jul 31 Python
Python爬虫中Selenium实现文件上传
Dec 04 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漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
php向js函数传参的几种方法
2014/08/10 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
php实现httpRequest的方法
2015/03/13 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
子页向父页传值示例
2013/11/27 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
详解javascript void(0)
2020/07/13 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python实现视频读取和转化图片
2019/12/10 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
Python 里最强的地图绘制神器
2021/03/01 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
HTML5学习笔记之History API
2015/02/26 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
关于远足的感想
2015/08/10 职场文书