<<

Rainbow Tables

whoami

● Andrew Kramer ● Dakota State University ● Grad Student in Cyber Operations ● SFS Scholarship Recipient ● [email protected]

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

INDEX

● Hash Functions <<<

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

What Is a Hash Function?

● Different than “” ● One-way ● Irreversible (sort of) ● Arbitrary length in, fixed length out ● Pseudo-random ● Few collisions

Example Hash Function

● Convert all characters to numbers, i.e... – A=1 – B=2 – Etc... ● Add all the numbers ● Divide the sum mod 26 ● Represent as two digits (zero padded)

Example Hash Function

● “foobar” – 6 + 15 + 15 + 2 + 1 + 18 = 57 – 57 mod 26 = 5 – Therefore: MYHASH(“foobar”) = 05 ● “catdog” – 3 + 1 + 20 + 4 + 15 + 7 = 50 – 50 mod 26 = 24 – Therefore: MYHASH(“catdog”) = 24

Real Hash Functions

● MD5 – 128 bits (16 bytes) – Commonly represented as 32 hex characters – (“foobar”) = 3858f62230ac3c915f300c664312c63f ● SHA1 – 160 bits (20 bytes) – Commonly represented as 40 hex characters – sha1(“foobar”) = 8843d7f92416211de9ebb963ff4ce28125932878

Why hash ?

[email protected]:i<3computers [email protected]:Password1! [email protected]:kittiesrule Etc...

[email protected]:5f306463f... [email protected]:ff4c22878... [email protected]:a97fe3c... Etc...

INDEX

● Hash Functions

● Cracking Hashes <<< – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

What's a Poor Hacker To Do?

● Two simple ways to recover plaintext – On-the-fly bruteforce

● Hashcat (CPU or GPU) ● John the Ripper (CPU) ● Wordlists (CPU or GPU) – Precomputed lookup tables

● aaaaaa:0b4e7a0e5fe84ad35fb5f95b9ceeac79 ● aaaaab:9dcf6acc37500e699f572645df6e87fc ● aaaaac:52a0a42bc3e1675eccb123b56ea5e3c8 ● Etc... for gigs... and gigs... and gigs...

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce <<< – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

Raw Bruteforce?

