起因
近日分析一个双向认证的样本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证书 因为前段时间脑子一直浑浑噩噩的就没想起来,做完了才想起来,也是蛋疼!!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课