现在基本上互联网的流量都是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的.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import urllib.request
import time
import os
import sslkeylog

# Or directly specify a path
path = os.environ.get( 'SSLKEYLOGFILE' )
sslkeylog.set\_keylog( path ) 

# Do anything involving SSL (Using the built-in ssl module)

while ( True ):
    data = urllib.request.urlopen( 'https://www.baidu.com' ).read()
    print( data )
    time.sleep( 5 )

搞定了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++做了一遍包装,使用起来就比较方便

http://www.naughter.com/sslwrappers.html

已经有人利用这个做出了全新的抓包工具eCapture, 也是通过Hook OpenSSL的一系列函数做到的.

https://github.com/gojue/ecapture/