iOS取证技巧:不进行完全备份就拉数据库

在上一篇文章中,我写了关于滥用iOS DeveloperImage中的某些功能的信息,包括在监狱中的设备上启动带有自定义环境变量的应用程序。

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

仪器服务器

medium.com

老实说,我的动机是寻找沙盒逻辑问题,但失败了。 但是至少我发现这个技巧可以滥用某些功能来提取SQLite数据库(这是常见的取证目标),而无需进行全新的完整备份。 这种情况下需要屏幕解锁和受信任的USB连接。

要运行实验,您需要使用以下工具:

  • https://github.com/libimobiledevice/libimobiledevice
  • https://github.com/libimobiledevice/ideviceinstaller
  • https://github.com/emonti/afcclient(可选。如果您不想自己在libimobiledevice上编码,请使用此功能)

当前iOS上内置的SQLite支持调试选项:如果设置了SQLITE_SQLLOG_DIR环境,则每个数据库在给定目录中都有一个副本,每个sql查询也以纯文本格式。

迈克尔·蔡(Michael Tsai)–博客– SQLITE_ENABLE_SQLLOG

该文件包含实验性代码,用于记录来自实时SQLite应用程序的数据,这些数据可能对离线使用非常有用…

mjtsai.com

SQLite:文档

** 2012年11月26日** **作者拒绝对此源代码进行版权保护。 代替**法律声明,这里是……

www.sqlite.org

我们的实验从越狱的设备开始。 只需使用SQLITE_SQLLOG_DIR指向其有权写入的地方启动Gmail应用程序即可:

修改上一篇文章中的脚本,向环境添加新密钥:

  const env = ObjC.classes.NSMutableDictionary.alloc()。init(); 
env.setObject_forKey_(
ObjC.classes.NSString.stringWithString _('/ private / var / mobile / Containers / Data / Application / {THE_ACTUAL_UUID_ON_YOUR_DEVICE} / tmp'),
ObjC.classes.NSString.stringWithString _('SQLITE_SQLLOG_DIR'));

这是它生成的目录:

 您好:/ private / var / mobile /容器/数据/应用程序/.../tmp root#ls 
WebKit sqllog_05860_00000.sql sqllog_05860_00003.sql sqllog_05860_01.db
sqllog_05860.idx sqllog_05860_00001.sql sqllog_05860_00004.sql sqllog_05860_02.db
sqllog_05860_00.db sqllog_05860_00002.sql sqllog_05860_00005.sql sqllog_05860_03.db

文件名05860是pid,格式为固定的5位数字。 idx文件是原始数据库的映射索引。

  root#猫sqllog_05860.idx 
0 /专用/ var /移动/容器/共享/AppGroup/21805C48-3DD1-4973-BDB8-F26441BE74B3/GIPPhenotype/phenotype.db
1 / var / mobile /容器/数据/应用程序/ E89CEF28-30BA-41F8-BDB3-BD05E0598D32 / Library / Application Support/data/johnsmith@outlook.com/sqlitedb
2 / var / mobile /容器/数据/应用程序/ E89CEF28-30BA-41F8-BDB3-BD05E0598D32 / Library / Application Support/data/johnsmith@outlook.com/imapsqlitedb
3 / private / var / mobile /容器/数据/应用程序/E89CEF28-30BA-41F8-BDB3-BD05E0598D32/Library/Caches/com.google.Gmail/Cache.d

例如, /var/mobile/Containers/Data/Application/E89CEF28–30BA-41F8-BDB3-BD05E0598D32/Library/Application Support/data/johnsmith@outlook.com/sqlitedb上的所有查询均记录在sqllog_05860_00000.sql

sqllog_05860_00.db是副本。


现在的问题是,iOS上的应用程序被囚禁在其容器中, 如果没有完整的备份 ,这些容器仍然无法访问 。 每个规则都有一个例外,沙箱配置文件也有例外。

某些内置应用程序有权写入/var/mobile/Media/iTunes_Control/iTunes

某些应用程序具有com.apple.security.exception.files.absolute-path.read-writecom.apple.security.exception.files.home-relative-path.read-write权利。

您可以通过ideviceinstaller -l -o list_system -o xml阅读这些权利。

VioceMemo:

   com.apple.security.exception.files.absolute-path.read-write  

/ private / var / mobile / Media / Recordings /

platform-application

MobileSafari:

   com.apple.security.exception.files.home-relative-path.read-write  

/Library/com.apple.itunesstored /
/Library/com.apple.iTunesCloud /
/Library/Caches/com.apple.Music /
/库/ Cookies /
/媒体/
/Library/Caches/com.apple.Radio /
/Library/Caches/com.apple.iTunesStore /
/Library/Caches/sharedCaches/com.apple.Radio.RadioImageCache /
/Library/Caches/sharedCaches/com.apple.Radio.RadioRequestURLCache /
/Library/com.apple.MediaSocial /
/库/ DeviceRegistry /
/库/日志/ MediaServices /

