使用Frida绕过iOS sslpinning

这里分享一下使用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