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中wx将图标显示在右下角的脚本代码
Mar 08 Python
python批量提交沙箱问题实例
Oct 08 Python
在SAE上部署Python的Django框架的一些问题汇总
May 30 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
Python整数对象实现原理详解
Jul 01 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
python脚本框架webpy模板控制结构
Nov 20 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动态生成虚拟现实VRML网页
2006/10/09 PHP
windows xp下安装pear
2006/12/02 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
PHP7新功能总结
2019/04/14 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
Python中扩展包的安装方法详解
2017/06/14 Python
python数据封装json格式数据
2018/03/04 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
什么是Python变量作用域
2020/06/03 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
学生出入校管理制度
2014/01/16 职场文书
3分钟演讲稿
2014/04/30 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
2014年实习期工作总结
2014/11/27 职场文书