最近在根据一个命令行的客户端程序,复刻它的服务端,虽然客户端程序是开源的,但是是 golang 写的,我对 golang 不是很熟悉,所以准备抓包重放来辅助复刻。
mitmproxy
使用 mitmproxy , Linux 系统可以直接在官网下载二进制文件
下载地址: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
安装中间人证书
设置代理
另起一个终端,设置代理地址为 127.0.0.1:80801
2export 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_proxy
和 http_proxy
详见: https://docs.mitmproxy.org/stable/howto-transparent/
但是我没有配置成功,就放弃了,现在也不是很执着必须要配置出来,不管用什么骚方法,能达到我的抓包目的就行。
探索过程
最开始我准备使用 tcpdump,可是 tcpdump 抓包是在网口上抓包,而不是在应用层面抓包,没有安装 mitm 证书的情况下,是抓不到通信内容的,虽然我也知道抓不到,但是实际上能看到什么内容我还是不太清楚的,于是专门试验了下。
结论是:
只能抓到 SNI。
请求路径,通信内容全是加密的。
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 可能算是比较安全了。