最近在根据一个命令行的客户端程序,复刻它的服务端,虽然客户端程序是开源的,但是是 golang 写的,我对 golang 不是很熟悉,所以准备抓包重放来辅助复刻。

mitmproxy

使用 mitmproxy , Linux 系统可以直接在官网下载二进制文件

官网地址:https://mitmproxy.org/

下载地址:https://snapshots.mitmproxy.org/8.0.0/mitmproxy-8.0.0-linux.tar.gz

下载后解压

1
tar zxvf mitmproxy-8.0.0-linux.tar.gz

使用

1
./mitmproxy

程序监听在 127.0.0.1:8080

安装中间人证书

参考: https://docs.mitmproxy.org/stable/concepts-certificates/#installing-the-mitmproxy-ca-certificate-manually

设置代理

另起一个终端,设置代理地址为 127.0.0.1:8080

1
2
export http_proxy=127.0.0.1:8080
export https_proxy=127.0.0.1:8080

运行你的程序,这样 mitmproxy 那边就能看到相关请求了

保存抓包文件

在 mitmproxy 交互式窗口内,按w,下方会出现

1
@shown

@shown 后面 空一格子,输入绝对路径,比如/root/1.mitm,敲下回车就可以保存了。

其他快捷键可以参考官方文档,或者 https://quickref.me/mitmproxy 这个表格。

在本地浏览抓包文件

将上面的抓包文件拖回本地后,本地电脑也要安装 mitmproxy , 浏览抓包文件需要运行 mitmweb 命令,运行后程序会自动打开网页端 http://127.0.0.1:8081/

在网页端 File - Open 打开抓包文件即可浏览

为什么不用 mitmproxy 透明代理

mitmproxy 也提供透明代理,大概就是不用去设置 https_proxyhttp_proxy

详见: https://docs.mitmproxy.org/stable/howto-transparent/

但是我没有配置成功,就放弃了,现在也不是很执着必须要配置出来,不管用什么骚方法,能达到我的抓包目的就行。

探索过程

最开始我准备使用 tcpdump,可是 tcpdump 抓包是在网口上抓包,而不是在应用层面抓包,没有安装 mitm 证书的情况下,是抓不到通信内容的,虽然我也知道抓不到,但是实际上能看到什么内容我还是不太清楚的,于是专门试验了下。

结论是:

  1. 只能抓到 SNI。

  2. 请求路径,通信内容全是加密的。

SNI 是 Server Name Indication,TLS 服务器名称指示,具体是啥呢可以看这篇 https://www.cloudflare.com/zh-cn/learning/ssl/what-is-sni/

SNI 可能是 HTTPS 网站的域名,如果用了 cloudflare 这样的 CDN,那就可能是 cloudflare 证书的域名地址了。

刚好最近在做 DPI 有关的事,看了下 DPI 的 https 话单规范,里面有用点的也是只有 SNI 信息。

如果下一步, SNI 也被加密,那 https 可能算是比较安全了。