zoukankan      html  css  js  c++  java
  • mitmproxy使用详解

    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/

    如果您觉得本篇文章还不错,欢迎点赞,转发分享(转发请注明出处),感谢~~
  • 相关阅读:
    嵌入式
    IT 管理
    linux 网络编程 排序
    linux frameBuffer
    虚拟现实
    vc 串口
    OpenGLES 图像
    runloop
    归档
    商标查询
  • 原文地址:https://www.cnblogs.com/feng0815/p/14379953.html
Copyright © 2011-2022 走看看