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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
python实现自动重启本程序的方法
Jul 09 Python
Python科学计算之NumPy入门教程
Jan 15 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
python实现一组典型数据格式转换
Dec 15 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python学习笔记之While循环用法分析
Aug 14 Python
python应用文件读取与登录注册功能
Sep 23 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
Python JSON编解码方式原理详解
Jan 20 Python
Django使用channels + websocket打造在线聊天室
May 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中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
学习ExtJS border布局
2009/10/08 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
js实现登录与注册界面
2017/11/01 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
Python中collections模块的基本使用教程
2018/12/07 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
pandas 空数据处理方法详解
2019/11/02 Python
python做接口测试的必要性
2019/11/20 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
毕业生自我鉴定
2013/11/05 职场文书
淘宝活动策划方案
2014/02/06 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
销售开票员岗位职责
2015/04/15 职场文书
班主任培训研修日志
2015/11/13 职场文书
《三国志》赏析
2019/08/27 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
python glom模块的使用简介
2021/04/13 Python