Cracking WordPress passwords with 20 lines of Go
frenxi.com
frenxi.com
The original title is actually “WordPress passwords, explained and cracked”.
It seems Frenxi —the author— added “… with 20 lines of Go” in the post submission simply to appeal to the masses of Hacker News who often upvote links based on keywords more than the content of the article. Per the Hacker News Guidelines [1] → “[…] please use the original title, unless it is misleading or linkbait; don't editorialize.”
Go has nothing to do here except the author decided to write the brute force password cracker in it. The program could have been written in any other programming language without losing anything. Honestly, I am disappointed. They didn’t even try to make an interesting cracking program, the program doesn’t even have goroutines which one would expect from a tool that is trying to brute force a solution.
Worse algorithms can offer the possibility of an exciting optimisation, especially for bulk cracking (e.g. Microsoft's LanMan Hash) - but that's not happening here.
In the case of this algorithm you could get a boost by vectorising to run on a GPU, memory hard pessimisation defeats that and this password hash doesn't offer it, again this Go program doesn't do that either.
For any human memorable password scheme, "Guess until you get lucky" is potentially viable and that's all this does, so it's almost the least interesting case.
In terms of performance --
> At the moment, it processes 100K attempts in about 2 minutes on a small VPS.
It is a bit hard to compare performance without knowing what the `hashloop` parameter was set to for each attempt for that benchmark. Assuming that the hashloop parameter is set to `8192` aka `(1 << strings.Index(itoa64, "B"))` as in the blog post, then this approach is computing about 6.83 md5 mega-hashes (MH) / sec.
For a 30,000x speedup for brute forcing md5: hashcat + 8x GPUs can hit something like 200 GH / sec of md5:
https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a27...
> The approach of using multiple iterations to purposefully increase the computational cost of testing a password
The author has shown that a hashing function can be attacked by using a dictionary attack... well, yes, of course. But the library is not inherently weak just because of that. Yes, you can write it in 20 lines of Go but -- you'd need to benchmark the attack against other hashes. Just because the md5() primitive is used as part of the algorithm doesn't make the whole shebang weak.
The question always is how long it takes to find clear text which gets hashed to a certain value.
The post is just supposed to be a plain-text explanation of WordPress hashes, and the script is an explanatory POC.
As I mentioned, of course, there are more solid solutions out there but that's not the point.
Regarding the title, it was not supposed to be a clickbait. I just changed it to a more appropriate one :)
Hope you can take something good out of it.
Cheers, everybody!
oh wow, i guess that would've taken years to execute had i written it in c#.
Doesn’t password_hash() use bcrypt by default? Why not use it?