OMEN 是一个用 C 语言编写的基于马尔可夫模型的密码猜测器。它根据密码候选的出现概率生成候选密码,即优先输出最可能的密码。OMEN 在猜测速度上显著优于现有方案。 如果您对 OMEN 如何改进现有基于马尔可夫模型的密码猜测方法的细节感兴趣,请参阅 OMEN: Faster Password Guessing Using an Ordered Markov Enumerator。
OMEN 由两个独立的程序模块组成:createNG 和 enumNG。createNG
根据给定的密码列表计算 n-gram 概率并将其存储
在硬盘上。基于这些概率,enumNG 按正确的顺序(降序)枚举新的
密码。
使用较新的 Linux 版本,确保已安装 git(Git 版本控制系统)、gcc(GNU 编译器集合)和 make(GNU Make)。在 Ubuntu Linux 下可以通过以下命令安装:
$ sudo apt-get install build-essential git
通过以下命令检出源代码:
$ git clone https://github.com/RUB-SysSec/OMEN.git OMEN
切换到新创建的目录 OMEN 并运行:
$ make
如果编译成功,您可以在当前目录中找到 createNG 和 enumNG。
.
├── alphabetCreator
├── createNG
├── docs
│ ├── CHANGELOG.md
│ ├── LICENSE
│ └── screenshots
├── enumNG
├── evalPW
├── makefile
├── README.md
└── src
├── alphabetCreator.c
...
如果您愿意,现在可以删除 src 文件夹和 makefile 文件,它们不再被使用。
可以在此处找到在 Windows 10 上使用 Cygwin 的简短安装指南。
在生成任何密码之前,必须使用 createNG 估计 n-gram 概率。要使用默认设置计算概率,必须调用 createNG 并给出应训练的密码列表路径:
$ ./createNG --iPwdList password-training-list.txt
给定列表中的每个密码必须占一行。该模块随后
读取并评估该列表,生成若干文件。除了存储所用设置(在本例中为默认设置)的配置文件(createConfig)外,还会创建若干包含 gram 和密码长度信息的文件。这些文件的扩展名为 '.level':
每个 n-gram 和长度的概率被映射到 0
(最可能)到 10(最不可能)之间的级别。一旦这些文件创建完成,就可以使用 enumNG 生成按概率排序的密码列表。目前,enumNG 支持三种操作模式:file、stdout、simulated plaintext attack。在 enumNG 的默认模式下,会基于这些级别创建密码猜测列表。使用命令
$ ./enumNG
生成 10 亿个密码并将它们存储在文本文件中,该文件可以在
'results' 文件夹中找到。此文件中的密码按级别(即按
概率)排序。由于常见的文本编辑器无法处理如此巨大的文件,
建议在测试时减少生成的密码数量。这
可以通过参数 -m 完成。
$ ./enumNG -m 10000
它将仅创建一个包含 10,000 个密码的有序列表。如果您有兴趣将密码打印到标准输出(stdout)流,请使用参数 -p。
$ ./enumNG -p -m 10000
如果您有兴趣针对明文密码测试集评估猜测性能,请使用参数 -s。请注意:在此模式下,OMEN 受益于结合实时反馈的自适应长度调度算法,而该算法在 file 和 stdout 模式下不可用(由于缺少反馈通道)。
$ ./enumNG -s=password-testing-list.txt -m 10000
此评估的结果可以在 'results' 文件夹中找到。
两个模块都提供帮助对话框,可以使用 -h 或 --help 参数显示。
如何从 $2a$10$HNYF4KajSTqxIP/KoiB5tOCVeKUgvscTh32hhAmppFk4T/USmI2B. 得到 "GoodOMEN!123"?
OMEN 是为学术用例开发的,例如改进概率密码建模、估计猜测次数或密码强度,总体而言是为了提高密码安全性。请勿滥用此软件来侵犯他人隐私或违反法律。
流行的哈希评估器如 Hashcat 和 John the Ripper 支持数百种 哈希和密码格式,并且由于它们支持通过标准输入(stdin)流读取密码候选,因此可以轻松集成。
$ ./enumNG -p -m 10000 | ./hashcat64.bin ...
或
$ ./enumNG -p -m 10000 | ./john --stdin ...
为获得最佳猜测性能,请考虑使用与您想要破解的密码分布相似的密码分布来训练 createNG。
请注意:一般而言,使用概率密码建模来破解密码只应考虑针对慢哈希(例如 bcrypt、PBKDF2、scrypt 或 Argon2),此时可行的猜测次数有限,或者用于非常有针对性的攻击。相反,对于非常快的哈希(MD5、SHA-1 或 NTLM),使用好的字典和变形规则(例如 best64.rule)才是正确的方法。
如果您对此主题感兴趣,请考虑阅读以下论文及其相关工作(此列表不完整,您可以通过扩充它来提供帮助):
概率上下文无关文法
马尔可夫模型
神经网络
混合方法
方法比较
两个模块都提供若干命令行参数,用于选择各种
可用模式并更改默认设置。例如,在 createNG 过程中创建的概率
分布可以通过选择一种受支持的平滑函数、n-gram 大小或所使用的
字母表来操纵。createNG 的所有可用参数、简短描述和默认值可以通过使用 -h 或 --help 调用程序来查看。enumNG 也是如此,例如,可以选择枚举模式、所使用的长度调度算法(仅在 -s 模式下使用,参见 '基本用法' 部分)以及最大尝试次数。如果未给出枚举模式,则执行
默认模式,将所有创建的密码存储在
'results' 文件夹中的文本文件中。
OMEN+ 基于 When Privacy Meets Security: Leveraging Personal Information for Password Cracking, 是 OMEN 的附加功能(在同一二进制文件中实现)。使用有关用户的额外个人信息(例如,密码提示或从社交网络抓取的个人背景信息)可能有助于加速密码猜测过程(类似于 John the Ripper 的 'Single crack' 模式)。
因此,必须在单独的文件中提供相关提示或若干提示(以制表符分隔)。此外,还需要一个 alpha 文件,其中包含相应的 alpha 值(在一行中以制表符分隔)。Alpha 值用于加权所提供提示的影响。重要的是,对于 一行中的每个提示,必须在 alpha 文件中指定一个 alpha。这些 alpha 的顺序必须与每行提示的顺序相同。
例如,我们想要猜测密码 "Mary'sPW2305"。提示文件中包含名字、用户名、出生 日期和电子邮件地址的相应行如下所示:
mary mary1 19880523 [email protected]
alpha 文件应按照与提示文件相同的顺序排列名字、用户名、 出生日期和电子邮件地址的相关 alpha 值。例如:
1 2 1 2
要使用 OMEN+,必须调用 enumNG 并给出提示文件和 alpha 文件的路径:
$ ./enumNG -H hint-file.txt -a alpha-file.txt

