freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

移动应用安全基础篇——绕过iOS越狱检测
2019-04-16 13:01:29

今天主要是针对三款有不同越狱检测的iOS应用,方式分为手动绕过越狱检测和自动绕过越狱检测。

测试工具

  1. Frida
  2. Needle
  3. IDA Pro7.0
  4. Hopper Disassembler V4
  5. Cydia(添加Darwin CC Tools依赖)......

    案例1

    image.png首先对该APP进行一键dump(砸壳)
    frida-ios-dump,该工具基于frida提供的强大功能通过注入js实现内存dump
    然后通过python自动拷贝到电脑生成ipa文件,通过配置完成之后真的就是一条命令砸壳。
    
    image.png砸壳完成后,我们将可执行文件导入IDAimage.png由于MAC IDA7.0在Strings窗口无法显示中文字符串,直接在__cfstring段搜索越狱关键词,找到调用函数 
    -[AppDelegate application:didFinishLaunchingWithOptions:]
    
    image.pngimage.png查看stat函数,发现该函数通过文件名filename获取文件信息,并保存在buf所指的结构体stat中,执行成功则返回0,失败返回-1。接下来我们使用Needle这款工具内的dynamic/detection/script_jailbreak-detection-bypass模块来尝试绕过越狱检测:image.png发现并不能绕过越狱检测,找到script_jailbreak-detection-bypass.py该文件,发现虽然有HOOK到stat这个函数,但是返回值作者写的有问题,借鉴了其他工具的写法,我们修改needle,script_jailbreak-detection-bypass的代码如下:image.png成功绕过:image.png最后把Needle的script_jailbreak-detection-bypass代码拿出来做参考,自己动手写一个js
    var paths=[
            "/Applications/blackra1n.app",
            "/Applications/Cydia.app",
            "/Applications/FakeCarrier.app",
            "/Applications/Icy.app",
            "/Applications/IntelliScreen.app",
            "/Applications/MxTube.app",
            "/Applications/RockApp.app",
            "/Applications/SBSetttings.app",
            "/Applications/WinterBoard.app",
            "/bin/bash",
            "/bin/sh",
            "/bin/su",
            "/etc/apt",
            "/etc/ssh/sshd_config",
            "/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
            "/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
            "/Library/MobileSubstrate/MobileSubstrate.dylib",
            "/pguntether",
            "/private/var/lib/cydia",
            "/private/var/mobile/Library/SBSettings/Themes",
            "/private/var/stash",
            "/private/var/tmp/cydia.log",
            "/System/Library/LaunchDaemons/com.ikey.bbot.plist",
            "/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
            "/usr/bin/cycript",
            "/usr/bin/ssh",
            "/usr/bin/sshd",
            "/usr/libexec/sftp-server",
            "/usr/libexec/ssh-keysign",
            "/usr/sbin/frida-server",
            "/usr/sbin/sshd",
            "/var/cache/apt",
            "/var/lib/cydia",
            "/var/log/syslog",
            "/var/mobile/Media/.evasi0n7_installed",
            "/var/tmp/cydia.log"];
    var f = Module.findExportByName("libSystem.B.dylib","stat64");
    Interceptor.attach(f, {
        onEnter: function ( args) {
            this.is_common_path = false;
            var arg = Memory.readUtf8String(args[0]);
            for (var path in paths) {
                if (arg.indexOf(paths[path]) > -1) {
                    console.log("Hooking native function stat64: " + arg);
                    this.is_common_path = true;
                    //return -1;
                }
            }
        },
        onLeave: function (retval) {
                   if (this.is_common_path){
                       console.log("stat64 Bypass!!!");
                       retval.replace(-1);
                   }      
                }
    });
    var f = Module.findExportByName("libSystem.B.dylib","stat");
    Interceptor.attach(f, {
        onEnter: function ( args) {
            this.is_common_path = false;
            var arg = Memory.readUtf8String(args[0]);
            for (var path in paths) {
                if (arg.indexOf(paths[path]) > -1) {
                    console.log("Hooking native function stat: " + arg);
                    this.is_common_path = true;
                    //return -1;
                }
            }
        },
        onLeave: function (retval) {
                   if (this.is_common_path){
                       console.log("stat Bypass!!!");
                       retval.replace(-1);
                   }          
                }
    });
    
    使用Frida spawn并注入image.png

    案例2

     image.png首先使用该模块测试能否绕过越狱检测[needle] > use dynamic/detection/script_jailbreak-detection-bypassimage.png发现send无法输出,改用console.log打印,砸壳后放入IDA,查看该类:-[UIDevice isJailbroken]image.png使用Hopper查看该类:-[UIDevice isJailbroken]image.png发现该APP,直接通过方法的返回值判断是否越狱,所以可以直接修改返回值进行绕过。使用Frida spawn并注入,成功绕过:image.pngimage.png

    案例3

    image.png砸壳后放入IDA,在__cfstring段搜索“越狱”并查看该类:image.png找到并打开-[AppDelegate showJailBreakDialog]image.pngimage.pngimage.png发现判断返回的bool值,尝试Hook-[BMKSecurityManager jailBreak]spawn并注入image.png经测试,该APP采用了5个方法检测越狱,具体是在framework实现了此方法,因为IDA突然崩了在此就不演示了,感兴趣的自己研究一下吧。

    补充说明

    Needle框架的两个设置选项,官方没有提供修改的方式,只能本地重新编译仓库源码。
    一、设置选择进程的时候隐藏iOS自己的APP,
    二、默认设置APP启动方式是spawn(否则每次都要重新设置),
    grep命令:
    grep -rn "HIDE_SYSTEM_APPS" needle
    grep -rn "spawn" needle
    
    image.pngimage.png

    自动绕过越狱检测的工具

    1. xCon

    image.png

    介绍:

    xCon可以从Cydia中安装,是目前为止最强大的越狱检测工具。由n00neimp0rtant与Lunatik共同开发,它据说patch了目前所知的所有越狱检测方法(也有不能patch的应用)。估计是由于影响太大,目前已不开放源码了。

    安装方法:

    1.首先在Cydia中添加源http://xcon.crazy.net  2.然后进入添加的源中选择xCon下载安装,安装完之后需要重启SpringBoard。

    适用范围:

    xCon会绕过以下越狱检测方法(1)根据是否存在特定的越狱文件,及特定文件的权限是否发生变化来判断设备是否越狱(2)根据沙箱完整性检测设备是否越狱(3)根据文件系统的分区是否发生变化来检测设备是否越狱(4)根据是否安装ssh来判断设备是否越狱

    2. Liberty Lite(Beta)

    image.png

    介绍:

    Liberty Lite(Beta)是适用于iOS 11固件的通用越狱检测工具。它由着名的补丁开发者Ryley Angus开发。可以让用户有选择性的对iOS应用进行绕过越狱检测。

    安装方法:

    1.首先在Cydia中添加源https://ryleyangus.com/repo/2.然后进入添加的源中选择Liberty Lite(Beta)下载安装,安装完之后需要重启SpringBoard。

    使用方法:

    打开iphone设备,在通用-设置内找到Liberty-lite,然后启动,选择Block Jailbreak Detection,通过User Applications选择需要绕过越狱检测的iOS应用。image.png

    适用范围:

    上述三个APP案例都可以用这个插件进行绕过,简单粗暴相当的牛皮。



Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

ewm.png



# ios安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者