gorilla 是一款终极词表工具,集成了许多实用功能:
安装 Rust 的 Cargo 后,运行 cargo install --git https://github.com/d4rckh/gorilla --branch main
现在你应该可以运行 gorilla --help
cargo build --release
# 二进制文件将位于 target/release 文件夹中
--from-pattern/-p 参数用于告诉 gorilla 基于模式计算密码。
例如,以下命令将打印包含 5 个小写字母的每个单词。
gorilla --from-pattern "{a-z}{a-z}{a-z}{a-z}{a-z}"
其他模式示例:administrator{0-9}(administrator0 -> administrator9);hello_world{a-z}{0-9}(hello_worlda0 -> hello_worldz9)。
如果要将输出保存到文件,可以使用 --output-file/-o 参数。

Gorilla 现在还支持字符集。它们在 src/char_sets.rs 中定义。以下是一些使用它们的模式示例:{l} => a b c d ... z;{u} => A B C D ... Z;{d} => 1 2 3 4 ... 9;{s} => (空格) ! " # $ ... ~。你可以组合多个字符集,因此 {luds} 将得到一个包含所有其他已描述字符集的字符集(#45)。
如果使用范围且两端各有 1 个字符,则执行字符范围。例如:
{a-z} 将依次添加字母表中的每个字符:a, b, c, d, e, f, g,...., x, y 和 z;{a-c} 将只依次添加 a、b 和 c;{0-9} 将只依次添加 0, 1, 2, 3, 4, 5, 6, 7, 8, 9。
如果使用范围且其中一端有多个字符,则每一端将被解析为无符号 32 位数字,并生成数字范围。例如:{2020-2026} 将依次添加 2020, 2021, 2022, 2023, 2024, 2025 和 2026。{1-100} 将依次添加 1 到 100(含)的数字。实验性:如果括号内部包含逗号,字符串将按逗号拆分并依次添加每个部分,例如 {Jan,Feb,Mar} 将依次添加 Jan、Feb 和 Mar。
可选地,你可以使用 --pattern-threads 参数生成多个模式线程。我建议你将其设置为计算机上可用的最大线程数。
通过命令行参数,你可以执行任何受支持的变异,但仅限于 1 组变异。变异组是应用于一个单词的一组变异。通过 CLI,变异通过 --mutation/-m 参数提供。
gorilla --from-pattern "administrator" --mutation "prepend:_"

通常在这种情况下,你会想使用 --from-file/-i 参数而不是 --from-pattern 来指定一个词表而不是单个单词,但为了简单起见,我将使用它。
上述命令接收 1 个单词并输出 1 个单词:_administrator。你可以使用相同参数添加多个变异。
gorilla --from-pattern "administrator" \
-m "prepend:_" \
-m "append:{0-9}"
这又一次只接收 1 个单词,但将输出 10 个不同的单词。将 {0-9} 语法添加到 prepend 和 append 将生成多个单词。上述命令生成以下单词。
_administrator0
_administrator1
_administrator2
[.. 省略 ..]
_administrator8
_administrator9
如果我们通过 -i 文件提供一个词表,我们将得到该词表单词数乘以 10 的结果。
到目前为止,我们只应用了 1 组变异。通常你会想要组合多组变异。这通过 yaml 文件完成。你可以使用 --mutations-file/-f 参数指定一个文件。本仓库中的 sets/simple.yml 文件中有一个示例,内容如下:
name: simple
mutation_sets:
- [ nothing ] # => word
- [ reverse ] # => drow
- [ remove_last_letter ] # => wor
- [ remove_first_letter ] # => ord
- [ uppercase_all ] # => WORD
- [ "append:{0-9}" ] # => word1, word2, word3
- [ "2 append:{0-9}" ] # => word11, word22, word33
- [ "replace:o:0", "replace:a:4", "replace:e:3" ] # => w0rd, h3ll0

每个变异文件都必须有一个 name 和一个 mutation_sets 值,如示例所示。上述变异组将从单个单词生成另外 27 个单词。
administrator
administrator
rotartsinimda
administrato
dministrator
ADMINISTRATOR
administrator0
[.. 省略 ..]
administrator9
administrator00
[.. 省略 ..]
administrator99
4dministr4t0r
如果你想在使用前检查变异文件是否有错误,可以使用以下语法解析并打印摘要。
gorilla --mutations-file muts.yml
(目前)你只能抓取特定页面的单词。样式和脚本标签会自动移除。
你可以使用 --from-website/-w 参数指定页面。例如
gorilla --from-website https://example.org/

上述命令将打印该网站中的每个单词。你可以添加之前展示的其他参数,如 --mutations-file/-f、--mutation/-m,当然还有 --output-file/-o 来保存它们(而不是打印)。
你可以将一组变异应用于满足特定条件的单词。这仅在 yaml 文件中有意义。
以下变异文件将移除不包含字符串 admin 的单词。与之前的变异不同,这可以移除单词。
name: filtering_words
mutation_sets:
- [ "if_contains:admin" ]
另一个示例如下,它将仅向长度超过 5 个字符的单词添加下划线。
name: conditional_mutation
mutation_sets:
- [ "if_length:>5", "append:_" ],
- [ "! if_length:>5" ]
注意,我们必须添加另一个以第一个 if 变异的否定版本开头的变异组,否则长度小于 6 个字符的单词将被移除。
gorilla 支持许多其他变异,由于该工具处于早期开发阶段,在此维护它们的列表将非常痛苦。如果你对其他变异感到好奇,可以查看 src/mutation.rs 文件中的 Action 枚举。
格式通过 yaml 文件定义在格式化集合中,并通过 --from-formatting/-q 参数提供给 gorilla。目前只制作了一个格式化集合,位于 sets/formatting/basic_usernames.yml。它看起来(类似)这样。
name: basic_usernames
fields:
- [ f_name ]
- [ l_name ]
formatting_sets:
- [ "{f_name}_{l_name}" ]
- [ "{l_name}{f_name}" ]
- [ ["{f_name}", [1st_letter]], "_{l_name}" ]
- [ ["{f_name}", [1st_letter]], "{l_name}" ]
必需的字段是 name、fields 和 formatting_sets。fields 值是用户的资料,包含之后在 formatting_sets 中使用的信息。
如果你运行该集合,系统将提示你输入每个字段,并生成用户名。

注意:不要使格式化集合中的变异过于复杂,它们将全部单线程运行!将格式化文件与变异文件混合使用,以并行运行变异。不要在格式化集合的变异组中使用组合模式。
提示:你可以正常使用其他参数,如
--mutations-file/-f通过变异生成新单词,或--output-file/-o保存单词
每个格式化集合是一个字符串数组,之后会被拼接。因此 ["{f_name}", "{l_name}"] 等同于 ["{f_name}{l_name}"]。除了字符串,你还可以提供一个数组,这允许你应用之前用于扩展词表的变异。
- [ "{f_name}_", [ "{l_name}", [ reverse ] ] ]
如果 f_name 是 joe,l_name 是 doe,生成的格式化将产生 joe_eod。在格式化集合中有用的变异是 remove_last_letter、remove_first_letter 和 1st_letter。
如果你想将格式化集合应用于许多用户资料,可以使用 --with-csv/-c 参数提供一个 CSV 文件。对于 basic_usernames 格式化集合,CSV 格式应如下:
f_name,l_name
joe,doe
james,smith
robert,smith

>NUMBER/<NUMBER/=NUMBER)