eCapture支持boringssl TLS 1.3明文数据包捕获

前言

一个多月前,有网友反馈Android上,TLS 1.2明文网络包正常捕获,而1.3的密钥无法捕获。笔者得知这个问题后,花了几个周末时间修复、添加了这个功能。在这期间,笔者工作繁忙以及感染新冠,整个功能拖了1个月 才完成。精力与体力,支撑起来越来越吃力。搞开源,全是靠爱发电,实属不易。

值得庆幸的是,收获了5400星的关注,这也是对笔者最大的认可。

这个周末,发布了eCapture 0.4.11版本,支持boringssl的TLS 1.3的密钥捕获,支持明文解密pcapng数据包存储。 有需要的朋友可以下载使用。

eCapture卡通人物

其次,这次支持boringssl的TLS 1.3明文数据包捕获,还遇到了一些技术性问题,在这里也一并分享给大家。

boringssl与openssl的差异

Google开源了boringssl这个SSL加密类库,是基于openssl的增强版。使用C++封装C的类库,在结构体内存布局上,与openssl有一些差异。而且TLS通信密钥捕获的Hook函数上,与openssl有差异。在openssl中,只需要HOOK SSL_writeSSL_read 两个函数,读取参数中SSL结构体的内存布局,定位相关SSL密钥存储地址,即可读取密钥。

而在boringssl中,在调用SSL_write函数时,这个TLS链接可能还没建立好。需要寻找更合适的HOOK函数,笔者在实现时,做了大量的测试、调试工作,最终在SSL_do_handshakeSSL_in_init两个函数中,选择了SSL_in_init,进行密钥的读取。

实际使用时,仍会有s3_st为空、s3->hs地址为空的情况,以及TLS未建立、正在握手中,密钥不完整等情况,笔者最后选择将所有eBPF捕获内存数据,通过bpf map发送给用户空间程序,再在用户空间判断密钥,进行过滤,曲折实现。

android boringssl与普通boringssl的差异

说到boringssl,刚接触的人可能搞不清楚版本,认为google在github上开源的https://github.com/google/boringssl.git 项目就是,直接用这个测试。实际上,Android系统使用的boringssl并不是这个仓库,而是 https://android.googlesource.com/platform/external/boringssl ,二者的差异,对ecapture来说,其结构体的内存布局不一样,属性的偏移地址不一样。

笔者就被这个问题困扰很久,为什么在PC上,使用boringssl测试成功,而在android手机上却无法工作。手机、模拟器、重刷ROM,都是不行。。一直到笔者把Android上类库源码重新检出,仔细测试boringssl的代码,才发现这个问题。 Google在这块文档上,并没有说明,实在是让人无奈。

Android boringssl偏移地址

你可以按照自己Android使用的boringssl版本,自己重新生成boringssl的偏移量,使用命令如下:

rm -f kern/boringssl_1_1_1_kern.c
bash utils/boringssl_offset_1.1.1.sh

普通boringssl类库偏移地址

在Linux上,很多类库都是支持改用openssl为boringssl的,eCapture也提供了自助生成新偏移量的脚本,它比Android boringssl命令后面多个参数1,生成命令如下:

rm -f kern/boringssl_1_1_1_kern.c
bash utils/boringssl_offset_1.1.1.sh 1

偏移地址差异diff

Linux上普通boringssl类库的eCapture使用

以curl类库为例,启用boringssl的编译命令如下:

git clone https://github.com/curl/curl.git
autoreconf -fi
LIBS=-lpthread ./configure --with-ssl=/home/cfc4n/project/boringssl --enable-versioned-symbols
make
sudo make install
sudo ldconfig

如果你在编译启用boringssl的curl遇到错误时,可以参考笔者的经历:alt-svc build error on ubuntu 18.04: missing struct tm #9989

eCapture捕获命令:

bin/ecapture tls --libssl=/usr/local/lib/libcurl.so.4 --ssl_version="boringssl 1.1.1" -w a.pcapng -i ens33

功能演示

演示环境

系统:macOS

