设置proxydroid并使用此脚本启动应用程序后,现在我们可以看到HTTP流量了:
我已经在一些Flutter应用程序上对此进行了测试,这种方法适用于所有应用程序。由于BoringSSL库较为稳定,因此这种方法可能会在未来很长一段时间内都有效。
禁用 SSL Pinning(SecurityContext)
最后,让我们看看如何绕过SSL Pinning。一种方法是定义一个包含特定证书的新SecurityContext。
对于我的应用程序,我添加了以下代码让它只接受我的Burp证书。SecurityContext构造函数接受一个参数withTrustedRoots,默认为false。
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591890159967360应用程序现在将自动接受我们的Burp代理作为任意网站的证书。如果我们现在将其切换到nviso.eu证书,我们将无法拦截连接(请求和响应)。
幸运的是,上面列出的Frida脚本已经绕过了这种root-ca-pinning实现,因为底层逻辑仍然依赖于BoringSSL库的相同方法。
禁用 SSL Pinning(ssl_pinning_plugin)
Flutter开发人员执行ssl pinning的方法之一是通过 ssl_pinning_plugin flutter插件。此插件实际上是发送一个HTTPS连接并验证证书,之后开发人员将信任该通信并执行non-pinned HTTPS请求:
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591890207335658该插件是Java实现的,我们可以使用Frida轻松的hook:
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591890236640183结论
这是一个非常有趣的过程,因为Dart和BoringSSL都是开源的,所以进行的非常顺利。由于字符串的数量并不多,因此即使没有任何符号,也能很容易的找到禁用ssl验证逻辑的正确位置。我扫描函数序言(function prologue)的方法可能并不总是有效,但由于BoringSSL非常稳定,因此在未来的一段时间内它应该都会有效。