前言

iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的。

相关工具snoop-it

iOS的keychain提供了一种安全的保存私密信息(密码,序列号,证书等)的方案, 但是,在越狱环境下并不安全

iPhone:/private/var/Keychains root# pwd
/private/var/Keychains
iPhone:/private/var/Keychains root# ls -lrt
total 2984
-rw------- 1 _securityd wheel       0 Jan  1  1970 caissuercache.sqlite3
-rw------- 1 _securityd wheel   69632 Nov 22 10:33 ocspcache.sqlite3
-rw------- 1 _securityd wheel   16384 Dec  1 13:37 TrustStore.sqlite3
-rw------- 1 _securityd wheel     512 Dec  4 19:39 caissuercache.sqlite3-journal
-rw------- 1 _securityd wheel   32768 Dec  5 10:20 ocspcache.sqlite3-shm
-rw------- 1 _securityd wheel  253952 Dec  5 18:44 keychain-2.db
-rw------- 1 _securityd wheel 1277232 Dec  6 16:54 ocspcache.sqlite3-wal
-rw------- 1 _securityd wheel   32768 Dec  7 14:15 keychain-2.db-shm
-rw------- 1 _securityd wheel 1367872 Dec  7 17:08 keychain-2.db-wal

Keychain的信息是存在于每个应用(app)的沙盒之外的。
通过keychain access groups可以在应用之间共享keychain中的数据。要求在保存数据到keychain的时候指定group。
把数据保存到keychain的最好方法就是用苹果提供的KeychainItemWrapper。可以到这下载例子工程。

使用 KeyChain Dumper

一个应用能够访问的keychain数据是通过其entitlements文件指定的。keychain_dumper使用一个自签名文件,带有一个*通配符的entitlments,因此它能够访问keychain中的所有条目。

<?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>
CER=<40 character hex string for certificate> make codesign

使用该工具,需要确保 保存在 /private/var/Keychains/keychain-2.db 的文件可以被读取。

iPhone:/var/Keychains root# chmod +x keychain-2.db
iPhone:/var/Keychains root# ls -lrt /var/Keychains/keychain-2.db
-rwx--x--x 1 _securityd wheel 253952 Dec  5 18:44 /var/Keychains/keychain-2.db*
devzkndeMacBook-Pro:Versions devzkn$ scp /Users/devzkn/Downloads/Keychain-Dumper-master/keychain_dumper iphone150://bin/keychain_dumper

If you are using the binary from Git you can attempt to dump all of the accessible password Keychain entries by simply running the tool with now flags

iPhone:/bin root# /bin/keychain_dumper

Usage

Usage: keychain_dumper [-e]|[-h]|[-agnick]
<no flags>: Dump Password Keychain Items (Generic Password, Internet Passwords)
-a: Dump All Keychain Items (Generic Passwords, Internet Passwords, Identities, Certificates, and Keys)
-e: Dump Entitlements
-g: Dump Generic Passwords
-n: Dump Internet Passwords
-i: Dump Identities
-c: Dump Certificates
-k: Dump Keys
iPhone:/bin root# /bin/keychain_dumper -e
<?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>532LCLCWL8.com.tencent.xin</string>
            <string>8H6B3SFEU4.com.ali.group</string>
            <string>VG68Y2X7TH.com.taobao.taobao4iphone</string>
            <string>VMSRGD9Q5D.com.alimama.moon</string>
            <string>apple</string>
            <string>com.apple.SharedWebCredentials</string>
            <string>com.apple.apsd</string>
            <string>com.apple.assistant</string>
            <string>com.apple.security.sos</string>
            <string>ichat</string>
        </array>
    </dict>
</plist>

标识符(Identifier)

在后面我们要从keychain中取数据的时候会用到。

如果你想要在应用之间共享信息,那么你需要指定访问组(access group)。有同样的访问组 的应用能够访问同样的keychain信息。

Phone:/bin root# /bin/keychain_dumper -k
Key
---
Entitlement Group: com.apple.security.sos
一个安全点的选项是kSecAttrAccessibleWhenUnlocked。

iOS逆向
44 声望15 粉丝

引用和评论

0 条评论