模拟器:Android Studio Dolphin | 2021.3.1 Patch 1

镜像ROM:Pixel 3a API 33 x86_64

内核:Linux localhost 5.10.66-android12-9-00041-gfa9c9074531e-ab7914766 #1 SMP PREEMPT Fri Nov 12 11:36:25 UTC 2021 x86_64

测试APP:百度手机助手9.5.8.1

演示命令

启动eCapture

emulator64_x86_64_arm64:/data/local/tmp # ./ecapture tls -w aa.pcapng -i wlan0
tls_2023/01/08 14:02:54 ECAPTURE :: ecapture Version : androidgki_x86_64:0.4.11-20230107-59a76e0:5.4.0-131-generic
tls_2023/01/08 14:02:54 ECAPTURE :: Pid Info : 26496
tls_2023/01/08 14:02:54 ECAPTURE :: Kernel Info : 5.10.66
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    module initialization
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    Module.Run()
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    TC MODEL
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    OpenSSL/BoringSSL version not found, used default version :android_default
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    HOOK type:2, binrayPath:/apex/com.android.conscrypt/lib64/libssl.so
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    Ifname:wlan0, Ifindex:16,  Port:443, Pcapng filepath:/data/local/tmp/aa.pcapng
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    Hook masterKey function:SSL_in_init
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    target all process.
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    target all users.
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    BPF bytecode filename:user/bytecode/boringssl_1_1_1_kern.o
tls_2023/01/08 14:02:54 EBPFProbeOPENSSL    module started successfully.
tls_2023/01/08 14:02:54 ECAPTURE ::     start 1 modules
794b86e16f4f17d1c90fee21e72d56aa92c1f4deb5f7494c0eab9598895d48ff to file success, 176 bytes
tls_2023/01/08 14:05:06 TLS1_3_VERSION: save CLIENT_RANDOM 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 to file success, 778 bytes
tls_2023/01/08 14:05:43 TLS1_2_VERSION: save CLIENT_RANDOM 50a103ecbdd2a84c707eeda3262381ab8a427993c2407ecd537ae2414978f821 to file success, 176 bytes

捕获的TLS 1.3密钥

130|emulator64_x86_64_arm64:/data/local/tmp # cat ecapture_masterkey.log
CLIENT_HANDSHAKE_TRAFFIC_SECRET 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 e34deeab543a3cd63e8009737a4cf4188e9f5c2b6588e5b72874055818004c6c
CLIENT_TRAFFIC_SECRET_0 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 82857c8eb07c88b6c56c9d38759c23cc6d14d9dd23a37bb17fa41e5913cf211e
SERVER_HANDSHAKE_TRAFFIC_SECRET 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 bef4cde1643c47d5971f226e9d637155d55087184f0f75963db792d71afc56c0
SERVER_TRAFFIC_SECRET_0 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 c949827f3150a3c4c4589478caa1b2987493dd17dfe008aa26ce9b881d9af21b
EXPORTER_SECRET 7fbea9bdcc818fb80cc04c1d0ad0c0c870cf97267678d42fa6026dd92cfa6b20 0b0017b44c8ac50126a7aeb03494d1454f7f4ec560fbaba144198eb74ddab280
CLIENT_RANDOM 50a103ecbdd2a84c707eeda3262381ab8a427993c2407ecd537ae2414978f821 e1a6d3edd5f4e817aea86b2d15d3d21a23c8d2d60770c36819303e25873f30089d555d447ab29b8208b8c0ecd230405a

演示截图:

eCapture链接地址

eCapture v0.4.11 下载地址

eCapture 官网

eCapture 代码仓库

未来展望:

eCapture功能趋于稳定,以及笔者经历有限,未来更新频率可能会降低,欢迎广大网友参与其中,一起为开源做贡献,一起为你点赞。

知识共享许可协议CFC4N的博客CFC4N 创作,采用 署名—非商业性使用—相同方式共享 4.0 进行许可。基于https://www.cnxct.com上的作品创作。转载请注明转自:eCapture支持boringssl TLS 1.3明文数据包捕获