A-A+
【Android】解密SSL双向验证
概述:试图分析某App协议,无法抓包,服务器会校验客户端的证书是否正确,不正确则会与我们断开连接
思路:既然是双向验证,也就是说我们要从两个方面来解决,本地证书校验我们使用Xposed模块的JustTrustMe解决,提交给服务器的证书我们需要从包里面将证书找出来,然后挂在Charles上即可
1.首先安装Xpose,并且安装JustTrustMe,若不会,请百度,完成后如图1-1

2.将目标App放在JEB中解析,需要注意,如果有壳,则需要先想办法脱壳
3.在分析结果中搜索 .PFX 或者 .P12.这两个格式是证书的二进制格式,其中包含了证书和私钥,见图3-1

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

5.在JEB字节码中搜索这个资源,找到调用的地方,见图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第一次运行的时候才调用该方法.

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


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

至此,已拿到目标数据,收工,可能其他的App不一样,但是思路都是一样的.多动手试试就行了。
文章来源:https://zhuanlan.zhihu.com/p/115288202
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