mitmproxy安装和简易使用

一、安装

前言:如果只是拿 mitmproxy 做一个替代 fiddler 的工具,没有什么定制化的需求,那完全只需要“安装 mitmproxy 工具”即可,去 mitmproxy 官网 上下载一个 installer 便可开箱即用,不需要提前准备好 python 开发环境。但显然,这不是这里要讨论的,我们需要的是“安装 python 的 mitmproxy 包”,本文只提及到python使用的mitmproxy脚本的简易使用(windows)

1 安装mitmproxy

直接使用pip安装即可

pip install mitmproxy

完成后,系统将拥有 mitmproxymitmdumpmitmweb 三个命令,由于 mitmproxy 命令不支持在 windows 系统中运行(这没关系,不用担心),我们测试一下安装是否成功,执行:

mitmdump --version

应当可以看到类似于这样的输出:  

mitmdump

2 配置mitmproxy

用户目录下边

C:UsersDell.mitmproxy  # 对应用户目录下都有一个.mitmproxy目录

 不知道用不用装,我是都安装了。

 2.1 控制面板==》 网络和 Internet ==》连接  ==》局域网设置   (本地pc设置)

2.2谷歌浏览器:chrome://settings/system ==》打开您计算机的代理设置  ==》(浏览器拦截,列如抓取web)

2.3 手机配置就是配置ip代理和端口

打开手机浏览器:输入http://mitm.it/   

根据图表点击自己手机对应的证书,进行安装。

 注意:ip地址都为局域网的该机器ip

3 使用mitmproxy

直接上代码吧

from mitmproxy import ctx

# 所有发出的请求数据包都会被这个方法所处理
# 所谓的处理,我们这里只是打印一下一些项;当然可以修改这些项的值直接给这些项赋值即可
def request(flow):
    # 获取请求对象
    request = flow.request
    # 实例化输出类
    info = ctx.log.info
    # 打印请求的url
    info(request.url)

    # 打印请求方法
    info(request.method)
    # 打印host头
    info(request.host)
    # 打印请求端口
    info(str(request.port))
    # 打印所有请求头部
    info(str(request.he
aders))
    # 打印cookie头
    info(str(request.cookies))


# # 所有服务器响应的数据包都会被这个方法处理
# # 所谓的处理,我们这里只是打印一下一些项
def response(flow):
    # 获取响应对象
    response = flow.response
    # 实例化输出类
    info = ctx.log.info
    # 打印响应码
    info(str(response.url))
    # # 打印所有头部
    info(str(response.headers))
    # # 打印cookie头部
    info(str(response.cookies))
    # 打印响应报文内容
    info(str(response.text))

    print(response.content)

启动

mitmdump.exe  -s   ****.py    上边文件的路径文件

刷新浏览器 查看控制台打印的数据

4 实践mitmproxy

获取cookie或者请求头认证数据

# -*- coding:utf-8 -*-
import os
import sys
import json
import base64

import arrow
import mitmproxy.http
import redis
from everett.ext.yamlfile import ConfigYamlEnv
from everett.manager import ConfigManager
from mitmproxy import ctx

config = ConfigManager([
    ConfigYamlEnv('./config/common.yaml'),
    ConfigYamlEnv(
        './config/{}.yaml'.format(os.environ.get('BEAR_SEARCH_ENV')))
])


redis_handler = redis.Redis(host=config(
    'redis_host', parser=str), port=config('redis_port', parser=str), db=15, password=config('redis_password', parser=str))


class BearServer(object):
    def request(self, flow: mitmproxy.http.HTTPFlow):
        if 'authorization' in flow.request.headers:
            bear = flow.request.headers['authorization']

            if bear:
                bear = bear.replace('Bearer ', '').strip()
                bear_list = bear.split('.')
                if len(bear_list) == 3:
                    bear_info = base64.b64decode(bear_list[1])

                    bear_info = json.loads(bear_info)
                    exp_time = int(bear_info.get('exp'))
                    iat_time = int(bear_info.get('iat'))
                    if exp_time > 0:
                        try:
                            redis_handler.zremrangebyscore(
                                'bear_zset', 0, iat_time)
                            if not redis_handler.zscore('bear_zset', bear):
                                redis_handler.zadd(
                                    'bear_zset', {bear: exp_time})
                        except Exception as e:
                            raise e

                        ctx.log.info('获取到的bear是:{}'.format(bear))


addons = [
    BearServer()
]

 配合supervisor启动服务

[program:bear_proxy_server]
directory=/www/app_bear_proxy
command=pipenv run mitmdump -s server.py -p 9900 --set block_global=false
stderr_logfile=/var/log/supervisor/bear_proxy_server/bear_proxy_server_error.log
stdout_logfile=/var/log/supervisor/bear_proxy_server/bear_proxy_server_out.log
priority=1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

很多种用法

参考:

<wolfogre's blog:https://blog.wolfogre.com/posts/usage-of-mitmproxy/

mitmproxy官方:https://docs.mitmproxy.org/stable/

原文地址:https://www.cnblogs.com/clbao/p/11597979.html