A-A+

【Android】解密SSL双向验证

2020年06月01日 19:01 汪洋大海 暂无评论 阅读 92 views 次

概述:试图分析某App协议,无法抓包,服务器会校验客户端的证书是否正确,不正确则会与我们断开连接

思路:既然是双向验证,也就是说我们要从两个方面来解决,本地证书校验我们使用Xposed模块的JustTrustMe解决,提交给服务器的证书我们需要从包里面将证书找出来,然后挂在Charles上即可


1.首先安装Xpose,并且安装JustTrustMe,若不会,请百度,完成后如图1-1

【Android】解密SSL双向验证
1-1

2.将目标App放在JEB中解析,需要注意,如果有壳,则需要先想办法脱壳

3.在分析结果中搜索 .PFX 或者 .P12.这两个格式是证书的二进制格式,其中包含了证书和私钥,见图3-1

【Android】解密SSL双向验证
3-1

4.将搜索出来的文件右键-导出到,导出到本地,然后双击已导出的文件,看看是否需要密码.见图4-1

【Android】解密SSL双向验证
4-1

5.在JEB字节码中搜索这个资源,找到调用的地方,见图5-1

【Android】解密SSL双向验证
5-1

6.右键搜索出来的地方然后选择解析,然后往下看,静态分析,V1就是关键点,伪码如下:

package cn.soulapp.android.net;

...

public class j extends SSLSocketFactory {
    private SSLSocketFactory a;
    private X509TrustManager[] b;
    private static boolean c = false;
    private static final String d = "bks";
    private static final String e = "PKCS12";
    private static final String f = "client.p12";
    private static final String g = "client.key";
    public static final String h = "client.cer";
    private static final String[] i;

    static {
        ...
    }

    public j() {
    ...
        String v1 = SoulNetworkSDK.p().a(SoulNetworkSDK.p().a());
            ...
            ...

            try {
                v4_1.load(v0_3, v1.toCharArray());
                goto label_26;
            }
             ...
            ...
        }
    }

    ...
    ...
    ...
}

7.写Frida,Hook cn.soulapp.android.net.j的构造函数,代码如下:

Python部分:

import time
import frida
import sys


def my_message_handler(message, payload):  # 定义错误处理
    print (message)
    print (payload)
    


device = frida.get_remote_device()

pid = device.spawn(['cn.soulapp.android'])
device.resume(pid)
time.sleep(1)
session = device.attach(pid)

with open("g:/Frida/Soul/3.26/s1.js", 'r', encoding='UTF-8') as f:
    script = session.create_script(f.read())
script.on("message", my_message_handler)
script.load()

sys.stdin.read()

Js部分:

console.log("Script loaded successfully ");
Java.perform(function x() {
    console.log("Inside java perform function");
    //定位类
    var my_class = Java.use("cn.soulapp.android.net.j");
    console.log("Java.Use.Successfully!");//定位类成功!
    //在这里更改类的方法的实现(implementation)
    my_class.$init.overload().implementation = function j() {
        //打印替换前的参数
        console.log("Ok");
        var aa = Java.use("cn.soulapp.android.net.SoulNetworkSDK");
        console.log(aa.p().a(aa.p().a()))
        return this.$init();
    }
});

8.启动Frida,拿到密匙,见图8-1,特别注意:只有该App第一次运行的时候才调用该方法.

【Android】解密SSL双向验证
8-1

9.在Charles中加载该证书:见图9-1,9-2

【Android】解密SSL双向验证
9-1
【Android】解密SSL双向验证
9-2

10.成功解码,可以看到发送成功.

【Android】解密SSL双向验证

至此,已拿到目标数据,收工,可能其他的App不一样,但是思路都是一样的.多动手试试就行了。

文章来源:https://zhuanlan.zhihu.com/p/115288202

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言