适用于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.plist
或Resources/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
以避免它。 environment
和arguments
都可以工作,因此我们也可以弄乱环境变量,尽管应用程序并不在乎它们。
真?
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并不难。