iOS允许AFC公开的/var/mobile/Media沙箱文件访问。 许多第三方iPhone管理工具都允许您直接操作此位置,即使使用了不错的GUI也是如此。

  ➜afcclient git:(master)✗./afcclient mkdir下载/ SQLite 

可能可读的另一个地方是CrashReporter。 您可以使用idevicecrashreport捕获文件。

坏消息是,并非所有内置应用程序都具有这些例外,更不用说第三方了。


在测试过程中,启动Instruments并使用上一篇文章中的frida脚本,将bundle id更改为您的目标。

com.apple.mobilesafari

有Safari浏览器状态,书签,历史记录,每个站点的首选项,HTML5本地存储,甚至还有缓存。 请注意,通常Cache.db不会包含在备份中,它以纯文本形式存储http请求。

  ➜afcclient git:(master)✗./afcclient mkdir iTunes_Control / iTunes / safari 
创建的目录:iTunes_Control / iTunes /safari➜afcclient git:(master)✗./afcclient cat iTunes_Control / iTunes / safari / sqllog_02343.idx
0 / private / var / mobile /容器/数据/应用程序/ 9210B36C-89E2-4728-9831-40CAA961C15E / Library / Image Cache / Favicons / Favicons.db
1 / var / mobile /容器/数据/应用程序/9210B36C-89E2-4728-9831-40CAA961C15E/Library/Safari/BrowserState.db
2 / private / var / mobile /容器/数据/应用程序/ 9210B36C-89E2-4728-9831-40CAA961C15E / Library / Image Cache / Touch Icons / TouchIconCacheSettings.db
3 / private / var / mobile /容器/数据/应用程序/ 9210B36C-89E2-4728-9831-40CAA961C15E / Library / Image Cache / Password Icons / TouchIconCacheSettings.db
4 /var/mobile/Library/Safari/Bookmarks.db
5 / private / var / mobile /容器/数据/应用程序/9210B36C-89E2-4728-9831-40CAA961C15E/Library/Safari/History.db
6 / var / mobile /容器/数据/应用程序/9210B36C-89E2-4728-9831-40CAA961C15E/Library/WebKit/WebsiteData/LocalStorage/https_mobile.twitter.com_0.localstorage
7 / private / var / mobile /容器/数据/应用程序/9210B36C-89E2-4728-9831-40CAA961C15E/Library/Safari/PerSitePreferences.db
8 / private / var / mobile /容器/数据/应用程序/9210B36C-89E2-4728-9831-40CAA961C15E/Library/Caches/com.apple.mobilesafari/Cache.db

com.apple.mobilemail

  ➜afcclient git:(master)✗./afcclient cat Mail / sqllog_04465.idx 
0 / var / mobile /图书馆/邮件/信封索引
1 / var / mobile /库/邮件/受保护的索引
2 /var/mobile/Library/DeviceRegistry/5CFB9E7E-C465-4A92-B3ED-C744367AB766/NanoMail/registry.sqlite
3 /var/mobile/Library/AddressBook/AddressBook.sqlitedb

com.apple.mobilephone

通讯录和通话记录:

 您好:〜root#procexp全部fds |  grep -i sms.db 
IMDPersistenceA 812 FD 4u /专用/ var / mobile /移动/库/SMS/sms.db @ 0x0
IMDPersistenceA 812 FD 5u /专用/var/mobile/library/SMS/sms.db-wal @ 0x0
IMDPersistenceA 812 FD 6u /private/var/mobile/library/SMS/sms.db-shm @ 0x0
您好:〜root#ps aux | grep 812
移动812 0.0 0.0 1664672 1296 ?? Ss 22Oct18 0:01.77 /System/Library/PrivateFrameworks/IMDPersistence.framework/XPCServices/IMDPersistenceAgent.xpc/IMDPersistenceAgent
根6008 0.0 0.1 1593504 1536 s000 S + 2:50 PM 0:00.01 grep 812
你好:〜root#➜afcclient git:(master)✗./afcclient mkdir iTunes_Control / iTunes / Phone
创建的目录:iTunes_Control / iTunes /Phone➜afcclient git:(master)✗。/ afcclient cat iTunes_Control / iTunes / Phone / sqllog_04322.idx
0 /var/mobile////Library/CallHistoryDB/CallHistory.storedata
1 /var/mobile////Library/CallHistoryDB/CallHistoryTemp.storedata
2 /var/mobile/Library/AddressBook/AddressBook.sqlitedb

但是您将无法拉出sms.db ,因为它由xpc服务IMDPersistenceAgent拥有。 消息应用程序com.apple.MobileSMS通过XPC与其通信,而不是打开数据库。