使用 mitmproxy

什么是 mitmproxy

mitmproxy是一款支持HTTP(S)的中间人代理工具。不同于Fiddler2,burpsuite等类似功能工具,mitmproxy可在终端下运行。mitmproxy使用Python开发,是辅助web开发&测试,移动端调试,渗透测试的工具。

官网: https://mitmproxy.org/

安装

mac 安装

brew install mitmproxy

pip3 install mitmproxy

说明

mitmproxy 提供了3个命令 :

  • mitmdump :纯命令行界面,类似 tcpdump
  • mitmproxy :命令行模式,类似 vim
  • mitmweb :带 web 界面的

mitmproxy

直接执行 mitmproxy 会打开本机的8080端口

然后手机开启http 代理,设置完代理后访问 mitm.it

点击对应的图标安装证书并使系统信任该证书,安装证书是为了当请求 HTTPS 页面的内容也可以看到具体的请求头和响应头信息,然后访问页面 PC 端就会出现对应的请求信息了

按方向键上下键进入对应的 URL 内查看请求 响应等字段,按左右键切换,按 q 键返回主界面。

在请求列表界面按 i,在左下角会显示 Intercept filter:,要求输入过滤表达式,用于指示拦截哪些请求,此处的过滤表达式的语法同请求列表过滤表达式相同。

比如输入 baidu.com,则当请求到百度时候请求会被拦截并以橙色标识(颜色根据终端设置不一样会显示不一样)

请求拦截后可以编辑重新发送,也可以直接放行,比如进入到该请求的响应里面按 e 键设置一些参数

自定义端口和 IP 和端口

mitmproxy --listen-host 0.0.0.0 -p 8888

mitmweb

执行 mitmweb 后会打开浏览器

出现如图所示的对话框,当有请求时候则都会显示在这里

mitmdump

默认执行 mitmdump

三个命令具体的参数都可以看帮助

--help

API

from mitmproxy import http

def request(flow: http.HTTPFlow):
    # redirect to different host
    if flow.request.pretty_host == "example.com":
        flow.request.host = "mitmproxy.org"
    # answer from proxy
    elif flow.request.path.endswith("/brew"):
        flow.response = http.HTTPResponse.make(
            418, b"I'm a teapot",
        )

python 的相关 exmaples 可以查看 GitHub 源码

比如说将所有请求头的 server 都改成 nginx

from mitmproxy import http


def response(flow: http.HTTPFlow) -> None:
    flow.response.headers["newheader"] = "foo"

保存为 Python 文档后执行

mitmproxy -s xxx.py