前言
1)本地数据攻与防
存储方案的选择
NSUserDefault:一般用于存储小规模数据、业务逻辑弱的数据。
keychain: 苹果提供的可逆存储,因为有着只要app不重装系统、可以同步iCloud的特性,一般用来对用户的标识符或者一些需要加密的小数据进行存储。
归档:主要原理是对数据进行序列化、反序列化操作后,写入、读出数据。方便便捷易使用,缺点查询、更改数据耗时耗性能。
数据库:主要的有三种sqlite3、core data、realm。
系统键盘缓存
我们打字在使用系统键盘打字时时,会出现提示,键盘一般会缓存这些提示字符串,缓存在手机的“/private/var/mobile/Library/Keyboard/xx-dynamic-text.dat”文件中,攻击者可以提取出来,出现频率最高的往往是账户名和密码。
- en_GB-dynamic-text.dat
cat en_GB-dynamic-text.dat DynamicDictionary-5cantonciaocreateGeneratorhiiI'mIimoofflinePaymentNewSnsSThetheUuiuuuuuuuuuuuuuuuuuuuuuuuUuiuuuuuuuuuuuuuuuuuuuuuUuiuuuuuuuuuuuuuwwwZhangzhang发红包我是宝妈宝少爷之家babka我是iPhone:/private/var/mobile/Library/Keyboard root#
iPhone:/private/var/mobile/Library/Keyboard root# ls -lrt total 8 drwxr-xr-x 2 mobile mobile 102 Apr 23 2017 completion-learning-dictionary-zh-Hans/ drwxr-xr-x 2 mobile mobile 170 Apr 23 2017 PhraseLearning_zh_Hans.db.bundle/ drwxr-xr-x 4 mobile mobile 136 Apr 23 2017 CoreDataUbiquitySupport/ drwxr-xr-x 2 mobile mobile 102 Dec 5 2017 completion-learning-dictionary-zh-Hant/ -rw-r--r-- 1 mobile mobile 256 Dec 5 2017 LearningSet_zh_Hant.plist drwxr-xr-x 2 mobile mobile 238 Dec 5 2017 zh_Hant-dynamic.lm/ -rw------- 1 mobile wheel 293 Aug 11 10:29 en_GB-dynamic-text.dat drwxr-xr-x 2 mobile mobile 238 Aug 12 17:02 zh_Hans-dynamic.lm/ drwxr-xr-x 2 mobile mobile 238 Aug 12 17:02 en-dynamic.lm/
剪切板的缓存
- 我们在使用剪切板进行操作时,iOS系统会缓存所操作的数据,如果数据涉及隐私,将会带来安全问题。如下图,iOS的三种剪切板和功能,其中系统级别的剪切板优先级最高。
* 注意:在获取剪切板内容时,总是先取系统的剪切板内容,若没有值才会取应用间的剪切板内容。所以在使用完剪切板时,我们在程序退出时,清空剪切板内容。 ![image](https://wx3.sinaimg.cn/large/af39b376gy1fu71z74lmej218805fwh0.jpg)
2)APP文件下的本地存储Documents、Library/Caches、Tmp
- Documents: 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。
- tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
- Library/Caches: 保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下。
数据库,一般存储在Documents路径下的特殊文件,格式一般为.db或者.sqlite,导出后使用特殊工具即可查看如DB Browser for sqlite 和 SQLiteStudio。
- 我目前使用DB Browser for sqlite
本文重点讲解如何操作db ,获取和修改数据,达到一些特定目的。
I、/private/var/mobile/Library/Accounts/Accounts3.sqlite
ZACCOUNT
ZACCOUNT
const char *sql = “delete from ZACCOUNT where ZUSERNAME <> ""”;
const char *sql = "delete from ZACCOUNT where ZUSERNAME <> \"\"";
ZACCOUNTTYPE
II、/private/var/mobile/Library/Accounts/Accounts3.sqlite-shm
shm is an index file for
wal
- 使用SQLCipher进行整个数据的加密
整库加密: 可使用第三方的SQLite扩展库,对数据库进行整体的加密。如:SQLCipher
优点:对数据库整体操作,减少资源消耗。
缺点:需要使用第三库。
usage
在创建数据库时,添加如下代码即可:
加密之后的效果
III、keychain_dumper:KeyChain数据的读取
Keychain是一个拥有有限访问权限的SQLite数据库(AES256加密),可以为多种应用程序或网络服务存储少量的敏感数据(如用户名、密码、加密密钥等)。如保存身份和密码,以提供透明的认证,使得不必每次都提示用户登录。在iPhone上,Keychain所存储的数据在 /private/var/Keychains/keychain-2.db SQLite数据库中。如下图:
3.0 /private/var/Keychains/
- keychain-2.db
当我们打开这个数据库,会发现如下图中四个表:genp、inet、cert、keys
数据库内数据,大多数是加密的,Keychain的数据库内容使用了设备唯一的硬件密钥进行加密,该硬件密钥无法从设备上导出。因此,存储在Keychain中的数据只能在该台设备上读取,而无法复制到另一台设备上解密后读取。
一旦攻击者能够物理接触到没有设置密码的iOS设备时,他就可以通过越狱该设备,运行如keychain_dumper这样的工具,读取到设备所有的Keychain条目,获取里面存储的明文信息。具体方法是通过ssl让mac连接iPhone,使用keychain_dumper,导出Keychain
iOS系统的keychain 存储类型
3.2 、使用theos 进行开发code ,获取数据
build
run script,赋予访问钥匙串的权限: keychain-access-groups
/opt/MonkeyDev/bin/md --xcbp echo "$PROJECT_DIR/KCdumper/entitlements.xml" /opt/iOSOpenDev/bin/ldid -S"$PROJECT_DIR/KCdumper/entitlements.xml" "$TARGET_BUILD_DIR/$EXECUTABLE_NAME"
ldid -e
iPhone:~/MonkeyDevBuilds/KCdumper root# ldid -e /bin/keychain_dumper <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>*</string> </array> </dict> </plist>
➜ Keychain-Dumper-master git:(master) ✗ /opt/iOSOpenDev/bin/ldid
usage: /opt/iOSOpenDev/bin/ldid -S[entitlements.xml]
/opt/iOSOpenDev/bin/ldid -e MobileSafari
/opt/iOSOpenDev/bin/ldid -S cat
/opt/iOSOpenDev/bin/ldid -Stfp.xml gdb
Fix for recent iOS 11 JBs
Keychain-Dumper/entitlements.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>*</string> </array> <key>platform-application</key> <true/> </dict> </plist>
usage
将手机越狱,通过Cydia(越狱手机都有,相当于App Store)安装OpenSSH
在mac终端输入: ssh root@(手机IP) 然后会提示输入密码,默认为alpine
使keychain数据库权限可读: cd /private/var/Keychains/ chmod +r keychain-2.db
/private/var/Keychains/
iPhone:/bin root# ls -lrt keychain_dumper -rwxr-xr-x 1 root wheel 211584 Dec 7 2017 keychain_dumper* iPhone:/bin root# ls -lrt /private/var/Keychains/ total 4476 -rw------- 1 _securityd wheel 0 Jan 1 1970 caissuercache.sqlite3 -rw------- 1 _securityd wheel 16384 Dec 1 2017 TrustStore.sqlite3 -rw------- 1 _securityd wheel 512 Jul 19 11:57 caissuercache.sqlite3-journal -rw------- 1 _securityd wheel 49152 Jul 26 10:26 ocspcache.sqlite3 -rwx--x--x 1 _securityd wheel 274432 Aug 6 15:26 keychain-2.db* -rw------- 1 _securityd wheel 32768 Aug 6 16:34 ocspcache.sqlite3-shm -rwx--x--x 1 _securityd wheel 32768 Aug 6 16:35 keychain-2.db-shm* -rwx--x--x 1 _securityd wheel 1895232 Aug 10 14:30 keychain-2.db-wal* -rw------- 1 _securityd wheel 2274272 Aug 12 10:59 ocspcache.sqlite3-wal
将下载的keychain_dumper可执行文件移到iPhone的/bin目录下
- 输入命令:scp /Users/ice/Downloads/Keychain-Dumper-master/keychain_dumper root@(手机ip):/bin/keychain_dumper
- 添加执行权限: chmod +x /bin/keychain_dumper
- 解密keychain:/bin/keychain_dumper
II 、使用monkeydev 进行开发
iPhone:~/MonkeyDevBuilds/KCdumper root#
ldid
➜ Keychain-Dumper-master git:(master) ✗ ldid -S/Users/devzkn/code/jb/KCdumper/KCdumper/entitlements.xml /Users/devzkn/Library/Developer/Xcode/DerivedData/KCdumper-dldyptxafmjomrfzjyebxrbepxsh/Build/Products/Debug-iphoneos/KCdumper
scp
➜ Keychain-Dumper-master git:(master) ✗ scp -r /Users/devzkn/Library/Developer/Xcode/DerivedData/KCdumper-dldyptxafmjomrfzjyebxrbepxsh/Build/Products/Debug-iphoneos/KCdumper usb2222:~
dpkg -i
iPhone:~/MonkeyDevPackages root# dpkg -i com.ldzspace.KCdumper_0.1-1_iphoneos-arm.deb (Reading database ... 4648 files and directories currently installed.) Preparing to unpack com.ldzspace.KCdumper_0.1-1_iphoneos-arm.deb ... Unpacking com.ldzspace.kcdumper (0.1-1) over (0.1-1) ... Setting up com.ldzspace.kcdumper (0.1-1) ...
MonkeyDevPackages
iPhone:~/MonkeyDevPackages root# dpkg -c com.ldzspace.KCdumper_0.1-1_iphoneos-arm.deb drwxr-xr-x devzkn/staff 0 2018-08-12 10:27 usr/ drwxr-xr-x devzkn/staff 0 2018-08-12 15:52 usr/bin/ -rwxr-xr-x devzkn/staff 227520 2018-08-12 15:52 usr/bin/KCdumper
Generic Password
com.apple.account.IdentityServices.token
Service: com.apple.account.IdentityServices.token Account: 4C64CF25027 Entitlement Group: apple Keychain Data: V1MHKW000903db
BackupIDSAccountToken
Service: BackupIDSAccountToken Account: 1680@qq.com-AuthToken Entitlement Group: apple Label: (null) Generic Field: (null) Keychain Data: V1MHKW0009
AirPort
Generic Password
----------------
Service: AirPort
Account: HN-WEI
Entitlement Group: apple
Label: (null)
Generic Field: (null)
Keychain Data: wei
平常我使用保持的数据格式
keychainItemWrapper
initWithIdentifier
keychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"liu.openUdid"accessGroup:nil];
Generic Password
----------------
Service:
Account:
Entitlement Group: UVWU8XCYJX.com.gua
Label:
Generic Field: iu.openUdid
Keychain Data: 11f6db3943cb989022db8f88cf489c
application-identifier
VG68Y2X7TH.com.taobao.taobao4iphone
udid
Generic Password ---------------- Service: com.taobao.taobao4iphone Account: udid Entitlement Group: VG68Y2X7TH.com.taobao.taobao4iphone Label: (null) Generic Field: (null) Keychain Data: s
532LCLCWL8.com.tencent.xin
存储json 字符串的例子
Generic Password ---------------- Service: Account: Entitlement Group: s.com.tencent.xin Label: Generic Field: s.KNcom.tencent.xin Keychain Data: {"wxhq5c9sat12":"E7058B2523EE47FBBE02E94E8611418B"}
com.tencent.xin.updateresinfo
Generic Password ---------------- Service: com.tencent.xin.updateresinfo Account: com.tencent.xin.updateresinfo Entitlement Group: 532LCLCWL8.com.tencent.xin Label: (null) Generic Field: (null) Keychain Data: (null) Generic Password ----------------
tencent.mqq.analytics
Generic Password ---------------- Service: tencent.mqq.analytics Account: rqd.qimei Entitlement Group: 532LCLCWL8.com.tencent.xin Label: tencent.mqq.analytics Generic Field: (null) Keychain Data: 7DD2
See Also
/Users/devzkn/bin//knpost Accounts3 帐号信息的分析以及清除 -t jb #原来""的参数,需要自己加上""
转载请注明:张坤楠的博客 > keychain_Accounts3