使用Photos.sqlite展示照片与创建应用之间的关系
首先,我要感谢Heather Mahalik在此过程中的帮助,并允许我在她的博客上发布内容。这是我的荣幸!此外,还要感谢Jared Barnhart在研究与测试方面的协助。
如果各位已经花时间阅读过这篇博客,我必须道歉。这是我的第一篇研究博客,发布后我觉得缺少了一些内容。我考虑过重写或发布后续博客,最终决定编辑原文并重新发布整个博客,这是为大家提供完整信息的最佳方法。
摘要:在一次检查和分析过程中,我发现了一些有趣的事情,并希望与大家分享。在检查一部Apple iPhone 7后,我发现一些照片是在原生iPhone消息应用(com.apple.MobileSMS)内使用相机应用(com.apple.camera.CameraMessagesApp)拍摄的。由于拍摄了照片,创建了几个我在过去的检查中未曾观察到的文件,这引发了我的一些疑问。
这是因为我在检查完整文件系统提取吗? 还是因为我在检查过程中没有足够仔细地关注?
无论如何,我开始测试和验证我的发现。
嫌疑人设备:Apple iPhone 7 (A1778) iOS 13.4.1 (17E262) 测试设备:Apple iPhone XS (A1920) iOS 13.5.1 (17F80)
在测试中,我没有发现13.4.1和13.5.1之间有重大变化导致测试无效。但在查看iOS 12.. FFS提取时,我注意到了一些差异。
重要提示:在这篇博客最初撰写后处理案件时,我注意到iOS 12和iOS 13之间存在一些差异。主要是,iOS 13设备在/private/var/mobile/Containers/Data/PluginKitPlugin/
采集方法:
- 首次解锁后(AFU)完整文件系统(FFS)(嫌疑人设备和测试设备)
- Cellebrite UFED 4PC高级逻辑和逻辑提取(仅嫌疑人设备)
使用工具:
- Cellebrite UFED 4PC (7.34.0.116)
- Cellebrite Physical Analyzer (PA) (7.35.00.33 – 7.36.0.35)
- Magnet AXIOM (4.3.1.20814)
- Artifact Examiner (1.3.6.1) https://www.doubleblak.com/
- Mushy Plist Viewer (1.2.7.0)
- iLEAPP (1.2) https://github.com/abrignoni/iLEAPP
- APOLLO (1.1) https://github.com/mac4n6/APOLLO
- Zimmerman Hasher (1.9.2.0)
- Navicat for SQLite (15.0.1)
- DB Browser (3.12.0)
取证问题: 在检查嫌疑人设备和分析数据时,我对显示的数据及其创建方式有一些疑问。我制定了几种场景来帮助演示和解释发生的情况:
场景1:当在原生iOS消息应用(com.apple.MobileSMS)内使用相机应用(com.apple.camera.CameraMessagesApp)拍摄照片并作为附件发送时会发生什么?
场景2:当在原生iOS消息应用内拍摄照片,作为附件消息发送,并且包含附件的消息后来从对话线程中删除(/private/var/mobile/Library/SMS/Attachments/)时会发生什么?
场景3:当在原生iOS消息应用内拍摄照片,作为附件消息发送,并且作为附件发送的照片后来从照片应用(/private/var/mobile/Media/DCIM/)中删除时会发生什么?
场景1 - 在原生iOS消息应用内使用相机应用拍摄照片/实况照片并作为附件发送
在测试中,我按照以下步骤拍摄照片和实况照片:
- 启动原生iOS消息应用(图1.1)并进入对话线程(图1.2)
- 从对话线程点击相机图标(图1.3),拍摄照片(图1.4)并点击完成(图1.5)
- 出现预览(图1.6),点击向上箭头发送照片给收件人,不包含任何文本(图1.7)
现在让我们看看当这些操作发生时设备内部发生了什么。
应用程序使用情况和焦点中的应用程序被记录在KnowledgeC数据库中。关于KnowledgeC数据库及其内容已有多个资源和已发表的研究。我鼓励大家花时间查看本文末尾的参考文献和其他来源列表。
- 晚上8:21:22 - 8:22:54:应用程序(com.apple.MobileSMS)被启动并使用
- 在此期间:
- 晚上8:22:01:后置摄像头被打开
- 晚上8:22:03:应用程序(com.apple.camera.CameraMessagesApp)被启动,并在Cache.sqlite - ZRTCLLOCLATIONMO表中创建和存储了几个缓存位置
- 晚上8:22:03:与\private\var\db\uuidtext\相关的各种文件路径位置被打开、修改和创建
晚上8:22:03创建了一个属性列表(plist):
private\var\mobile\Library\SMS\PluginMetaDataCache\BB6846A9-F53A-4DDA-9FA9-75B5E4FDF94E\com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.camera.CameraMessagesApp.plist
这个plist也可以在嫌疑人设备中找到,包含电话号码及其关联的UUID列表。似乎不同类型的消息发送有不同的属性列表。
晚上8:22:20,我拍摄了一张朋友Dexter的实况照片,导致在设备上创建了几个文件:
- /private/var/mobile/Media/DCIM/100APPLE/IMG_0012.MOV
- /private/var/mobile/Media/DCIM/100APPLE/IMG_0012.JPG
- /private/var/mobile/Containers/Data/PluginKitPlugin/45AAD7D6-8C36-411A-B311-04EAE0B5C470/tmp/61777214012__81412243-7181-4BFA-BAE0-7101DC818736.MOV
- /private/var/mobile/Containers/Data/PluginKitPlugin/45AAD7D6-8C36-411A-B311-04EAE0B5C470/tmp/61777214080__90B95980-BB3C-4A7A-B74E-82C62C923CC2.JPG
- /private/var/mobile/Library/SMS/Attachments/eb/11/A4BDFF37-B875-44DE-A094-1AC66A6DC059/61777214080__90B95980-BB3C-4A7A-B74E-82C62C923CC2.JPG
- /private/var/tmp/com.apple.messages/com.apple.MobileSMS/LinkedFiles/CB11EDB0-B428-49A4-9913-2C959289C3BC/61777214080__90B95980-BB3C-4A7A-B74E-82C62C923CC2.MOV
Photos.sqlite信息
在Photos.sqlite数据库ZGENERICASSET表中,所有PK值都是顺序的,没有缺失值,表明列表是完整的。但当我拍摄Dexter照片时创建了多个文件,包括IMG_0012.MOV。关于其他文件的信息在哪里?本文后续将讨论这一点。
在ZADDITIONALASSETATTRIBUTES表中,我发现了关于IMG_0012.JPG的一些关键信息。
在查看ZADDITIONALASSETATTRIBUTES表时,我注意到一些发现:
- Z_PK条目1-6在ZEXIFTIMESTAMPSTRING列中没有日期。这些图像不是用测试设备拍摄的,而是从Android设备通过MMS发送到测试设备的
- Z_PK条目7-11和17-22是用测试设备原生相机应用拍摄的
- Z_PK条目12-16是通过iOS消息应用内的相机应用拍摄的
关于ZORIGINALFILENAME列:所有使用CameraMessagesApp拍摄的照片都有一个UUID作为原始文件名。这些文件没有列在ZGENERICASSET表的ZFILENAME列中。另外,只有创建的JPG文件被列出。
日期、时间和时区
在ZADDITIONALASSETATTRIBUTES表的ZEXIFTIMESTAMPSSTRING列和ZGENERICASSET表的ZDATECREATED列中,日期和时间值以不同格式存储。ZDATECREATED中的值原生存储为Unix时间戳,需要转换,而ZEXIFTIMESTAMPSSTRING列中的值根据文件捕获时的设备时间设置存储。
方向
在ZGENERICASSET表中有一个ZORIENTATION列。使用测试设备数据,我确定1 = 水平,6 = 垂直。
位置
在Physical Analyzer的图5中,没有解析使用CameraMessagesApp拍摄的照片的位置数据。经过仔细分析,我无法在任何使用com.apple.camera.CameraMessagesApp应用程序创建的项目的EXIF数据或数据库元数据中找到任何记录的位置数据。
在ZADDITIONALASSETATTRIBUTES表中,ZREVERSELOCATIONDATA列包含一个二进制属性列表,其中包含照片拍摄时设备的准确位置。
原始文件名和/private/var/mobile/Containers/Data/PluginKitPlugin//tmp/
运行SQLite脚本后,我注意到IMG_0012.JPG的原始文件名是61777214080__90B95980-BB3C-4A7A-B74E-82C62C923CC2.JPG。
此文件存储在:/private/var/mobile/Containers/Data/PluginKitPlugin/45AAD7D6-8C36-411A-B311-04EAE0B5C470/tmp/
在嫌疑人设备的检查中,发现了在此测试过程中创建的一些文件,但应该存在的更明显的文件似乎已被删除。这意味着什么?
如果此照片附加到消息中,发送到另一台设备,并且尚未删除,则设备中应有一个文件存储在:/private/var/mobile/Library/SMS/Attachments/。在测试中,存储在/Containers/Data/PluginKitPlugin/
在嫌疑人设备中,我找到了存储在/private/var/mobile/Containers/Data/PluginKitPlugin/<UUID>/tmp/文件位置的文件。嫌疑人设备中此临时文件位置的UUID与我的测试设备中列出的不同。
当在测试设备中发现这一点时,我认为必须有文档表明临时文件位置与关联应用程序之间的关系。在文件系统中,有一个plist位于"45AAD7D6-8C36-411A-B311-04EAE0B5C470"文件夹的根目录中。
当我使用Mushy Plist Viewer查看此plist(.com.apple.mobile_container_manager.metadata.plist)时,发现了一个"MCMMetadataIdentifier: AsciiString = com.apple.CameraMessagesApp。“这似乎是与此文件夹路径UUID关联的应用程序。
基于测试和在嫌疑人设备中观察到的内容,我得出结论:如果文件存储在此文件路径中,它是通过CameraMessagesApp捕获/创建的。
注意:这不是唯一在/private/var/mobile/Containers/Data/PluginKitPlugin存储数据的应用程序。还有其他几个应用程序在此位置存储数据,包括SnapChat。
场景2 - 当在原生iOS消息应用内拍摄照片,作为附件消息发送,并且包含附件的消息后来从对话线程中删除时会发生什么
此场景的摘要:使用相机消息应用拍摄了一张照片(IMG_0014.JPG)。拍摄此照片时实况照片已关闭。照片被拍摄、附加到消息并发送到另一台设备。后来,包含附件的已发送消息从消息应用中删除。
在此过程中,存储在/private/var/mobile/Library/SMS/Attachments/的文件被删除,但存储在/private/var/mobile/Containers/Data/PluginKitPlugin/<UUID>/tmp/的文件仍然存在。
场景3 - 当在原生iOS消息应用内拍摄照片,作为附件消息发送,并且作为附件发送的照片后来从照片应用中删除时会发生什么
在这种情况下,存储在/private/var/mobile/Media/DCIM/100APPLE的照片被删除,但其他相关文件仍然存在。
总结
在此博客中,我们讨论了一些额外的文件位置,如果您有iOS完整文件系统(FFS)提取,应该分析这些位置。
您应该检查Photos.sqlite数据库并查看原始文件名。这可能表明存在其他要分析的文件,以及FFS提取是否对您的调查有益。
此外,您应该检查Photos.sqlite创建者捆绑包ID,这可能表明用于拍摄/创建照片的应用程序。使用此信息,您可以找到相应的/private/var/mobile/Containers/Data/PluginKitPlugin/<UUID>/tmp文件位置,可以检查该位置以获取其他文件。
/private/var/mobile/Containers/Data/PluginKitPlugin/<UUID>/tmp文件位置可能包含在其他类型的提取中不存在的重要数据。它还可能包含用户删除的文件,这些文件可能不存在于设备上的其他位置。