ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mitmproxy的使用详解

2021-07-17 21:04:57  阅读:234  来源: 互联网

标签:http data mitmproxy 详解 mitmdump 使用 chenshifeng mitmweb


mitmproxy 相比Charles、fiddler的优点在于,它可以命令行方式或脚本的方式进行mock
mitmproxy不仅可以像Charles那样抓包,还可以对请求数据进行二次开发,进入高度二次定制
大家可以先查看下官网的相关文档

mitmproxy安装

Mac安装

brew  install  mitmproxy

Windows安装

该方法同样适用于Mac,是利用Python安装的

pip install pipx
pipx install mitmproxy

也可以直接使用 pip install mitmproxy命令安装
如果是Mac,通过这2条命令安装完后,会自动添加好环境变量。
但对于Windows来说,就需要我们手动添加环境变量了,Windows安装成功的提示中会给出需要配置的目录,将其配置到path环境变量中即可

今天发现windows通过 pip install mitmproxy命令安装也会自动添加好环境变量

推荐使用Python进行安装,注意Python版本需大于等于3.6

安装并配置完环境变量后,可以通过查看版命令本mitmproxy --version 验证我们是否安装并配置好环境变量

mirmproxy使用

同Charles一样,在使用mitmproxy之前,我们需要先安装整数
在连接mitmproxy代理之后,通过访问连接:http://mitm.it/ 来安装证书

选择相应版本安装即可,注意安装完证书后需要信任证书后才能正常进行抓包

mitmproxy 工具有以下三部分组成

  • mitmproxy -> 命令行工具(win不支持)
  • mitmdump -> 加载 python 脚本
  • mitmweb -> web 界面工具
    常用参数
    -h 帮助信息
    -p 修改监听端口
    -s 加载 python 脚本
    默认监听端口8080

mitmproxy

mitmproxy是已命令行的方式运行的
例:监听8999端口进行抓包

mitmproxy -p 8999 


可以通过上下移动鼠标滚轮的切换请求,选中某一请求后单击可查看请求详情

然后通过q命令可以返回到主界面,然后通过f命令加上要过滤的参数可以过滤请求,如下是只展示包含mitmproxy的请求

最后可以通过q命令退出

mitmweb

mitmweb是启动同mitmproxy启动方式一样,与mitmproxy不同的是,mitmweb是有web页面的
例:启动mitmweb并指定监听8999端口

mitmweb -p 8999

遇到的坑,当我通过命令mitmweb -p 8999 启动时,报OSError: [Errno 48] Address already in use 的错误,报错详情如下:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/bin/mitmweb", line 8, in <module>
    sys.exit(mitmweb())
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/main.py", line 168, in mitmweb
    run(web.master.WebMaster, cmdline.mitmweb, args)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/main.py", line 127, in run
    master.run()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/web/master.py", line 108, in run
    http_server.listen(self.options.web_port, self.options.web_host)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/tornado/tcpserver.py", line 151, in listen
    sockets = bind_sockets(port, address=address)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/tornado/netutil.py", line 174, in bind_sockets
    sock.bind(sockaddr)
OSError: [Errno 48] Address already in use

以上报错是因为,mitmweb启动需要使用8081端口,而我的8081端口已经被占用了,终止占用的进程之后,启动成功

chenshifengdeMacBook-Pro:~ chenshifeng$ lsof -i:8081
COMMAND PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    456 chenshifeng  128u  IPv6 0xfe3ce857c44c2c7d      0t0  TCP localhost:sunproxyadmin (LISTEN)
chenshifengdeMacBook-Pro:~ chenshifeng$ kill 456
chenshifengdeMacBook-Pro:~ chenshifeng$ mitmweb -p 8999
Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8999


页面功能介绍:


miemweb mock数据使用:


mitmdump

mitmdump是核心,需要重点掌握
mitmdump 是 mitmproxy 的命令行版本,近似于 charles 的命令行版本
python:mitmproxy
功能和 charles、fiddler 相似,强大之处在于它的工具 mitmdump 可以直接对接 python 对请求做处理
mitmdump 是 mitmproxy 的命令行窗口,同时还可对接 python 对请求进行处理,因此就不用手动截获和分析 http 请求和响应,只需要写好请求和响应的处理逻辑即可

录制与回放

  • 录制:mitmdump -w 文件名
  • 过滤:mitmdump -nr 文件名 -w 文件名2 "~s chenshifeng"
  • 回放:mitmdump -nC 文件名

