分析

在一次测试某个银行的一个安卓APP的时候,设置代理,绕过常见的抓包限制后,发现使用BurpSuite能抓到APP关键业务的请求,但是服务端接受到请求后无法正确响应,具体表现就是在Burp中的Response窗口没有响应数据返回。

重放提示:Receives fatal alert: protocol_version

对于这种情况,发送请求数据包,抓包工具无法收到响应,排除网络问题的前提下,那肯定就是服务器做了某种校验。比如最常见的就是https双向认证,服务端会校验客户端证书,所以最开始的想法就是猜测是双向认证这种情况。

通过分析发现APP在请求的时候也确实加载了客户端证书,因此尝试提取客户端证书和密钥后,导入抓包工具BurpSuite,还是失败...........

导入证书后,还是没能成功发起请求获取响应数据包,但是在不进行代码抓包的情况下网络又是正常通信的。

我们知道当使用代理抓包https时,本身客户端—服务器的一段请求,会被分为两段请求,代理抓包过程中的第二段请求 的相当于就是由中间人作为一个新的客户端 对 服务端进行通信。

所以目前的情况就是 客户端 — 服务端 通信正常,中间人 — 服务端 通信异常(服务端不认中间人发过来的请求)。

具体为什么不认呢?Burp没有给出太详细的说明,所以就想着复制URL到浏览器中访问,这个时候访问url的不是APP这个客户端,不是Burp这个客户端,而是浏览器。

浏览器访问目标url提示:

不支持的协议
客户端和服务器不支持常用的 SSL 协议版本或密码套件

最后通过检索相关资料,大概率可能是由于不是常用的密码套件导致。那APP使用的什么密码套件呢?

接下来就是分析出来APP使用的okhttp3网络请求框架,然后该网络请求框架也支持自定义协议以及加密套件。

因此,编写frida hook脚本,读取APP在初始化网络请求等操作的时候是否存在自定义的协议以及加载了什么加密套件。

Java.perform(function() {
    try {
        var OkHttpClient = Java.use("okhttp3.OkHttpClient");
        var Builder = Java.use("okhttp3.OkHttpClient$Builder");


        console.log("[+] OkHttpClient loaded: " + !!OkHttpClient);
        console.log("[+] Builder loaded: " + !!Builder);

        Builder.build.implementation = function() {
            var client = this.build.call(this);
            
            // 获取和打印协议和加密套件信息
            var connectionSpecs = client.connectionSpecs();
            if (connectionSpecs) {
                for (var i = 0; i < connectionSpecs.size(); i++) {
                    var spec = connectionSpecs.get(i);
                    console.log("\n[+] ConnectionSpec<加密套件和协议版本信息>: \n" + spec);
                }
            }

            // 如果应用使用了客户端证书,你可以从这里获取它们
            var certificatePinner = client.certificatePinner();
            if (certificatePinner) {
                console.log("Certificate Pinner: " + certificatePinner);
            }

            return client;
        };

    } catch (e) {
        console.error("[-] Error: " + e.message);
    }
});

可以看到加密套件使用的是:[TLS_ECC_WITH_SM4_128_CBC_SM3]

tls协议是TLS_1_1

国密SSL就是以TLS1.1标准为蓝本制定的:https://blog.csdn.net/mogoweb/article/details/105190337

到这里我们大概就知道,Burp抓包服务器没响应大概就是因为https加密套件使用的是国密的加密算法,对于常见的测试工具或浏览器啥的默认都是不支持国密的。

那怎么进行抓包测试呢?目前发现有2个工具可以帮助抓取国密TLS协议传输的https数据包

1.GMProxy

使用教程:

GMProxy 国密测试工具

2.Yakit

yaklang.io

成功抓包

趋势

国密算法即国家密码局认定的国产密码算法(商用密码)。近年来,国家站在长远战略的高度大力推动国产密码算法在金融、电子政务等关键领域的应用。明确要求在金融银行、电子政务、教育、交通运输、民生保障等关键领域全面推进自主可控密码技术的应用。

越来越多的政府、企事业单位的WEB系统都已开始部署使用国密SSL。国产密码算法以及相对应的产品应用将成为未来各级政府机关网站和各类企业网站的安全标配。但目前主流的WEB安全测试软件如Burp Suite、 SqlMap等都不支持直接对国密SSL 网站的安全检查。这无疑给一些国密SSL系统的安全检查带来不便。

以后可能会遇到越来越多使用国密TLS协议进行加密传输的应用。

所以大家有遇到类似使用BurpSuite抓不到包的情况下,可以考虑是不是传输协议使用了国密TLS。