天天看点

在iOS应用程序中使用Frida绕过越狱检测

         阿里聚安全在之前的三篇博客中介绍了利用frida攻击android应用程序,整个过程仿佛让开发者开启上帝视角,在本篇博客中,我们将会介绍在ios应用程序中使用frida绕过越狱检测。即使你从来没有使用过frida,这篇文章也将会作为进入移动安全开发和分析的入门指南。

相关文章内容:

<a href="http://jaq.alibaba.com/community/art/show?spm=a313e.7916648.0.0.0nfk5w&amp;articleid=816" target="_blank">利用frida攻击android应用程序(一)</a>

<a href="http://jaq.alibaba.com/community/art/show?spm=a313e.7916648.0.0.0nfk5w&amp;articleid=817" target="_blank">利用frida攻击android应用程序(二)</a>

<a href="https://jaq.alibaba.com/community/art/show?articleid=863" target="_blank">利用frida攻击android应用程序(三)</a>

在iOS应用程序中使用Frida绕过越狱检测

frida是一个可以hook app的动态代码工具包,可以向windows、macos、linux、ios、android和qnx的本机应用程序中注入javascript或自己的库代码。最开始的时候,它是基于谷歌的v8 javascript运行,但是从版本9开始,frida已经开始使用其内部的duktape运行。

在iOS应用程序中使用Frida绕过越狱检测

列举一些frida的使用场景:

1、hooking特定函数并更改返回值

2、分析定制协议,同时其动态嗅探/解密

3、应用调试

4、在ios应用上dump 类和方法信息

firda众多不同的使用场景,花样繁多的启动方式,包括各种强大的api和方法,让它成为开发者建立自己安全分析的首选工具。它可以使用命令行界面或类似frida-trace的工具来跟踪底层函数。同时还可以使用c、nodejs或python绑定完成更复杂的任务。但是在其内部,frida使用javascript的时候较多,可以通过javascript完成大部分的工作。

frida之所以如此的能对安全检测如此有用,就是因为它能够在非越狱的设备上运行。 frida提供了一个叫做“fridagadget.dylib”的动态库,可以用来在未越狱设备上为应用程序插入fridagadget.dylib。开发者可以使用swizzler2等工具来修改应用程序以在应用程序中添加fridagadget.dylib。

ios系统下,已有几种基于frida的安全分析工具,例如needle和appmon。

needle是一个开源的模块化框架,主要简化ios应用程序安全评估过程,并作为一个中心点。鉴于其模块化方法,needle很容易扩展新模块,可以以python脚本的形式加入。

appmon是监测和修改本地macos、ios、android系统api的自动化框架,并能通过web接口显示和操作

设置步骤十分简单,开发者同时在ios设备和电脑上设置安装frida。

在ios设备安装步骤如下:

1、在ios设备中打开cydia app

2、添加url地址:https://build.frida.re

在iOS应用程序中使用Frida绕过越狱检测

3、打开source或搜索frida,点击modify,然后安装。

在iOS应用程序中使用Frida绕过越狱检测

4、打开终端并输入pip install frida来安装frida绑定, 当然你还可以使用python、c或nodejs绑定来完成更复杂的任务

完成frida所有设置后,开始对ios应用安全评估和利用之旅。

damn vulnerable ios application(dvia)作为本次的测试方法,地址:http://damnvulnerableiosapp.com/

下文涉及的代码,github地址:https://github.com/interference-security/frida-scripts/tree/master/ios

我们将从dvia中分析越狱检测操作,当前设备已显示越狱。

在iOS应用程序中使用Frida绕过越狱检测

首先查看目标设备的所有运行进程列表

frida-ps –u

在iOS应用程序中使用Frida绕过越狱检测

从上面的截图可以看到所有在ios设备上运行的进程。

输入frida –u process-name即可附加到任一进程,在frida控制台获取目标进程的属性,内存和函数。

在iOS应用程序中使用Frida绕过越狱检测

现在我们可以在frida的shell中工作,它可以与我们的ios进程进行交互,也可以编写javascript来获取我们想要的分析数据

这个步骤是用于识别哪个viewcontroller和function负责验证ios设备是否越狱

