from–https://joenchen.com/post/sslcapturing/
现在基本上互联网的流量都是https了,一般正常的抓包方法是使用Charles一类的抓包工具,这种抓包工具都会在系统里面安装一个根证书,通过中间人的方式,欺上瞒下进行抓包,不过现在越来越多的程序除了使用https外还使用了SSL Pinning技术,导致这种中间人方式抓包会失败。需要手动的patch程序,修改验证客户端或者服务端证书的代码,不过现在又有了一种新的抓包方式,写一个hook工具,把SSL交互的过程那几个重要的值记录下来,然后生成SSLKEYLOGFILE文件,然后使用Wireshark 导入SSLKEYLOGFILE进行解密。
以下代码可以支持OpenSSL ,生成SSLKEYLOGFILE文件,是通过LD_PRELOAD的方式hook SSL_new,其实就是直接设置OpenSSL的SSL_CTX_set_keylog_callback回调。
https://zhuanlan.zhihu.com/p/157698929
以下代码是在iOS上使用frida实现hook的方式,iOS 11之后就切换到BoringSSL了,使用方式也是类似的,直接hook的SSL_CTX_new,道理都是一样的。
https://andydavies.me/blog/2019/12/12/capturing-and-decrypting-https-traffic-from-ios-apps/
下面是iOS上越狱开发的代码。通过theos hook SSL_CTX_new。
https://github.com/evilpenguin/BoringSSLKeys
Python就更简单了,从Python 3.8开始,是直接支持SSLKEYLOGFILE的.
|
|
搞定了OpenSSL(BoringSSL)还有Python之后,基本上就可以处理Linux上和mac的流量问题了,不过Windows使用的是Schannel, 并没有公布接口导出SSL交互的几个密钥,下面有两篇文章通过hook的生成SSLKEYLOGFILE需要的那几个值
https://b.poc.fun/decrypting-schannel-tls-part-1/
如果是直接hook系统打印明文收发包可以看这份代码
https://github.com/NytroRST/NetRipper
一般情况下,其实Windows上我们是很少使用Schannel接口进行通讯的,一般都被更高层的网络库函数所包装了,不过这里也找到一份使用SSPI的代码,用C++做了一遍包装,使用起来就比较方便