postmodern<p>If a password is manually typed in, it is probably going to be a combination of a few common words, and maybe some random numbers on the end, and maybe a random deliminator character between the words/numbers. For that purpose you can just do a cartesian product of multiple wordlits, a list of numbers/years, and an array of symbol characters. This can be done using the Ruby <a href="https://postmodern.github.io/blog/2022/01/23/enumerating-xkcd-style-passwords-with-ruby.html" rel="nofollow noopener" target="_blank">wordlist</a> <a href="https://github.com/postmodern/wordlist.rb#examples" rel="nofollow noopener" target="_blank">library</a> and <a href="https://github.com/postmodern/wordlist.rb#synopsis" rel="nofollow noopener" target="_blank">CLI</a>. Do you suspect they did any "leet speak" character substitutions? Both the <code>wordlist</code> library and CLI supports enumerating over every possible substitution mutation of every generated word.</p><p>If a password is generated by a password manager, than all you need to do is pick a character set (usually visible ASCII characters), and generate all strings of a range of lengths. This can be done using using the Ruby <a href="https://github.com/postmodern/chars.rb#readme" rel="nofollow noopener" target="_blank">chars</a> library (ex: <code>Chars::VISIBLE.strings_of_length(10..14).each { |password| ... }</code>).<br><a href="https://infosec.exchange/tags/wordlists" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>wordlists</span></a> <a href="https://infosec.exchange/tags/ruby" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>ruby</span></a> <a href="https://infosec.exchange/tags/pentesting" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>pentesting</span></a></p>