平滑函数通过配置文件(createConfig)进行选择和配置。
该文件必须包含平滑函数的名称,并且可以包含
任何可变参数的值。该文件的格式应如下:
<name>
-<parameter>_<target> <value>
...
目前,唯一支持的平滑函数是 none 或 additive 平滑。
允许的参数(<parameter>)为:
允许的目标(<target>)为:
注意,为单个目标设置的值会覆盖为所有目标设置的值。
add1(250)(加性平滑(δ=1),级别调整因子为 250)平滑设置的示例:
additive
-delta_all 1
-delta_LN 0
-levelAdjust_all 250
-levelAdjust_CP 2
-levelAdjust_LN 1
除了两个主模块 createNG 和 enumNG 之外,OMEN 还提供另外两个
程序模块:evalPW 和 alphabetCreator。evalPW 评估给定的
密码,alphabetCreator 根据给定密码列表创建包含最频繁
字符的字母表。这两个模块应被视为实验性的。
它读取给定的密码并通过返回密码级别来评估其强度。结果基于 createNG 生成的级别。密码级别是每个
出现的 n-gram 级别的总和,基于级别列表 IP、CP 和 EP。evalPW 的当前
实现只是一个原型,不支持全部
可能的功能,并且包含大量错误。例如,实际密码长度不影响密码级别。因此,只能比较长度相同的密码。
$ ./evalPW --pw=demo123
如果您想将 OMEN 限制为符合给定字母表的密码,可以在配置文件(createConfig)中指定。要确定最有希望的字母表,alphabetCreator 可能能够帮助您。该程序模块根据给定的密码列表创建新的字母表。新字母表的字符按其在密码列表中的频率排序,从最高频率开始。字母表的长度是可变的。创建的字母表基于 ISO 8859-1 的 8 位 ASCII 表
(不允许 '\n'、'\r'、'\t' 和 ' '(空格))。
不属于此表的字符将被忽略。此外,现有
字母表可以用最频繁的字符进行扩展。