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-write
或com.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与其通信,而不是打开数据库。