Cracken 是一个快速的密码字典生成器、智能列表创建和密码混合掩码分析工具,完全使用安全的 Rust 编写(更多信息请参见 talk/)。受 maskprocessor、hashcat、Crunch 以及 🤗 HuggingFace 的 tokenizers 等优秀工具的启发。
在 DeepSec2021 上,我们提出了一种新方法,通过利用 NLP tokenizers 分析密码中的常见子字符串,将密码作为混合掩码进行分析(更多信息请参见 talk/)。
我们的方法将密码拆分为子词,而不仅仅是字符掩码。例如,HelloWorld123! 被拆分为 ['Hello', 'World', '123!'],因为这三个子词在其他密码中非常常见。
?w1?w2?l?d)
完整表格请见 此处
混合掩码 非常非常快 🦸⚡💨(参见 性能 部分)智能列表 - 从给定密码文件中提取的紧凑且具有代表性的子词列表(使用 🤗 HuggingFace 的 tokenizers)混合掩码 - 建立统计数据以获取更好的密码候选(同样非常快)cracken -w rockyou.txt -w 100-most-common.txt '?w1?w2?d?d?d?d?s'hashcat、john 或你喜欢的密码破解工具cracken createcracken entropy混合掩码 快速生成密码候选 - cracken generate -i hybrid-masks.txt更多细节请参见 使用方式 部分
下载(目前仅限 Linux): 最新发布版 🔗
更多安装选项请参见 安装 部分
运行 Cracken:
生成长度为 8 的所有单词,以大写字母开头,后跟 6 个小写字母,然后是一个数字:
$ cracken -o pwdz.lst '?u?l?l?l?l?l?l?d'
从两个字典列表生成单词,并附加年份后缀 (1000-2999) <名字><姓氏><年份>
$ cracken --wordlist firstnames.txt --wordlist lastnames.lst --charset '12' '?w1?w2?1?d?d?d'
从 rockyou.txt 提取的子词中创建大小为 50k 的智能列表
$ cracken create -f rockyou.txt -m 50000 --smartlist smart.lst
使用智能列表估计密码 HelloWorld123! 的混合掩码熵值
$ cracken entropy -f smart.lst 'HelloWorld123!'
混合最小拆分:["hello", "world1", "2", "3", "!"]
混合掩码:?w1?w1?d?d?s
混合最小熵值:42.73
--
字符集掩码:?l?l?l?l?l?l?l?l?l?l?d?d?d?s
字符集掩码熵值:61.97
截至撰写本文时,Cracken 可能是世界上最快字典生成器:
Cracken 的性能比 hashcat 的快速 maskprocessor(用 C 编写)高出约 25%。
Cracken 每核心每秒可生成约 2 GB 数据。
更多细节请参见 benchmarks/ 🔗
为什么速度很重要?一个典型的 GPU 每秒可以测试数十亿个密码(取决于密码哈希函数)。如果字典生成器每秒产生的单词数少于破解工具的处理能力,破解速度将会下降。
Cracken 使用 A* 算法非常快速地分析密码。它能够以约 10万个密码/秒 的速度找到密码文件的最小混合掩码(cracken entropy -f words1.txt -f words2.txt ... -p pwds.txt)
安装 Cracken 或从源码编译
从 releases 🔗 下载最新发布版
Cracken 使用 Rust 编写,需要 rustc 进行编译。Cracken 应支持 Rust 支持的所有平台。
安装说明请参见 cargo 🔗
有两种从源码构建的方式——使用 cargo 从 crates.io 安装(推荐)或手动从源码编译。
使用 cargo 安装:
$ cargo install cracken
克隆 Cracken:
$ git clone https://github.com/shmuelamar/cracken
构建 Cracken:
$ cd cracken
$ cargo build --release
运行:
$ ./target/release/cracken --help
$ cracken --help
Cracken v1.0.0 - 一个快速的密码字典生成器
用法:
cracken [子命令]
选项:
-h, --help 打印帮助信息
-V, --version 打印版本信息
子命令:
generate (默认)根据给定的掩码和字典文件生成以换行分隔的单词
create 从输入文件创建新的智能列表
entropy
计算密码或密码文件的估计熵值。
密码的熵值是密码密钥空间大小的 log2 值。
有两种密钥空间大小估计方式:
* mask - 每个字符的密钥空间(数字=10,小写字母=26...)
* hybrid - 查找最小拆分为子词和字符集。
运行 cracken <子命令> --help 获取特定子命令帮助
使用示例:
## 生成子命令示例:
# 从 00000000 到 99999999 的所有数字
cracken ?d?d?d?d?d?d?d?d
# 从 0 到 99999999 的所有数字
cracken -m 1 ?d?d?d?d?d?d?d?d
# 带有 pwd 前缀的单词 - pwd0000 到 pwd9999
cracken pwd?d?d?d?d
# 所有长度为 8 的密码,以大写开头,后跟 6 个小写字母,再一个数字
cracken ?u?l?l?l?l?l?l?d
# 同上,将输出写入 pwds.txt 而不是标准输出
cracken -o pwds.txt ?u?l?l?l?l?l?l?d
# 自定义字符集 - 所有十六进制值
cracken -c 0123456789abcdef '?1?1?1?1'
# 4 个自定义字符集 - 顺序决定字符集的 ID
cracken -c 01 -c ab -c de -c ef '?1?2?3?4'
# 4 个小写字母,后跟年份 2000-2019 后缀
cracken -c 01 '?l?l?l?l20?1?d'
# 以字典中的名字开头,后跟 4 位数字
cracken -w firstnames.txt '?w1?d?d?d?d'
# 以字典中的名字开头,后跟字典中的姓氏,最后以符号结尾
cracken -w firstnames.txt -w lastnames.txt -c '!@#$' '?w1?w2?1'
# 多次重复使用字典并组合字符集
cracken -w verbs.txt -w nouns.txt '?w1?w2?w1?w2?w2?d?d?d'
## 创建智能列表子命令示例:
# 从单个文件创建智能列表到 smart.txt
cracken create -f rockyou.txt --smartlist smart.txt
# 从多个文件使用多种分词算法创建智能列表
cracken create -t bpe -t unigram -t wordpiece -f rockyou.txt -f passwords.txt -f wikipedia.txt --smartlist smart.txt
# 创建智能列表,子词最小长度为 3,纯数字子词最大长度为 6
cracken create -f rockyou.txt --min-word-len 3 --numbers-max-size 6 --smartlist smart.txt
## 熵值子命令示例:
# 估算密码的熵值
cracken entropy --smartlist vocab.txt 'helloworld123!'
# 估算密码文件的字符集掩码熵值(默认为混合模式)
cracken entropy --smartlist vocab.txt -t charset -p passwords.txt
# 估算密码文件的熵值
cracken entropy --smartlist vocab.txt -p passwords.txt
cracken-v1.0.0 linux-x86_64 编译器:rustc 1.56.1 (59eed8a2a 2021-11-01)
更多信息请访问:https://github.com/shmuelamar/cracken
$ cracken generate --help
cracken-generate
(默认)根据给定的掩码和字典文件生成以换行分隔的单词
用法:
cracken generate [选项] <掩码> --masks-file <掩码文件>
选项:
-h, --help
打印帮助信息
-s, --stats
打印此命令将生成的单词数量并退出
-V, --version
打印版本信息
选项:
-c, --custom-charset <自定义字符集>...
自定义字符集(字符串)。最多 9 个自定义字符集 - ?1 到 ?9。在掩码中使用 ?1 表示第一个字符集
-i, --masks-file <掩码文件>
包含要生成的掩码的文件
-x, --maxlen <最大长度>
掩码的最大起始长度
-m, --minlen <最小长度>
掩码的最小起始长度
-o, --output-file <输出文件>
写入字典的输出文件,默认为标准输出
-w, --wordlist <字典列表>...
包含以换行 (0xA) 分隔的单词的文件。注意:当前所有字典列表都会加载到内存
参数:
<掩码>
要生成的字典掩码。
可用的掩码有:
内置字符集:
?d - 数字:"0123456789"
?l - 小写字母:"abcdefghijklmnopqrstuvwxyz"
?u - 大写字母:"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
?s - 符号:" !\"\#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
?a - 所有字符:?d + ?l + ?u + ?s
?b - 所有二进制值:(0-255)
自定义字符集 ?1 到 ?9:
?1 - 通过 --charset 'mychars' 指定的第一个自定义字符集
字典列表 ?w1 到 ?w9:
?w1 - 通过 --wordlist 'my-wordlist.txt' 指定的第一个字典列表
$ cracken create --help
cracken-create
从输入文件创建新的智能列表
用法:
cracken create [选项] --file <文件>... --smartlist <智能列表>
选项:
-h, --help 打印帮助信息
-q, --quiet 禁用进度条打印
-V, --version 打印版本信息
选项:
-f, --file <文件>... 输入文件名,可以为多个文件多次指定
--min-frequency <最小频率> 单词的最低频率,仅与 BPE 分词器相关
-l, --min-word-len <最小单词长度> 过滤短于指定长度的单词
--numbers-max-size <数字最大长度> 过滤长于指定长度的纯数字单词
-o, --smartlist <智能列表> 输出智能列表文件名
-t, --tokenizer <分词器>... 使用的分词器,可以多次指定。
可选值:bpe, unigram, wordpiece [默认:bpe] [可能的值:bpe, unigram, wordpiece]
-m, --vocab-max-size <词汇表最大大小> 最大词汇表大小
$ cracken entropy --help
cracken-entropy
计算密码或密码文件的估计熵值。
密码的熵值是密码密钥空间大小的 log2 值。
有两种密钥空间大小估计方式:
* mask - 每个字符的密钥空间(数字=10,小写字母=26...)
* hybrid - 查找最小拆分为子词和字符集。
用法:
cracken entropy [选项] <密码> --smartlist <智能列表>...
选项:
-h, --help 打印帮助信息
-s, --summary 输出密码熵值的摘要
-V, --version 打印版本信息
选项:
-t, --mask-type <掩码类型> 输出的掩码类型,可选:charsets(仅字符集),hybrid(字符集+字典列表)[可能的值:hybrid, charset]
-p, --passwords-file <密码文件> 以换行分隔的密码文件,用于估算熵值
-f, --smartlist <智能列表>... 用于估算熵值的智能列表输入文件,以换行分隔的文本文件
参数:
<密码> 要估算的密码
Cracken 采用 MIT 许可证。本项目仅可用于合法目的 ⚖️
Cracken 正在积极开发中,如果你希望提供帮助,下面是本项目的部分路线图。 欢迎提交 PR 和开启 Issues。