适用于iOS的Xcode乐器:撤消和滥用

在阅读了有关Pangu9之前(包括Pangu9)的旧iOS越狱的一些出版物之后,我对锁定服务和DeveloperImage尤其是Xcode的Instruments应用感兴趣。

在进行了反向工程并准备写这篇文章之后,我很失望地发现有人已经完成了同样的工作。

因此,只有已注册的类及其选择器确认可以调用DTXAllowedRPC协议。


服务位于多个可执行文件中,主要是以下两个模块:

  • /开发人员/图书馆/私人框架/DVTInstrumentsFoundation.framework/DVTInstrumentsFoundation
  • /开发人员/图书馆/PrivateFrameworks/DVTInstrumentsFoundation.framework/DTServiceHub

神模式

服务器检查getenv("DYLD_ROOT_PATH") + "/AppleInternal"的存在以展现其内部功能:

看起来我们甚至无法在iOS 11上越狱也无法挂载此位置:https://www.theiphonewiki.com/wiki//AppleInternal

但是,如果有人遇到了可能会破坏launch_data的错误,那么他可以将环境变量替换为允许触及该子目录的位置。

内部方法具有可以直接调用posix_spawn API:

  -[DTUVRenderingService processStartCLIFromMessage:error:] 
-[DTPosixSpawnProcessControlService launchSuspendedProcessWithDevicePath:bundleIdentifier:environment:arguments:options:]

无限目录列表和文件读取:

  -[DTFileBrowserService entryAtPath:] 
-[DTFileBrowserService entryInPathsArray:]
-[DTFileBrowserService dataFromFileAtPath:]
-[DTFileBrowserService contentsOfDirectoryAtPath:]
-[DTFileBrowserService updateAttributesForItem:]

斯威夫特游乐场

在最近的DeveloperImage(> iOS 10)中引入了一项新服务DTFileTransferService ,该服务允许将文件发送到Swift Playgrounds的文档收件箱并打开它。

如果给定的文件是zip存档,它将先检查BOM.framework,然后再检查Playgrounds是否存在。 因此,如果您可以在BOM表中发现错误(例如CVE-2015–7006),则存在潜在的攻击面,该缺陷已在AirDrop中加以利用以进行远程应用程序安装:http://2015.ruxcon.org.au/assets/2015/slides/ ruxcon-2016-dowd.pptx

另一个目录清单

目录列表在DTFileBrowserService实现,并且需要AppleInternal设备。 但是,似乎以某种方式忘记了-[DTDeviceInfoService directoryListingForPath:]

但是那又怎样呢? 甚至无法读取单个文件。

从iOS读取macOS文件

我试图从iDevices读取文件(没有运气),相反呢?

我们可以注意到,每次Instruments启动应用程序时,此方法都将称为: -[DTAssetService startServerForApplicationWithDevicePath:]

这是按需资源的仿真器:

按需资源指南:在应用程序中设置主机

描述应用程序如何使用远程按需资源。

developer.apple.com

它在随机端口上启动http服务器,从Resources/AssetPackManifestTemplate.plistResources/AssetPackManifest.plist读取配置,然后将URL密钥更新为http://localhost:{PORT}

那么,这个HTTP服务器是做什么用的呢? 嗯…

它将macOS上的整个文件系统映射到静态HTTP服务器,以便iOS应用可以通过按需资源将其拉出,这意味着当您使用Instruments进行自己的开发时,理论上另一个应用可以扫描localhost上的TCP端口,并且在后台从Mac窃取文件 。 首先http://localhost:{PORT}/Library/Preferences/com.apple.loginwindow.plist来获取用户名,然后从主目录中获取SSH私钥…

好吧,因为这种情况不太实用,并且后台端口扫描花费了太多时间,而沙箱中无法访问NetworkStatistics api或sysctlbyname("net.inet.tcp.pcblist_n",…) ,所以此问题的影响有限。

活动经理

在先前的侦察讨论中已经提到了这一点。

通过以下方法,您可以在被监禁的iOS上安装一个活动管理器。

  • -[DTDeviceInfoService runningProcesses]
  • -[DTProcessControlService killPid:]

DTServiceHub以root身份运行,它可以杀死除自身以外的几乎所有进程并启动。

应用启动器

在非越狱设备上可以通过SpringBoard启动应用程序的方法:

-[DTSpringBoardProcessControlService launchSuspendedProcessWithDevicePath:bundleIdentifier:environment:arguments:options:]

但是通常情况下,当我们尝试启动没有task-for-pid_allow授权的应用程序时(例如,来自App Store),它将失败,因为DTServiceHub会尝试从目标应用程序获取任务端口,这需要越狱。 我们需要将选项DTProcessControlServiceOption_LeaveSuspendedKey设置为NO以避免它。 environmentarguments都可以工作,因此我们也可以弄乱环境变量,尽管应用程序并不在乎它们。

真?

CFNetwork诊断

根据Apple的问答,可以将CFNETWORK_DIAGNOSTICS设置为启用对CFNetwork的跟踪。

技术问答QA1887:CFNetwork诊断日志记录

在iOS 12上仍然可以使用,即使对于TLS请求也可以打印一些标题和cookie:

ImageIO调试

在macOS和iOS上,ImageIO.framework都需要一些环境变量进行调试:

  • IIO_PluginVerbose = 1
  • IIO_DebugFileAccess = 1
  • IIO_dLogImageIOAPICalls
  • IMAGEIO_DEBUG_RAW_LOADING
  • IIO_dLogImageIOSPICalls = 1

好吧,这看起来没有太大帮助。

SQLite数据库转储

从macOS Sierra / iOS 10开始,* OS的内置libsqlite.dylib启用了对SQLITE_ENABLE_SQLLOG的支持。

这是一个有趣的功能,它将为打开的每个数据库创建一个副本,并且每个查询都将以纯文本日志文件记录。

在接下来的文章中,我将详细介绍如何滥用此功能从连接的iPhone中提取SQLite数据库,而无需等待完整备份。


前面提到的演示文稿还发布了一种用于发送和分析RPC消息的工具:

Troybowman / dtxmsg

通过在GitHub上创建一个帐户来为troybowman / dtxmsg开发做出贡献。

github.com

无论如何,我的方法有点不同。 无需编写自己的消息序列化,而是仅将frida脚本注入Instruments客户端并调用其功能。 我认为将其移植到libimobiledevice并不难。