作者回复: 很好:)我提第二个问题也是想鼓励大家去实践一下,这个过程会把知识掌握的更好,你做的很赞~
作者回复: 可以参考这个文档:https://firefox-source-docs.mozilla.org/security/nss/legacy/key_log_format/index.html RSA: 48 bytes for the premaster secret, encoded as 96 hexadecimal characters (removed in NSS 3.34) CLIENT_RANDOM: 48 bytes for the master secret, encoded as 96 hexadecimal characters (for SSL 3.0, TLS 1.0, 1.1 and 1.2) 如果keylog文件中,记录行的开头是CLIENT_RANDOM,那么第三列的数字是master secret。如果开头是RSA,那么第三列就是premaster secret。 供你参考:)
作者回复: 你好,课程里有介绍,对于一个客户端来说,就是下面三个步骤: 1. 创建一个用来存放 key 信息的日志文件,然后在系统里配置一个环境变量 SSLKEYLOGFILE,它的值就是这个文件的路径。 2. 重启浏览器,启动抓包程序,然后访问 HTTPS 站点,此时 TLS 密钥信息将会导出到这个日志文件,而加密报文也会随着抓包,被保存到抓包文件中。补充:如果是 Mac 又不想改动全局配置,那么你可以在 terminal 中的 export SSLKEYLOGFILE=路径,然后执行 open "/Applications/Google\ Chrome.app",这时 Chrome 就继承了这个 shell 父进程的环境变量,而 terminal 退出后,这个环境变量就自动卸除了。 3. 在 Wireshark 里,打开 Preferences 菜单,在 Protocol 列表里找到 TLS,然后把 (Pre)-Master-Secret log filename 配置为那个文件的路径。 如果你说的linux是指服务端,那要看具体的应用本身。比如,如果这台linux是nginx,那么可以参考我对“宝仔”铜须的提问的答复,即:默认不行,所以有人写了一个程序模块在做这件事,参考https://security.stackexchange.com/questions/216065/extracting-openssl-pre-master-secret-from-nginx
作者回复: tcpdump只是抓取网络报文(TLS报文),具体的解密是需要密钥文件的,而密钥文件是通过“openssl库能通过SSLKEYLOGFILE这个系统变量来导出”这个特性来实现的。 有了tcpdump的抓包文件,结合密钥文件,wireshark就可以解出密文。 如果你问的是tcpdump抓取https流量的具体命令,那就很简单。如果https是在443端口上,那就是tcpdump port 443 如果要导出到文件,就假设-w file.pcap,比如变成tcpdump -w file.pcap port 443 如果还是抓取不到报文,有可能要指定抓取所有网卡接口,加上-i any,就变成tcpdump -i any -w file.pcap port 443
作者回复: 你是指wireshark里看到的吗?
作者回复: ssl pin是指,做了pin(别针绑定)的证书才会被这个客户端(比如app)信任,其他的证书哪怕是合规CA签发的也不信任。这样可以达到更高的安全级别(当然也会带来别的问题)。 你说的Just TrustMe能破解ssl pin,推测是从系统内部hook了跟ssl通信相关的函数。比如,本来走向ssl verification的函数被替换了,而这个替换函数就不会去校验是否有pin了,那就相当于解除了pin。 andriod方面我是外行,不过从原理上讲估计就是这样了~
作者回复: 解密不出来,具体是指什么?keylog文件里没有对应的key信息生成?还是有keylog信息,但是导入到wireshark后还是不能解密?
作者回复: 我看你已经自己搞定啦:)
作者回复: 在重启浏览器之前sslkey.log里有写入东西吗?还是说从来没有没有写入过?如果是后者,那要看看具体步骤是否有遗漏了,你可以再试一下再回复我~
作者回复: 好的,也是一个有意思的新项目。根据作者的描述: “本项目hook了/lib/x86_64-linux-gnu/libssl.so.1.1的SSL_write、SSL_read函数的返回值,拿到明文信息,通过ebpf map传递给用户进程。” 它的工作机制是“截胡”用户空间程序传给SSL_write和SSL_read函数的值(应该也包括传入的参数),然后读取相应变量的数据出来,也就是下面这样: 用户空间程序 -> SSL_write/SSL_read (hook点,数据还未加密) -> syscall write/read(数据已经加密) -> NIC -> network 虽然上面这个方式也同样能读取到密文,但是它的逻辑不是抓包,所以应该是缺乏下面这些信息的: 1. 内核TCP栈对这些加密报文的发送和接收细节,比如时间戳、重传、超时等,因为这些信息是SSL库无法感知到的,所以hook以后也依然无法获取到 2. SSL库本身的行为,比如握手信息细节、TLS alert消息等,因为这些不是SSL_write/SSL_read的行为,而是SSL库自身的行为 而用key导出的方式,就结合了解密功能还有网络行为抓取的功能,信息量更多一些。主要看你的场景: 1. 如果是仅仅想解密,可以用eCapture 2 如果还要知道网络行为细节,建议用key导出的方式