mitmproxy是Man In The Middel Proxy的简称,可以用来在开发过程中的时候做客户端和服务器之间的HTTP消息处理工具。

mitmproxy是用Python写成的,如果下载安装包安装的话,因为带有一个Python解释器,会比较大。如果不喜欢下载一个打包,可以选择用pipx安装。

pipx介绍

pipx有点像nodejs的npx,可以用来将PyPI上的包下载下来,当作可执行程序使用。它支持以下协议的处理:

  • HTTP/1.0
  • HTTP/1.1
  • HTTP/2
  • WebSocket

可以被当作可执行文件的PyPI包必须具有“console script entry points”。poetry用户看这边

pipx受下面两个程序启发:

使用pipx安装mitmproxy

:: 安装pipx
pip install pipx
:: 安装mitmproxy
pipx install mitmproxy

mitmproxy的可执行程序会被安装到%USERPROFILE%\.local\bin,使用pipx ensurepath可以将前面的路径添加到PATH环境变量中。

mitmproxy带有三个命令

  • mitmproxy ,命令行界面,无法在windows运行
  • mitmweb,web界面,默认可以通过127.0.0.1:8081访问
  • mitmdump ,一个类似tcpdump的工具

pipx run

如果不想安装全局的可执行命令,可以使用pipx run来单次执行所需命令,示例如下:

pipx run --spec PACKAGE==1.0.0 $APP
pipx run --spec git+https://github.com/psf/black.git black
pipx run --spec git+https://github.com/psf/black.git@branch black  # branch of your choice
pipx run --spec git+https://github.com/psf/black.git@ce14fa8b497bae2b50ec48b3bd7022573a59cdb1 black  # git hash
pipx run --spec https://github.com/psf/black/archive/18.9b0.zip black # install a release
pipx run https://gist.githubusercontent.com/cs01/fa721a17a326e551ede048c5088f9e0f/raw/6bdfbb6e9c1132b1c38fdd2f195d4a24c540c324/pipx-demo.py
pipx is working!

mitmproxy的功能

作为中间人,对http的请求和回复做改动:

  • Anticache,除掉if-none-match和if-modified-since头,避免缓存
  • Client-side replay,可以记录客户端发送的http请求,然后播放给服务端。这些记录的http请求时序列化播放的。
  • Proxy Authentication,要求用户提供正确验证信息,才能使用mitmproxy
  • Replacements,指定一条规则/patt/regex/replacement,以patt匹配流,然后用regex搜索匹配的流的数据,将其替换成replacement。replacement如果以@开头,表面数据从指定的文件读取。一个例子:mitmdump --replacements :~q:foo:@~/xss-exploit
  • Server-side replay,记录和播放服务端的回复
    • Response refreshing,辅助上面那条功能,刷新回复中的信息头(比如date, expires和last-modified )
    • Replaying a session recorded in Reverse-proxy Mode,在反向代理的方式下回放
  • Set Headers,指定/patt/name/value添加额外的信息头
  • Sticky auth,有点类似于sticky cookie
  • Sticky cookies,对于没有cookie的reqeust,加上额外的cookie
  • Streaming,将所有的处理过的request和response转发给第三方
    • Customizing Streaming,可以用脚本控制哪些request/response需要缓存
    • Websockets,支持对Websockets做转发
  • Upstream Certificates,在客户端和服务端之间嗅探SSL/TLS加密信息

传统的HTTPS代理无法嗅探TLS加密的内容,mitmproxy的做法是伪装成一个CA,然后再成为一个HTTPS代理,这样加密就分为两段,第一段从客户端到mitm,第二段从mitm到服务端,两段对mitm都是可见的。这么做的前提是客户端要导入mitm的证书。更多参考How mitmproxy works

Modes of Operation提供了若干种代理模式的说明:

  • Regular Proxy,常规代理,就是按常规方式配置系统的代理,所有数据流经mitm。打开mitm.it可以看到特殊页面。
  • Transparent Proxy,透明代理,不需要用户再HTTP层做任何设置,代理在传输层发生作用。但是带来的缺点是,客户端无法设置不走代理。
  • Reverse Proxy,反向代理,只针对某个服务端的请求做处理,一个例子是将https重定向到http:mitmdump -p 443 --mode reverse:http://localhost:80/
  • Upstream Proxy,上游代理,将请求转发给另一个代理
  • SOCKS Proxy,顾名思义,SOCKS5代理

使用listen_host选项可以将mitmproxy的侦听地址划为本地:mitmdump -p 443 --mode reverse:http://localhost:8088 --listen-host 127.0.0.1

其他

mitmproxy文档

其他参考

类似工具

(本篇完)

2020-05-31 更新

Reverse Proxy模式下mitmproxy会自动设置Host信息头。在Host Header的描述如下:

In reverse proxy mode, mitmproxy automatically rewrites the Host header to match the upstream server. This allows mitmproxy to easily connect to existing endpoints on the open web (e.g. mitmproxy –mode reverse:https://example.com). You can disable this behaviour with the keep_host_header option.

也就是:--set keep_host_header=true

也可以使用–set-headers来强制指定Host,比如在Set Headers的例子

mitmdump -R http://example.com --setheader :~q:Host:example.com

关于~q,其代表的是Match request with no response,参考Filter expressions

(更新完)

2020-10-20更新

其他软件

其他文章

(跟新完)