iOS渗透测试工具,第3篇:Frida与Objection
原文地址(请去掉链接中的空格):https://www.allysonomalley.com/2018/12/20/ios-pentesting-tools-part-3-frida-and-ob jection/
本文是该文章系列中第3篇,在这里,我们将一如既往地为读者介绍最有用的iOS应用程序渗透测试工具。具体来说,我们将为读者介绍另外两种工具:“FRIDA”与"ob jection"。其中,前者是一种动态检测工具,主要用于运行时操纵和动态分析;而后者则是建立在前者之上的一款工具,能够让安全分析工作变得更加轻松快捷。
对于这个系列文章来说,我们假设用户使用Electra进行越狱。就我而言,使用的系统是iOS11.1.2,但是本系列中的大多数工具都可以在任何版本的iOS11上使用。
安装Frida和ob jection
首先,我们要在自己的设备上安装Frida。为此,请转到“Cydia”,然后,转到“Manage”>“Sources”>“Add”>“New”选项,并输入以下内容:
然后,安装该程序包。
实际上,只要计算机上安装了ob jection软件,Frida就被捎带着安装好了。
ob jection的源代码可以从这里下载:
https://github.com/sensepost/ob jection
幸运的是,这个软件的安装非常简单——安装好python3和pip3后,只需打开一个新的终端窗口,并键入下列命令即可:
pip3 install ob jection
这样,就安装好了。
运行ob jection
现在,我们让ob jection附加到目标应用程序上。首先,将手机通过USB连接到计算机,然后,在计算机的终端窗口中,键入下列命令:
ob jection --gadget AppName explore
这时,会看到以下输出:
注意:有时您可能会看到一个错误信息,指出ob jection无法连接到Frida服务器,如果遇到这种情况,只需要使用ssh连接该设备,并运行以下命令即可:frida-server &
探索Exploring的功能
现在,我们来介绍ob jection提供的一些最有用的命令。
通常,我们希望通过监视用户在进行某些操作时应用程序所调用的方法调用来开展动态分析。当然,前提是已经使用第1篇中介绍的方法,通过运行时文件分析找到了感兴趣的函数/类的相关列表。在这里,假设我们对一个名为“ProfileHomeViewController”类非常感兴趣。 这时,可以通过下列命令,让ob jection监视这个类调用的所有方法:
ios hooking watch classProfileHomeViewController
现在,当您与应用程序的登录屏幕进行交互时,将看到如下输出内容:
您还可以更深入地了解特定的方法,这里,我们以-[ProfileHomeViewControllerloginOrRegisterButtonTap]方法为例:
ios hooking watch method"-[ProfileHomeViewController loginOrRegisterButtonTap]"
这样一来,在每次调用该方法时,都能看到相应的输出。此外,还可以使用一些非常有用的标志,例如--dump-args或--dump-return,前者用来查看传递给该方法的参数,后者用来查看该方法的返回值。
此外,对于返回简单布尔值的函数,我们也可以轻松地改写其返回值(ob jection的这个功能只适用于布尔值,对于更复杂的返回类型,必须使用Frida,具体稍后介绍)。
ios hooking set return_value"-[ProfileHomeViewController isPasswordValid:]" true
其他常用的内部命令:
ios sslpinning disable
该命令可以用于禁用SSL pinning功能——当然,是否奏效,还要视应用程序的具体实现而定。
ios keychain dump
这样,就能转储keychain的内容。有时,我们能够从中发现应用程序存储的敏感信息。
ios jailbreak disable
这样,可以绕过越狱检测。
当然,ob jection的功能是非常丰富的,但是本文篇幅有限,只能介绍其中最常用的几个,如果读者想了解该软件支持的所有可用命令及其用法,可以参阅下面的文献:
https://github.com/sensepost/ob jection/tree/master/ob jection/console/helpfiles
应用Frida
虽然Frida的用法有点复杂,但是,其优点是,具有更大的可控性。我们可以编写自定义的ja vasc ript或Python脚本,来实现ob jection所提供的功能,甚至它没有实现的功能。
例如,下面是一个简单的.js脚本,可以用于截获并替换函数的返回值:
if (ObjC.available)
{
try
{
var className = "ProfileHomeViewController";
var function = "- username";
var hook = eval('ObjC.classes.' + className + '["' + function +'"]');
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
},
onLeave: function(retval) {
var newRetval="fakeUserName";
retval.replace(ObjC.classes.NSString.stringWithString_(newRetval))
}
});
}
catch(err)
{
console.log("[!] Exception: " + err.message);
}
}
else
{
console.log("ob jective-C Runtime is not available!");
}
借助于Frida,我们可以完成更加复杂的操作(替换字符串返回值),而这些操作,却是ob jection无法做到的。
我们可以在计算机上执行下列命令,将这个脚本附加到相应的进程上面:
frida -U -l fileName.js AppName
当然,Frida还有很多功能有待介绍,但是,本文篇幅有限,对于想要进一步学习该软件用法的读者,建议阅读其官方文档:
https://www.frida.re/docs/ios/
本文到此结束,感谢您的阅读!
最新评论