Information for red teaming macOS and info on real world TTPs are still a bit sparse. That makes it difficult for defenders to know what attackers do on macOS compared to Windows. Some organizations might have a bigger blind spot when it comes to macOS.
This post describes how an adversary can grab hashes from a macOS machine, how to convert it to a hashcat friendly format and use hashcat to crack it.
More than once have I seen clients that have the same password for an admin user account provisioned on every Mac. Although, that’s not the only scenario grabbing a hash and cracking it can be useful.
Let’s dive into the details on grabbing hashes from Mac’s!
Basics - The Local Directory Service
The precious hashes for accounts on macOS are stored in the local directory service. They can be found in
.plist files at
On newer versions of macOS, System Integrity Protection (SIP) prevents root to access the files directly. To check if SIP is enabled use the
$ csrutil status System Integrity Protection status: enabled.
Luckily, we don’t have to read the files directly though, we can use
As root, you can read the information of other accounts on the system using
$ dscl . -read /Users/Bob
The output looks like this:
Besides a lot of interesting information about the user, the picture they use, etc. the password hash is what attackers are after.
You might have noticed in the screenshot that it also includes the password hash. To drill down and just grab the
ShadowHashData specifically using
dscl as well:
$ dscl . -read /Users/Bob/ dsAttrTypeNative:ShadowHashData
This will print out the hash and salt of the account’s password:
Now the goal is to crack them with hashcat. For that the base64 values have to be converted into their hex representation. This is a bit tricky and I recall the first time doing this took me a while, but the the following post was quite useful.
This is how the conversion of one of the values of the
SALTED-SHA512-PBKDF2 hash looks like:
$ echo ADXA/4Prd48YIy7BhVVhA5gpBD54zK2UkiZdzEKXRTs= | base64 -D | xxd -p 0035c0ff83eb778f18232ec1855561039828043e78ccad9492265dcc4297453b
Using Hashcat to crack macOS hashes
Now it’s time to spin up hashcat and start trying to crack the hash.
$ hashcat -m 7100 hash.txt -a 0 wordlist.txt
The following screenshot shows how this looks in action:
Voila! The password was cracked successfully!
As mentioned earlier there is a lot of other useful info that can be read with
Apple stores the authentication hint the user created in clear text. So that can be useful as well to build a good wordlist for cracking a specific password:
$ dscl . -read /Users/Bob/ AuthenticationHint Authentication Hint: The password hint is not encrypted
Pretty interesting, although not entirely unexpected that a password hint could be visible to anyone.
Finally, if you prefer using the UI rather than the command line tool
dscl you can hit
SPACE and type
Directory Utility to bring up Apple’s directory utility program.
This is a super handy tool to explore accounts and Active Directory information if the machine is joined to a Windows domain. You can get the same information around accounts as with
dscl, including password hints and hashes from the Directory Utility as you can see below:
Hope this was interesting to highlight some of the TTPs that adversaries perform on macOS to gain access to passwords for lateral movement.