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 拆包可迭代数据如tuple, list
Dec 29 Python
用pandas按列合并两个文件的实例
Apr 12 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
django的ORM操作 增加和查询
Jul 26 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Django项目后台不挂断运行的方法
Aug 31 Python
keras实现多种分类网络的方式
Jun 11 Python
如何利用python进行时间序列分析
Aug 04 Python
python 实现图片批量压缩的示例
Dec 18 Python
python 制作一个gui界面的翻译工具
May 14 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
package.json文件配置详解
2017/06/15 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Django 用户认证组件使用详解
2019/07/23 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
大学生就业自荐信
2013/10/26 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
优秀教师主要事迹
2014/02/01 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
股份合作协议书范本
2014/04/14 职场文书
教师考察材料范文
2014/06/03 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
2016年国陪研修感言
2015/11/18 职场文书
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL