Why Rainbow Tables Aren't the Pot of Gold They Once Were
Today I’m presenting a SANS workshop on password cracking for OSINT and digital forensics. The workshop will require no previous knowledge and will progress from explaining how things work to how you can effectively crack passwords for file formats such as Office, Zip, RAR and PDF.
There are a few topics that I won’t be covering that I expect to get some questions on. That’s the purpose of this blog post. Those topics are salt and rainbow tables. It’s not that these topics aren’t interesting or worth talking about; they’re just not as relevant to password cracking as many people think they are. Let’s explain!
When I mention password cracking, many people instantly respond with “rainbow tables!!”. I try to avoid speaking in absolutes so I won’t say rainbow tables are useless, but I will say they aren’t much of a thing anymore.
In the workshop, we cover how to acquire password hashes from files and how to crack them. Let’s place that aside for a second and instead talk about a book.
Imagine someone handed you a 2,000-page book on world history and asked you to find every page that mentioned Napoleon. That request could easily take a full week if you need to read every page, or 5 minutes if the book has an index at the back we can use to instantly identify pages that mention Napolean.
Think of what an index does. The publisher, thankfully for us, decided to trade effort back then when they were making the book and storage space (an index takes up a lot of pages) in exchange for much faster lookups in the future.
Now let’s go back to password cracking. Imagine a company asks me to fly to Orlando next month to try to capture Wi-Fi traffic from a network called “Orlando Widgets Inc” and try to crack the Wi-Fi password. We know what hashing algorithm is used for Wi-Fi passwords, so imagine I take the massive word lists I use for password cracking, and figure out what the Wi-Fi hash would be for every one of them. I then save all of those as a giant list that I can search. It takes me a lot of effort now, plus storage space, to store the massive list, but now when I fly to Orlando and capture some Wi-Fi traffic, instead of having to “Crack” the hash live, I can just search for the hash in my table and hopefully have an answer in minutes instead of hours or days. It’s the exact same concept as the index in the book. When you hear the term “rainbow table”, think of a giant list of potential passwords and their hashes that we can quickly search. Underneath the hood, they’re a bit more complicated than that to try to save space, but that’s not important for us right now.
So, rainbow tables sound awesome, and no wonder so many people talk about them. But most modern systems introduce a huge problem for them: salt.
From a password security perspective, rainbow tables were obviously a huge threat, but what could be done about it? Turn’s out theirs an easy solution.
Imagine we have a database for users of our website that contains our user’s usernames, password hashes, and a timestamp of when the account was created.
From looking at this database, you don’t know what any of the passwords are, but you notice that Matt and Sarah have identical password hashes, so they must have the same passwords. If an attacker steals this and cracks Matt’s password, they’ll instantly know Sarah’s as well. In addition, the attacker will recognize that these hashes were created using the MD5 algorithm, and if they have a rainbow table for MD5 hashes, they may be able to crack these hashes very quickly. Now, let’s see what we can do to render the rainbow table nearly useless.
In this example, Lisa’s plain text password is “password” which computes to a hash of “5f4dcc3b5aa765d61d8327deb882cf99”. But what if when the Lisa user created their account, the system appended the timestamp onto the very end of the plaintext before it calculated the hash. The result would be a “password” of “password6445586576” which would have a hash of “91992da8dda226a12089034bad623af6”. Now anytime the Lisa user logged in, the system would automatically add the created timestamp onto what was typed into the password field, compute the hash, see they match, and allow access. In this case that timestamp that was added onto the password before the hash was calculated is referred to as a “salt”.
Let’s take a look at what adding in a salt accomplished:
First, even though Matt and Sarah still have the same password, they now have different hashes since they have different salts (in this case, the timestamps). But even more powerful, Lisa’s password is “password” which is assuredly going to be in any attacker’s dictionary of things to try, but what about ““password6445586576”?? Probably not. Adding in these salts just made the attacker’s MD5 rainbow table obsolete.
That’s what a salt is, why most modern systems use them, and why outside of a few exceptions, rainbow tables aren’t terribly useful for password cracking.
Let’s go back to the scenario where I have to fly to Orlando to crack the Wi-Fi password for the network “Orlando Widgets Inc”. In this case the name of a Wi-Fi network matters because the name of the network is the salt used for the password hash! So if I knew the name of the Wi-Fi network in advance, I still could create a rainbow table, but it would only be useful on Wi-Fi networks with that same name. Really doesn’t seem worth the effort, right?
To further reduce the need for rainbow tables, modern Graphics Cards (GPUs) can crack many hashing algorithms at a very high rate of speed. I have a midrange GPU (Nvidia 2070) on the computer I’m typing this on, and even that card can crack Wi-Fi WPA2 passwords at over 460,000 guesses per second!
This is a somewhat simplistic explanation of what salt is and why it’s a rainbow table killer. If you’re curious what the exceptions are, the most common use of rainbow tables by pen testers is for hashes obtained from users on a Windows system. Attackers who gain access to a Windows system can attempt to obtain the hashes for other users on the system. If they get these hashes, they can use Hashcat to crack them at a very fast rate, but Windows doesn’t salt these login hashes, so rainbow tables can be used by pen-testers and attackers to quickly crack some passwords.
Is this a huge security issue for Windows?? In my opinion, it’s pretty meh. Even my mid-range GPU can crack an NTLM (Windows login) password at a rate of millions of guesses a second. With quality dictionaries and useful rule files, I like my chances to crack a few hashes.
Hopefully these examples were clear, but I’m planning on recording a YouTube video as well to help explain these concepts. As always, if you have any questions, please feel free to reach out!