参数

  • -s "script.py --bar" # 执行脚本,通过双引号来添加参数
  • -n 不启动代理
  • -r 读取文件内容
  • -w 写入文件
  • ~s 过滤响应数据
  • ~q 过滤请求数据
  • 更多参数见:https://docs.mitmproxy.org/stable/concepts-filters/
    例1:监听8999端口,并录制请求数据,保存到baidu.txt文件
mitmdump -p 8999 -w baidu.txt

打开百度搜索,依次搜索mitmproxy、mitmweb、mitmdump,然后结束录制。录制结束后,会在当前目录下生成二进制录制文件baudu.txt
例2:过滤上面录制的请求,只保存搜索mitmdump的数据

mitmdump -nr baidu.txt -w mitmdump.txt "~s mitmdump"
chenshifengdeMacBook-Pro:mitm chenshifeng$ mitmdump -nr baidu.txt -w mitmdump.txt "~s mitmdump"
Only processing flows that match "~s mitmdump"
127.0.0.1:54144: GET https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33423,33429…
              << 200 OK 675b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=11&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn…
              << 200 OK 214b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn=…
              << 200 OK 24.8k
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=eaf04f36001734b3&istc=361&ve…
              << 200 OK 78b
127.0.0.1:54153: GET https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/w.gif?q=mitmdump&fm=se&T=1612592652&y=9FD1FDF9&r…
              << 200 OK 0b
127.0.0.1:54149: GET https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=%5B%7B%7D%5D&…
              << 200 OK 0b
chenshifengdeMacBook-Pro:mitm chenshifeng$ ls
baidu.txt    mitmdump.txt

例3:回放mitmdump.txt 文件接口

mitmdump -nC mitmdump.txt
chenshifengdeMacBook-Pro:mitm chenshifeng$ mitmdump -nC mitmdump.txt
127.0.0.1:54144: GET https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33423,33429…
              << 200 OK 676b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=11&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn…
              << 200 OK 214b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn=…
              << 200 OK 25k
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=eaf04f36001734b3&istc=361&ve…
              << 200 OK 78b
127.0.0.1:54153: GET https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/w.gif?q=mitmdump&fm=se&T=1612592652&y=9FD1FDF9&r…
              << 200 OK 0b
127.0.0.1:54149: GET https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=%5B%7B%7D%5D&…
              << 200 OK 0b
chenshifengdeMacBook-Pro:mitm chenshifeng$ 

mitmdump 脚本

例1:增加请求的头信息

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_mitm.py
@time:2020/11/29
"""
from mitmproxy import http

def request(flow: http.HTTPFlow):
# 增加请求的头信息
flow.request.headers["myheader"] = "shifeng"
print(flow.request.headers)

加载脚本:mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_mitm.py

例2:实现Charles中的MapLocal功能

修改返回值:

mitmdump脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_maplocal.py
@time:2020/11/29
"""
from mitmproxy import http

def request(flow: http.HTTPFlow):
# 修改判断条件
if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
# 打开保存在本地的数据文件
with open("/Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/quote.json") as f:
# 创造一个 response
flow.response = http.HTTPResponse.make(
200, # (optional) status code
# 读取文件中数据作为返回内容
f.read(),
# 指定返回数据的类型
{"Content-Type": "application/json"} # (optional) headers
)

加载脚本: mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_maplocal.py

例3:实现Charles中的MapRemote功能

mitmdump脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_rewrite.py
@time:2020/11/29
"""
import json

from mitmproxy import http

def response(flow: http.HTTPFlow):
# 加上过滤条件
if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
# 把响应数据转化成python对象,保存到data中
data = json.loads(flow.response.content)
# 对第一个股票保持原样
data['data']['items'][0] = data['data']['items'][0]
# 对第二个股票名字加长一倍
data['data']['items'][1]['quote']['name'] = data['data']['items'][1]['quote']['name'] * 2
# 对第三个股票名字变成空
data['data']['items'][2]['quote']['name'] = None
# 把修改后的内容赋值给 response 原始数据格式
flow.response.text = json.dumps(data)

加载脚本: mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_rewrite.py

更多例子详见官网介绍:https://docs.mitmproxy.org/stable/addons-scripting/

转载至https://www.cnblogs.com/feng0815/p/14379953.html

标签:http,data,mitmproxy,详解,mitmdump,使用,chenshifeng,mitmweb
来源: https://www.cnblogs.com/R-bear/p/15024809.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有