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字典操作实例详解
Nov 16 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python字符串Intern机制详解
Jul 01 Python
Python generator生成器和yield表达式详解
Aug 08 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
django 装饰器 检测登录状态操作
Jul 02 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
详解Python 函数参数的拆解
Sep 02 Python
python​格式化字符串
Apr 20 Python
LeetCode189轮转数组python示例
Aug 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python thread 并发且顺序运行示例
2009/04/09 Python
简单理解Python中基于生成器的状态机
2015/04/13 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
python字典改变value值方法总结
2019/06/21 Python
windows支持哪个版本的python
2020/07/03 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
护理专业学生职业生涯规划范文
2014/03/11 职场文书
敬老院标语
2014/06/27 职场文书
股东授权委托书范本
2014/09/13 职场文书
交通安全主题班会
2015/08/12 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
修辞手法有哪些?
2019/08/29 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