起因
近日分析一个双向认证的样本APP,因为这次APP有点奇妙,使用了内存解密p12证书,所以记录一下.
开工
如果抓包提示这个东东,就是APP用了双向认证哦!

上工具

这里看到把attachBaseContext 跟 onCreate native化,典型壳操作.看到包名知道是某安全的壳,用上脱壳工具脱一下,这里不讲解脱壳了.
定位
对于这种双向认证的APP 定位一般就是 KeyStore.getInstance X509TrustManager PKCS12. 那么就拿我们脱完壳的dex搜索一下.

根据我们三个关键词搜索的结果来看 这个类com.hundsun.net.a.e 有很大的嫌疑! 因为所有关键词的搜索结果都指向了这个类!!!
然后进到类中查看,果然发现了关键函数

分析
这里出现了一个client.p12的证书文件,根据代码指引,这个文件就存在于APK assets目录下那我们拿下来看下

这东西典型不符合p12证书的格式,明显是个base64的压缩流,那我们再看下代码. 果然在得到证书文件后它把得到的证书流进行了DES解密操作
其实这时候我们只需要HOOK KeyStore的 load函数 就能拿到证书的流跟密码.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | function hook_KeyStore_load() {
Java.perform(function () {
var StringClass = Java.use("java.lang.String");
var KeyStore = Java.use("java.security.KeyStore");
KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) {
console.log("KeyStore.load1:", arg0);
this.load(arg0);
};
KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) {
console.log("KeyStore.load2:", arg0, arg1 ? StringClass.$new(arg1) : null);
if (arg0!= null){
var byteArray = Java.array('byte', new Array(10240).fill(0));
arg0.read(byteArray)
console.log(buf2hex(byteArray,10240));
}
this.load(arg0, arg1);
};
console.log("hook_KeyStore_load...");
});
}
setImmediate(hook_KeyStore_load);
|

Bingo 我们拿到了想要的密码 但是打印出来的证书总是不全,我们还是直接帮他解密吧!
因为都是Java层操作 我们用Objection直接拿他密匙就ok啦!!!

这里一共出现了两个密匙,经过分析得到第一个秘钥是P12证书的秘钥 第二个就是我们要的DES解密的秘钥啦!

其实他的base64后的p12文件还会进入到Native层解密下才能变成可被DES解密的流,但是你毕竟最终还是得回来不是,我们就在你回来的地方打印下就好了,这就是如今APP防护的可笑之处.

拿到秘钥然后写个代码解密下流文件然后保存成P12文件导入到Charles里试试!!

输入我们HOOK到的秘钥,嘻嘻嘻,见证奇迹的时候就要到了!!!

CODE=200 成功搞定!
总结
这次app的防护不高,所以正好分析下双向认证的东西,其实可以直接用肉丝的 r0capture dump证书 因为前段时间脑子一直浑浑噩噩的就没想起来,做完了才想起来,也是蛋疼!!!
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!