Pat to Pass
本月的BruCON 5x5项目源于我发布Passpat后朋友的一个想法。Passpat获取密码并尝试发现其中的键盘模式,而Pat to Pass几乎相反,它获取观察到的按键并尝试将其转换为潜在密码。当前状态的项目更多是一个概念验证和示例代码,希望有更擅长处理超大数据列表的人能将其发展为实用工具。
场景应用
假设你看到某人输入密码,发现是右手、左手、左、左、左、右、左、左,然后是一个左手数字。密码可能是什么?[1] 如果将这个序列输入Pat to Pass,它会生成所有潜在选项的列表。这将是一个非常长的列表:11151515151115156 = 8,269,593,750,但至少这是一个起点。
一个更简单的密码,只有六个字符且左右手平均分配,会生成一个约450万条目的更易管理的单词列表。
这些列表可能适用于离线暴力破解攻击,特别是针对较弱哈希算法的情况。但如果你想尝试在线暴力破解甚至手动攻击,则需要进一步缩小范围,这时Levenshtein距离就派上用场了。
Levenshtein距离算法
Levenshtein距离是将单词一转换为单词二所需的单字符更改次数。例如,“abc"到"abd"的距离为1,“abc"到"def"的距离为3。这在这里很有用,因为大多数人倾向于选择接近字典单词的密码。因此,通过将主算法生成的看似随机的单词与真实单词进行比较,并过滤掉超出给定容差范围的单词,最终生成的列表将小得多,因此更有用。在测试中,我基于单词"password"的按键生成了潜在单词,仅通过查看输出就很容易发现"password"是原始单词。
由于处理大量数据的速度问题,需要对此脚本进行相当多的优化才能使其完全实用,但我发布它是因为我觉得它很有趣,并希望其他人能接受挑战,将其打造成实用工具。
安装/使用
该应用程序在Ruby 1.9.x和2.0.x中编写和测试。
需要安装一个额外的gem:levenshtein-ffi。可以通过以下命令安装:
|
|
安装后,可以运行脚本获取完整说明:
|
|
输出显示: Pat to Pass 1.0 Robin Wood (robin@digininja.org) (www.digininja.org)
用法: pat_to_pass [选项] … 模式 –help, -h: 显示帮助 –disp-keys: 显示模式选项 –output, -o: 输出到文件 –dictionary, -d: 用于Levenshtein测试的字典 –lev-distance: Levenshtein距离容差,默认3 –recursive: 使用递归算法而非基本循环
模式: 生成单词的模式
示例模式: l,r = 左手后接右手 mr,tl = 中右后接左上 #q,tr,l,l,#1 = 字符q后接右上,然后左、左和字符1
使用–disp-keys查看完整的模式选项列表。
警告 - 长模式需要很长时间运行,可能数年,因此从小模式开始(4-5个字符)并逐步增加。
模式作为带引号的字符串传递,键盘上的位置由以下字符之一定义:
|
|
其中l是左,r是右,t、m和b是上、中、下。
例如,单词"love"可以是"r,r,l,l"或更具体的"mr,tr,bl,tl”。你越具体,脚本运行越快,因为要生成的单词更少。
如果发现确切字符,可以使用#符号指定它们。例如,如果发现密码"god1"的最后一个字符,可以输入"l,r,l,#1”。同样,越具体越好。
如果想使用非英国键盘布局,则需要编辑脚本。映射在文件顶部,应该很容易更改为本地布局。
如果想为Levenshtein检查提供字典,则通过–dictionary参数传入,显示的匹配容差通过–lev-distance设置。这里需要考虑的是,应用程序生成的每个单词都将与字典中的每个单词进行测试,因此建议使用非常小的字典,理想情况下只有四五个单词。进行侦察并选择最符合目标的单词。
默认情况下输出发送到屏幕,但可以通过–output参数定向到文件。
最后一个选项是使用基本循环还是递归,这定义了用于生成单词的内部算法。在我的测试中,两者的运行速度大致相同,并且具有相同的故障点,因此,除非有充分的理由更改,否则保留默认设置。我编写了两种不同的方式以尝试提高性能,但即使两者似乎都没有更好,我认为值得包含它们,以防其中一种更容易被他人接手和改进。
下载
下载Pat to Pass版本1.0
如果想提交补丁,也可以在GitHub上找到源代码。
反馈/待办事项
请随时提交补丁以提高性能,我有一些想法但没有太多时间处理,因此如果你有兴趣,请联系我,我很乐意讨论。
感谢BruCON
Pat to Pass是由BruCON 5x5项目赞助的工具之一。
[1] 该特定序列是世界上最流行的密码之一:password1。