viewcontroller是ios应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,viewcontroller管理应用中的众多视图。 ios的sdk中提供很多原生viewcontroller,以支持标准的用户界面,例如表视图控制器(uitableviewcontroller)、导航控制器(uinavigationcontroller)、标签栏控制器(uitabbarcontroller)和ipad专有的uisplitviewcontroller等。

先写一个基础的frida脚本来dump目标应用程序中所有的class文件和method信息。开始寻找任何和越狱相关的内容,以便我们在frida的帮助下绕过越狱检测。

进程示意图如下:

在iOS应用程序中使用Frida绕过越狱检测

1、在dvia中使用frida寻找越狱检测的类

先来看看应用程序中所有的class文件

for (var classname in objc.classes)

    {

        if (objc.classes.hasownproperty(classname))

        {

            console.log(classname);

        }

}

运行脚本,我们就会看到frida附加到目标进程,一旦加载完成,它将在目标进程中显示出许多class文件。

在iOS应用程序中使用Frida绕过越狱检测

使用grep命令来找到相关的class文件是比较好的办法。当我们运行grep jailbreak的命令时,我们就会看到一个名为jailbreakdetectionvc的类,如下图所示

在iOS应用程序中使用Frida绕过越狱检测

在找到所有实例之后,会看到一个safe to ignore的错误声明。因此首要任务就是寻找目标类,找出此类中任何相关的方法,这是一个有趣的过程。

2、在dvia中使用frida寻找越狱检测的方法

使用objc.classes.class-name.$methods,此例中只需在我们的目标类-jailbreakdetectionvc,找到该方法。

console.log("[*] started: find all methods of a specific class");

if (objc.available)

{

    try

        var classname = "jailbreakdetectionvc";

        var methods = eval('objc.classes.' + classname + '.$methods');

        for (var i = 0; i &lt; methods.length; i++)

        {

            try

            {

                console.log("[-] "+methods[i]);

            }

            catch(err)

                console.log("[!] exception1: " + err.message);

    }

    catch(err)

        console.log("[!] exception2: " + err.message);

else

    console.log("objective-c runtime is not available!");

console.log("[*] completed: find all methods of a specific class");

继续运行,运行grep检索例如jailbreak、jailbroken、detection的字符串,如下图所示

在iOS应用程序中使用Frida绕过越狱检测

我们找到isjailbroken、jailbreaktest1tapped:、jailbreaktest2tapped:的3种字符串,符合上检索目标。其中,isjailbroken看起来最像检测设备是否越狱并返回值的函数。

3、在dvia中使用frida修改越狱检测方法的返回值

查看isjailbroken发送的返回值

        var funcname = "- isjailbroken";

        var hook = eval('objc.classes.' + classname + '["' + funcname + '"]');

        interceptor.attach(hook.implementation, {

          onleave: function(retval) {

            console.log("[*] class name: " + classname);

            console.log("[*] method name: " + funcname);

            console.log("\t[-] type of return value: " + typeof retval);

            console.log("\t[-] return value: " + retval);

          }

        });

运行脚本,在ios应用中按下jailbreak test 1按钮,我们可以在frida控制台看到返回值

在iOS应用程序中使用Frida绕过越狱检测

因为设备已经越狱,显示的返回值为0*1,意味着返回函数true。

接下来我们的任务是覆盖返回值并修复方法,以便每当按下jailbreak test 1按钮的时候,返回值为false或0*0。

我们添加另一行来改变这个特定函数的返回值。通过下面的代码来实现,并将其记录到控制台。

newretval = ptr("0x0")

retval.replace(newretval)

console.log("\t[-] new return value: " + newretval)

最终脚本如下:

            console.log("\t[-] original return value: " + retval);

            newretval = ptr("0x0")

            retval.replace(newretval)

            console.log("\t[-] new return value: " + newretval)

一旦运行脚本,我们看到返回值已经修改

在iOS应用程序中使用Frida绕过越狱检测

查看ios的app,可以看到设备显示未越狱

在iOS应用程序中使用Frida绕过越狱检测

---------------------------------------------------------

本文由douglas编译自attify,原文地址:http://blog.attify.com/2017/05/06/bypass-jailbreak-detection-frida-ios-applications/