【问题标题】:On iOS11.4.1 jailbroken(unc0ver) device, how to run application as root?在iOS11.4.1越狱(unc0ver)设备上,如何以root身份运行应用程序?
【发布时间】:2019-12-18 17:10:20
【问题描述】:

我终于越狱了我的第一台设备,我想尝试以 root 身份运行一个内置于 Xcode 的应用。

我首先尝试在我的main.c 上运行setuid(0),但它失败了。

还尝试运行以下解决方案: [Gaining root permissions on iOS for NSFileManager (Jailbreak)

问题是,我只能在通过 Xcode 安装应用程序后手动执行此操作。 此外,我甚至无法以这种方式成功运行该应用程序,因为它在启动时会崩溃。

有人知道如何从这里取得进展吗?

iOS 版本:11.4.1

Unc0ver 版本:3.3.0

提前谢谢你!

【问题讨论】:

    标签: ios jailbreak


    【解决方案1】:

    Unc0ver 越狱会导出必要的偏移量,以获得tfp0 (task_for_pid(0)) 或内核任务端口。使用这些,您可以在内核内存中修补您自己的凭据。举个例子吧。

    Unc0ver Jailbreak 将包括kernel task port 在内的偏移量存储在此路径的文件中:/var/offsets.plist。确保在越狱前切换 Unc0ver 设置中的“导出 TFP0”。

    一旦越狱,解析偏移文件,每个文件都有自己的变量。 对于tfp0 变量,您需要将其设为task_port_t 类型。 kernel_slide 和 kernel_base 是默认的 uint64_t。

    从plist 解析它们后,您需要执行以下操作以从HSP4 (Host Special Port #4) 获取有效的tfp0,其中Unc0ver 为您设置,以便您可以获取tfp0 并提升您自己的权限.

    这里有一些示例代码:

    task_port_t tfp0 = null;
    kern_return_t ret = host_get_special_port(mach_host_self(), HOST_LOCAL_NODE, 4, &tfp0);
        printf("Task FOR PID: 0x%x\n", tfp0);
    

    这基本上将为您提供真正的内核任务端口。 此时,您可以按照 GeoSn0w 的指南了解如何将自己的权限提升到root,以及如何转义sandbox。指南和补丁可以在他的Jailbreak Development forum 上找到,但我会在这里添加它们以防万一。

    获取root权限,根据GeoSn0w:

    uint64_t selfProc = findOurselves();
        uint64_t creds = kernel_read64(selfProc + off_p_ucred);
    
        // GID
        kernel_write32(selfProc + off_p_gid, 0);
        kernel_write32(selfProc + off_p_rgid, 0);
        kernel_write32(creds + off_ucred_cr_rgid, 0);
        kernel_write32(creds + off_ucred_cr_svgid, 0);
        printf("[i] STILL HERE!!!!\n");
    
        // UID
        creds = kernel_read64(selfProc + off_p_ucred);
        kernel_write32(selfProc + off_p_uid, 0);
        kernel_write32(selfProc + off_p_ruid, 0);
        kernel_write32(creds + off_ucred_cr_uid, 0);
        kernel_write32(creds + off_ucred_cr_ruid, 0);
        kernel_write32(creds + off_ucred_cr_svuid, 0);
        printf("[i] Set UID = 0\n");
    

    kernel_write32、kernel_write64、kernel_read32 和 kernel_read64 通常是在 Google Project Zero 漏洞利用中发现的原语。您需要将它们导入到您的程序中,以便您可以调用它们。 They can be found on GitHub,但它们只是对mach_vm_read_overwrite(...)和mach_vm_write(...)等系统函数的封装。

    就是这样。那时,您应该已将您的权限升级为 root。当然,你需要重新实现很多越狱功能,比如前面提到的内核读写原语,你需要Unc0ver的偏移量,你还需要一个偏移量表,比如off_ucred_cr_ruid,off_p_gid等从 iOS 版本更改为 iOS 版本。

    只需进行调整并由Cydia 安装它会更容易。 Cydia Substrate 会为您提供rootify。

    【讨论】:

      【解决方案2】:

      您需要在应用程序包中创建一个文件,例如bootstrap 内容如下:

      #!/bin/bash
      myAppPath=$(dirname "$0")
      exec "$myAppPath"/MyAppBinary "$@"
      

      ...其中 MyAppBinary 是您应用的二进制名称。

      然后在 UIApplicationMain 调用之前的main.m 内添加:

      // Set uid and gid
              if (!(setuid(0) == 0 && setgid(0) == 0))
              {
                  NSLog(@"Failed to gain root privileges, aborting...");
                  exit(EXIT_FAILURE);
              }
      

      将应用程序的启动文件设置为 bootstrap 而不是二进制名称,最后,在 deb 文件的 postinst 或从根 ssh 会话手动安装时,在引导程序和二进制文件上设置 suid 标志,并将所有者设置为root:

      chown root:wheel /Applications/MyApp.app/bootstrap
      chmod 6755 /Applications/MyApp.app/bootstrap
      chown root:wheel /Applications/MyApp.app/MyAppBinary 
      chmod 755 /Applications/MyApp.app/MyAppBinary 
      uicache
      

      从那时起,您的应用程序应该以 root 身份运行,尽管更新它不会像在 Xcode 中重建那样简单:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 2013-04-04
        • 1970-01-01
        • 2011-04-20
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        相关资源
        最近更新 更多