这里分享一下使用frida和objection来绕过某单车APP(v8.4.0)iOS端证书固定,感谢小贺同学提供的样本@Ccccccandyhe,起因是要抓取这个APP里附近车辆信息的流量,但是上来抓取发送验证码的地方就遇到了问题,用Charles显示也是红叉,猜测是用了SSL pinning
我的手机是iPhone5s,11.1.2,越狱教程参考Basic iOS Apps Security Testing lab — 1,因为是iOS11系统,所以Cydia中有些插件和工具已经不再适用,建议多Google(生活总是一个error接着另一个error…)
这里不使用ssl-kill-switch2这个插件(插件可以试验成功),我们使用frida和objection(基于frida的exploration toolkit),首先在Cydia中和配置Switch插件一样去添加frida的源(这里不再详述请参见frida的官方文档),然后使用内置的ios sslpinning disable命令就可以成功绕过证书绑定。源码实现在/objection/hooks/ios/pinning/disable.js,通过查看发现它其实是通过hook AFNetworking,NSURLSession等常用库和一些底层的methods实现的。这点和switch插件是类似的。
其实这里可以看到这个APP是使用了AFNetworking library这个库来使用sslpinning,所以知道使用了AFNetworking框架,我们就可以自己写一个简单的frida js手动测试一下,通过hook AFSecurityPolicy evaluateServerTrust函数的返回值实现绕过,参考Cracking SSL pinning in AFNetworking
function main() {
var resolver = new ApiResolver('objc');//创建已加载Object-C类方法的API查找器
var matches = resolver.enumerateMatchesSync("-[AFSecurityPolicy evaluateServerTrust:forDomain:]");//查找evaluateServerTrust:forDomain函数,返回数组类型
if (matches.lenght == 0) {
console.log("\n[E] -[AFSecurityPolicy evaluateServerTrust:forDomain:] is not found!\n");
return;
}
Interceptor.attach(ptr(matches[0]["address"]),{
onLeave: function(retval) {
console.log("[I] -[AFSecurityPolicy evaluateServerTrust:forDomain:] hits!");
retval.replace(1);//将返回值修改为1
}
}
);
console.log("[I] -[AFSecurityPolicy evaluateServerTrust:forDomain:] is hooked!\n")
}
main();
将这个js保存为disable_ssl_pinning_in_loops.js,然后执行命令:frida -U -f com.mobike.bike -l disable_ssl_pinning_in_loops.js --no-pause,因为我这frida不支持中文无法用-n attach进程名(替代方法是-p PID),所以使用-f spawn单车的bundleid com.mobike.bike
成功绕过
同理某车载APP(v8.4.2)登录使用了ssl pinning
分别使用objection和frida脚本测试
成功绕过
未完待续…
参考
kov4l3nko.github.io
Prevent bypassing of SSL certificate pinning in iOS applications