● Sooooo slooow – 4GHz 8-core CPU = ~74Million MD5s / sec – [a-zA-Z0-9] ^ 10 = 83,929,936,586,800,000 – ~36 years :( ● Duplicate work for every hash ● The power bill...

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries <<< ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

Precomputed Lookup Lists?

● Requires storage space in the... – Terabytes? – Petabytes?? – Exabytes ??? – Forget it

● [10 chars] + [16 bytes] + [1 bytes '\n'] over [a-zA-Z0-9] ● (10 + 16 + 1) * (26 + 26 + 10)^10 = 2,266,108,287,840,000,000 bytes = ~ 2.266 exabytes :(

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables <<< – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information

Rainbow Tables

● Best of both worlds

● Time-memory trade off

● A few hundred gigs + a few hours of CPU – Same coverage as a hundred years of CPU – Same coverage as a petabyte of lookup lists

Or More Visually...

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions <<< – Table Generation – Hash Lookup – Potential Problems ● Related Information

Reduction Function

● “Opposite” or a hash function ● Input hash... output a plaintext – NOT THE SAME PLAINTEXT ● Fixed length in... arbitrary length out ● Ideally also pseudo-random

Example Reduction Function

● For charset=[0-9], length=1-10 – Find all digits in the hash – First digit represents length (0 = 10) – Other digits (up to length) represent plaintext – MYREDUCE(“52a0a42bc3e1675eccb123b56ea5e3c8”) = 20423 – MYREDUCE(“9dcf6acc37500e699f572645df6e87fc”) = 63700699 – MYREDUCE(“0b4e7a0e5fe84ad35fb5f95b9ceeac79”) = 4705843559

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation <<< – Hash Lookup – Potential Problems ● Related Information

We Can Chain Hash/Reduce!

● plaintext -hash()-> HASH -reduce()-> plaintext -hash()-> HASH ● Do this 1,000,000 times ● Only store the FIRST plaintext and LAST hash – 17829: ...lots of iterations... :52a0a42bc3e1675eccb123b56ea5e3c8 – 15186: ...lots of iterations... :9dcf6acc37500e699f572645df6e87fc – 123037: ...lots of iterations... :0b4e7a0e5fe84ad35fb5f95b9ceeac79 ● Each of these chains actually contains 1,000,000 ->hash transitions ● Now do THAT 1,000,000 times ● Congratulations! You stored 1,000,000,000,000 combinations in the space of 1,000,000

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup <<< – Potential Problems ● Related Information

Looking Up a Password

● Hash the password – If one of your chains ends in the hash, you know the password was the last iteration of that chain. ● Reduce and rehash – If one of your chains ends in the hash, you know the password was the second to last iteration of that chain. ● Reduce and rehash – If one of your chains ends in the hash,... third to last ● Etc... 1,000,000 times

● Once you find a matching hash, simply walk that chain by hashing and reducing until you hit your password

● Congratulations! You just covered 1,000,000,000,000 combinations with only 1,000,000 hash cycles INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems <<< ● Related Information

Problem #1: Collisions

● When you go from a small plaintext to a large hash, it's unlikely that two plaintexts will produce the same hash.

● When you go from a large hash to a small plaintext, it's quite likely that two hashes will generate the same plaintext.

● Our chains will be constantly colliding (merging)

Why Are Collisions Bad?

● LOTS of duplicate work ● Chains will have to be very small ● Hard to detect ● End up throwing out lots of hard work

Varied Reduction Functions

● Reduce1(), reduce2(), reduce3(), repeat...

● Use them in sequence

● Lowers the chances of collision

● And if you represent each function with a color...

● That's why they call it a :)

Problem #2: Detecting Collisions

● Unfortunately, a few collisions WILL still occur ● We need to throw out those chains to achieve maximum efficiency ● How do we know if there has been a collision without wasting lots of CPU work?

Collision Detection Solution

● Stop each chain at a predefined point

● For example, when the first 8 characters are “0”

● Every time a chain ends, search the table for a match – If you find one, throw out the shorter chain ● Slightly more work = way better efficiency

● Remember: your chains are different lengths, so you need to search up to the

specific chain length Rainbow Table Drawback #1

● You must do extra work up front – You will inevitably hash more than the keyspace

● Collisions ● Duplicates – However, once the rainbow table has been generated, the work pays off

Rainbow Table Drawback #2

● You will never cover 100% of your keyspace – Good design allows in the >=99.9% range – You WILL miss passwords here and there – The exact numbers and probability can be estimated.

Rainbow Table Downside #3

● Doesn't work for salted hashes :( – Because, two of the same password will generate different hashes ● Breaks our predictable keyspace ● Breaks our chains ● Breaks everything ● PSA: If you store other people's passwords, please make sure they are hashed AND salted!

INDEX

● Hash Functions

● Cracking Hashes – CPU/GPU Bruteforce – Precomputed Dictionaries ● Rainbow Tables – Reduction Functions – Table Generation – Hash Lookup – Potential Problems ● Related Information <<<

Other Resources

● https://freerainbowtables.com/ – Distributed rainbow table generation

● Help out! Donate some CPU cycles! – rcracki_mt: Multi-threaded rainbow table lookup – Lots of tables available for free download

● MD5 / SHA1 / LM / NTLM ● Bittorrent downloads are lightning fast – Will ship you the same tables on HDD (for $)

● Total of about 12 TB ● $1,200

Other Great Information

● http://kestas.kuliukas.com/RainbowTables/

● http://stichintime.wordpress.com/2009/04/09/rai nbow-tables-part-1-introduction/

● https://www.freerainbowtables.com/en/faq/

EOF

● Thanks! ● Questions? ● Comments? ● Andrew Kramer – Dakota State University ● [email protected]