www.678117.com
使用NLP生成个性化的Wordlist用于密码猜测爆破
发布日期:2019-10-04 23:30   来源:未知   阅读:

  我编写了一个名为Rhodiola的工具,该工具可以分析目标数据(例如目标的tweets),并检测其中最常用的主题,以此来构建一个用于密码猜测/暴破的个性化的Wordlist。这是一个为密码猜测攻击创建新方法的实验性项目。

  密码可以说是自互联网诞生以来,我们数字帐户的最主要的一种安全机制。因此,密码往往也是攻击者的首要目标之一。攻击者可以使用两种主要方法来查找目标的密码。攻击者可以事先准备好一个钓鱼网站,诱骗目标输入他们的密码到网站中。或者,攻击者可以通过暴破的方式强制执行密码猜测攻击。密码猜测攻击可以分为两大类:在线攻击和离线攻击。

  在线密码猜测攻击是攻击者将用户名/密码组合发送到HTTP,SSH等服务的地方,并尝试通过检查服务的响应来识别正确的组合。离线密码猜测攻击通常是针对散列形式的密码进行的。攻击者必须使用合适的加密散列函数计算密码的散列,并将其与目标散列进行比较。对于在线和离线攻击,攻击者通常都需要有一个密码wordlist。大多数Web应用程序都有密码复杂性规则,用户必须使用至少一个数字,大写/小写字母和特殊字符。此外还有许多预防措施,例如IP阻止,账户冻结等。因此,减少攻击次数对攻击者来说非常重要。

  掩码攻击是将暴破池减少到可接受大小的主要方法之一。掩码攻击是指指定一个固定的密码结构,并根据该结构生成候选密码。例如,使用纯暴破的方法破解“Julia1984”,我们需要计算13.537.086.546.263.552个不同的组合。但是如果我们设置一个具有其结构的掩码,我们可以将组合池减少到237.627.520.000。当然,这对于在线攻击来说仍然是个天文数字。通常我们是无法通过互联网向应用程序发送两千亿次请求的。

  但是,纯暴力攻击和掩码攻击并不是密码猜测的唯一方法。还有一种基于智能猜测的方法。例如,在Sherlock的Hound of Baskerville episode中,Sherlock Holmes一次就猜中了正确的密码。但在现实生活中我们怎么能做到呢?

  让我们假设以上是目标发送的tweet,而我们就是Sherlock Holmes。我们可以做出以下推断:目标的女儿叫Julia,并且目标非常爱她的女儿,因为他/她发布了关于她的推文。目标最喜欢的作家是George Orwell,他最受欢迎的书是1984。所以把它们组合起来,就是“Julia1984”,就这么简单?

  根据卡内基梅隆大学和卡尔顿大学的实验,大多数人都会根据个人爱好,工作,宗教,体育,电子游戏等主题来作为他们的密码组合。[1][2]这意味着大多数用户密码都包含有意义的单词,并且与密码的所有者相关。所以在理论上,我们可以成为一个密码破解的sherlock holmes。让我们来验证一下。

  当我们用PACK(密码分析和破解工具包)分析泄露的Myspace和Ashley Madison密码列表并生成最常用的掩码时,我们可以看到几乎95%的密码是由序列的字母字符组成的。所以这些词很有可能都是有意义的。以下是一些常见的掩码:

  由于Ashley Madison和Myspace的wordlists大多数都是由序列的字母字符组成,因此它们很有可能是有意义的单词。如果它们是有意义的,我们就可以使用有意义的词来填充掩码,而不是强制的暴力破解。第一步是了解字母序列在英语中是否是一个有意义的单词。如果字母序列在英语词典中列出,我们就可以说它是一个英语单词。我用Wordnet作为词典。分析显示,几乎百分之四十的单词列表都包含在Wordnet词典中,因此它们是有意义的英语单词。

  在确认Wordnet中包含字母序列后,因此它是一个英语单词,我们需要做词性标记(POS标记)。英语中有八大词类:名词、代词、动词、形容词、副词、介词、连词和感叹词。词性标注是将文本中的一个词标记为与特定词性相对应的过程。NLTK Python库用于POS标记。

  为了了解哪个词类在密码中出现的最多,我们再次分析了Myspace和Ashley Madison的wordlists。用于分析的脚本代码你可以在此处获取。结果显示大多为单数名词(约占32%)

  如果我们使用牛津英语词典中的所有单词,则组合池将为171,476。如果我们使用“?l?l?l?l?l?l”掩码暴破所有六字符字母的字符串,组合池将为308.915.776。 因此,尝试词典中的所有英语单词将比使用掩码快1801倍。但是对于在线仍然是一个很大的数字。

  那么让我们回顾一下迄今为止我们已掌握的事实。首先,我们的分析显示人们偏向使用有意义的单词作为他们的密码。第二,根据各大学的研究,我们知道密码主要基于个人主题。因此,Sherlock Holmes的方法在理论上是可行的。但这能在实践中做到吗?Sherlock Holmes所做的是分析关于目标的个人主题。然后,他将这些组合在一起并想出了一个候选密码。

  但在现实生活中我们能做到吗?为此,我们需要有关目标的信息和从该信息中提取出候选密码的算法。我们需要像Sherlock Holmes那样的目标数据源,我们可以找出目标的兴趣爱好和其他兴趣领域。显然,这些信息我们可以在一些社交媒体找到,例如在Twitter上人们就倾向于撰写关于他们的兴趣爱好和其他兴趣领域的帖子。由于tweets存在字符限制,因此用户会更专注地写东西。这也使得我们的信息收集工作变得轻松。免去了我们可能需要处理大型/乱码文本的过程。因此,让我们使用Twitter作为我们的数据源,并尝试构建我们的个性化wordlist生成算法。

  首先,我们需要通过Twitter的API从目标收集推文。由于我们的目标是识别用户的个人主题并生成相关的单词,因此我们需要从下载的推文中删除不必要的数据(停用词)。NLTK的stopwords扩展和自定义列表都被使用。列表包含高频词,如“the,a,an,to,that,i,you,we,they”。这些字在处理数据之前被删除。我们还删除了动词,因为密码大多包含名词。

  上面我们分析过,几乎32%的用户密码都包含单数名词。因此,我们的第一个目标是确定最常用的名词和专有名词。用户最感兴趣的主题可以用它们来识别。用NLTK的词性标记功能来识别最常用的名词和专有名词。例如上面的tweet,名词是:作者和女儿。专有名词是:George Orwell 和 Julia。

  在某些情况下,名词可以一起使用。 要创建有意义的单词对,我们需要分析它们的语义相似性。 为此,NLTK的路径相似性[16]与Wordnet上的第一个名词含义(n.01)一起用于所有已识别的名词。路径相似性基于在is-a(上位词/下位词)分类法中连接的最短路径,返回表示两个词有多相似的分数。得分在0到1的范围内。如果相似度得分高于0.12,我们的算法就可以对它们进行配对。

  研究人员发现密码中最常用的语义主题是位置和年份。因此,应该能找到与用户兴趣领域相关的位置和年份。wiki被用于这两项工作。我们的算法访问每个专有名词的wiki页面,用正则解析年份,并使用其硬编码城市列表识别城市名称。在上面的示例推文中,当我们向wiki发送“George Orwell”时,我们的算法将解析诸如London,1984等词。

  最后一步是整合我们所有获取的数据。从示例Tweet中我们获取到了George Orwell这个专有名词,我们将它发送到wiki,它返回给我们了1984。除此之外,我们还有另一个专有名词Julia。所以,当我们把所有的数据组合在一起时,我们的单词列表中的某个地方就会有正确的密码“Julia1984”。因此,我们可以像Sherlock Holmes一样破解密码,而不是面对那数以百万计的组合。

  Rhodiola是用Python 2.7编写的,主要基于NLTK和textblob库。通过一个给定的Twitter句柄(如果你没有,你也可以用你自己的数据。请查看Github页面了解有关详情),它可以自动编译一个包含以下元素的个性化wordlist:最常用的名词和专有名词,配对名词和专有名词,与检测到的专有名词相关的城市和年份。 例如:

  由于人们更倾向于使用他们感兴趣领域的单词来作为其密码组合,并在Twitter上公开这些兴趣领域,因此攻击者可以通过分析目标的推文来创建针对性的wordlist。除了Twitter之外,任何其他的社交媒体平台都有可能成为攻击者精准创建wordlist的有效数据来源。因此,用户应避免使用社交媒体中公开主题中的单词。最好使用存储在密码管理器中的随机密码。

Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms