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 08 Python
Python set集合类型操作总结
Nov 07 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
深入浅析python 协程与go协程的区别
May 09 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
python脚本第一行如何写
Aug 30 Python
python 进程池pool使用详解
Oct 15 Python
python游戏开发Pygame框架
Apr 22 Python
python如何将mat文件转为png
Jul 15 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
JS自动缩小超出大小的图片
2012/10/12 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
js中的闭包实例展示
2018/11/01 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
python生成日历实例解析
2014/08/21 Python
基于Python闭包及其作用域详解
2017/08/28 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
Django Celery异步任务队列的实现
2019/07/24 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
计划生育诚信协议书
2014/11/02 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python