pierce403 / roboform-wordlists

Project to generate wordlists for old roboform RNG
Apache License 2.0
5 stars 1 forks source link

roboform-wordlists

Project to generate wordlists for the old roboform RNG.

RoboForm is a password management tool, and about 10 years ago it had a bug in it that would cause the RNG to be seeded with system time. This project is an effort to generate wordlists to help people recover encrypted media from that era that might be otherwise lost, and to accurately measure the impact of this issue.

Based on work done by Joe Grand et al.

https://www.youtube.com/watch?v=o5IySpAkThg
https://grandideastudio.com/portfolio/security/roboform-password-regeneration/
https://grandideastudio.com/media/roboform_notes.pdf
https://grandideastudio.com/media/roboform_wrapper_source.zip
https://www.wired.com/story/roboform-password-3-million-dollar-crypto-wallet/
https://web.archive.org/web/20130807185324/http://www.roboform.com/dist/RoboForm-Setup.exe

Summary of Previous Research

The main problem is that in very old versions of roboform, entropy was set with system time. Using this information, wordlists can be generated. The existing tooling will set windows time, then loads the DLL for word generation, and generates the password, and the process repeats. This generates about ~30 words per second in the initial testing environment. The bottleneck appears to be disk io on system time getting set.

Ideas for Future Research

Live DLL Patching Solution

The current solution that seems to be working great is a couple slight tweaks to the original code from Joe and Bruno. This new code makes two live patches to the DLL in memory, so the official DLL supplied by RoboForm can be used with no edits. The full code for this can be seen in tools/RoboFormWrapper-hax.cpp. To compile it, download Joe's original build zip linked above, and replace the wrapper with the new code. The new code will also look for the DLL in the current directory, so be mindful of that as well.

There are two main optimizations being patched in. The first replaces the call to time64 with code that simply returns a number sitting on the stack, so you can pass in the timestamp that you want to generate for (seen on lines 256-257). The second (on line 230) nops out the code that re-seeds the RNG on each run, so the DLL doesn't need to be unloaded and reloaded after each generation.

With these tweaks it appears we can generate wordlists several orders of magnitude faster than the original code, but more extensive benchmarking might be useful.

Wordlists to Generate

The highest priority generation would be wordlists from the era where this bug was active, using default settings, and then using likely tweaks to the settings.

RoboFlayer

Check out RoboFlayer for details on the brainwallet testing: https://github.com/pierce403/roboform-wordlists/tree/main/roboflayer