Pat to Pass
本月的BruCON 5x5项目源于我在发布Passpat后朋友提出的一个想法。Passpat通过分析密码中的键盘模式来识别规律,而Pat to Pass几乎相反——它通过观察按键序列尝试将其转换为潜在密码。当前版本更多是概念验证和示例代码,希望有更擅长处理海量数据的人能将其发展为实用工具。
技术场景与应用
假设你看到某人输入密码:右手、左手、左、左、左、右、左、左,最后是左手数字。密码可能是什么?[1] 将该序列输入Pat to Pass后,它会生成所有可能的密码组合列表。虽然列表极长(11151515151115156 = 8,269,593,750条),但至少提供了起点。
更简单的6字符密码(左右手均匀分布)会生成约450万条更易管理的词表。这些列表可用于离线暴力破解(尤其是弱哈希算法),但若需在线暴力破解或手动攻击,则需进一步缩小范围——此时需引入Levenshtein距离算法。
Levenshtein距离优化
Levenshtein距离指将词1转换为词2所需的最小单字符编辑次数(例如"abc"到"abd"距离为1,“abc"到"def"距离为3)。由于人们常选择接近字典词的密码,通过将主算法生成的随机词与真实词典对比并过滤超出容差的结果,最终列表会大幅缩减且更实用。测试中,我基于"password"的按键序列生成潜在词,仅通过输出即可轻松识别原词。
尽管处理海量数据需大量优化才能完全实用,我仍发布此脚本,因它颇具启发性,期待有人能挑战将其发展为实用工具。
安装与使用
该应用基于Ruby 1.9.x和2.0.x编写测试,需安装额外gem:
|
|
安装后运行脚本获取完整指令:
|
|
输出示例:
|
|
键盘模式定义
模式以引号字符串传递,键盘位置由以下字符定义:
- l = qwertasdfgzxcvb(左区)
- tl = qwert(左上)
- ml = asdfg(左中)
- bl = zxcvb(左下)
- r = yuiophjklnm(右区)
- tr = yuiop(右上)
- mr = hjkl(右中)
- br = nm(右下)
- nl = 123456(左数字)
- nr = 7890(右数字)
例如,“love"可表示为"r,r,l,l"或更精确的"mr,tr,bl,tl”。越精确的模式生成词越少,运行越快。若观察到具体字符,可用”#“指定(如"l,r,l,#1"代表密码"god1"的末字符)。非英式键盘需修改脚本顶部的映射表。
高级功能
- Levenshtein检查需通过
--dictionary传递词典,容差通过--lev-distance设置(注意:每个生成词都会与词典全词对比,建议使用极简词典)。 - 默认输出到屏幕,可通过
--output重定向到文件。 - 可选择基础循环或递归算法(两者速度相近,默认即可)。
下载与反馈
下载Pat to Pass 1.0版,或通过GitHub提交补丁。欢迎提交性能优化补丁——我有一些想法但时间有限,若有兴趣可联系讨论。
致谢
Pat to Pass是BruCON 5x5项目赞助工具之一。[1] 文首序列对应全球最常见密码之一:password1。