(APP测试三板斧)第三板: Frida+IDA手工逆向证书密码
一、优点
优点:
适用大部分情况,尤其是一键自动提取证书和密码,傻瓜化操作。
缺点:
一键自动提取证书和密码还好,但不是万能的,手工逆向证书密码技术难度较大,需要有代码功底,并且如果有加壳加固等操作更加麻烦。
二、步骤
1.一键自动提取证书和密码
因为 APP 在向服务端发请求时, APP 肯定会操作证书,所以如果能找到 APP 操作证书的代码地方, Hook 这部分代码,对参数做些输出打印,证书和证书密码就都有了。
大部分情况下,都是Hook java.security.KeyStore 这个类的 load 方法,load 方法的形参就是我们需要的证书和密码。
抠出的证书和密码,配置进 fiddler 或 burpsuite里面,就可以抓到双向认证的包。
PS: 还要注意证书的格式,抠出的证书可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先转换一下格式。
python3 cert_pwd.py
需要python脚本辅助下,把上面的证书16进制先转换为jks格式
python3 cert2file.py
import sys
f = open('keystore.jks', 'wb')
f.write(bytes.fromhex("xxx"))
再讲jks证书转为p12证书,p12证书再转换为crt证书
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -srcstoretype jks -deststoretype pkcs12
openssl pkcs12 -in keystore.p12 -nokeys -clcerts -out keystore.crt
2.手工分析证书密码
使用GDA打开apk,搜索证书关键字.p12
这个就是加载证书的代码,第二个参数就是密码,所以往上跟踪v1
v4_1.load(v0_1, v1.toCharArray());
发现值是通过a函数来的,跟踪进入a函数
String v1 = SoulNetworkSDK.Auto_getValue().a(SoulNetworkSDK.Auto_getValue().Auto_getValue());
继续跟踪进入null_getStorePassword
发现最终密码是从native层获取的
我们来看下初始化加载的是哪个so文件
发现是soul-netsdk,解压soul.apk,使用IDA打开soul-netsdk
搜索加载的关键字,最终发现证书密码(搜索到结果后,使用F5伪编译代码)
3.踩过的坑
1.这个博客贴的js代码java_security_KeyStore__load函数结尾少了个圆括号,所以语法错误
https://api-caller.com/2019/03/30/frida-note/#soul
2.python调用Frida的函数
如果device = frida.get_usb_device()不行,试试device = frida.get_remote_device()
本文地址:https://blog.csdn.net/ggzhifeng/article/details/107606890