原文:https://secapps.com/blog/2018/03/how-to-make-a-password-cracker
长久以来,入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如,在许多情况下,普通用户只要知道了相关密码,就能立刻变身为管理员。虽然这些情形听起来不够曲折,但在大多数情况下,暴力攻击是通过利用密码管理缺陷来入侵系统的最简单实用的方法。
实际上,Web应用程序和Web服务很容易被密码暴力攻击所攻陷。之所以出现这种情况,是因为这种类型的软件相对容易访问,数量也很多,同时默认情况下允许远程使用,而且大部分都是自定义的,此外,它们还会随着层出不穷的Web技术而不断变化。在这篇文章中,我们将从实战的角度出发,介绍针对不同类型的Web应用程序的暴力攻击方法。与此同时,我们还将借助现成的免费网络安全工具,如AppBandit攻击代理或某些在线Fuzzer来展示攻击过程。
基本身份验证
自万维网初期开始,基本身份验证及其变体(如摘要认证,NTLM等)就成为了事实上的认证标准。在实践中,人们很早就认识到基本身份验证方式并不太安全,但开发人员好像对它情有独钟,依旧乐此不倦地讲起应用于路由器管理界面、Web服务、管理界面等。该方案之所以流传甚广,原因之一就是因为它相对比较简单,因为整个身份验证方案仅靠一个特殊构造的头部就能得以实现,即利用该头部存放以base64格式编码的用户名和密码即可。
下面,让我们介绍针对基本身份验证的暴力攻击。为此,我们可以使用AppBandit的Fuzzer或其他在线Fuzzer,只要配置相应的参数就行了。首先,我们需要设置Authorization头部,然后添加基本身份验证信息,当然,这些都是专门针对这个特定任务而构建的。
对于用户名,为简单起见,这里将使用一个由已知帐户组成的列表。当然,我们也可以使用某些著名的数据库所提供的通用字典。
对于密码,我们可以使用字典。实际上,AppBandit和Fuzzer不仅可以使用自身的字典,同时,还可以下载并使用安全社区提供的各种字典文件。为此,可以从下拉菜单中添加一个字典项目,然后搜索“password”,即可找到由最常用的密码组成的列表,以及从以往著名的数据泄露事件中收集的实际密码所组成的列表。
暴力破解密码时,请务必将最大并行请求数设为60或更大,并将超时时间减少为5秒,以提高攻击性能。过了一会儿,我们就找到了正确的密码——密码可以从响应代码中看到,具体如下图所示。
基于Pin的身份验证
许多应用程序,尤其是移动应用程序会使用一种基于PIN的身份验证方法,即使用4至6位数字代码进行认证。此外,对于那些通过电子邮件或短信发送令牌而进行的双因子身份验证来说,也属于这种类型,因为该方案的实现大都存在安全漏洞。即便如此,人们还是经常误以为PIN提供的低熵是安全的。但是,实际上只要对Pin进行暴力猜解,无论是以顺序方式还是随机方式进行,都可以轻而易举的破解它。
下面,我们以一个假想的JSON服务为例,来演示如何实施这种攻击。首先,需要配置好请求报文,以使其符合该服务的要求。在Body选项卡中,我们需要对Pin生成器进行相应的编码处理。首先,使用JSON编码器来处理这个值。然后,使用一个格式项对它进行填充,使其长度符合Pin的长度要求。这些处理在后面是非常有用的。
在pad项中包含了一个简单的计数器,例如for循环。计数器从0开始,遍历到9999为止,步长为1。这里之所以使用这个pad项,是因为有效的Pin必须是4位数字。所以,需要用0覆盖所有不足四位的数字。当然,这种方法同样也可以用来处理6位和8位数字的Pin。
接下来,根据需要设置攻击选项——即增加并发请求数和减少超时。然后,执行攻击。需要注意的是,在前面针对基本认证的暴力攻击中,使用了一种基于状态代码的机制,破解成功与否一目了然;于此不同,要想知道针对基于Pin的身份认证的攻击尝试是否成功,还得在应用程序本身上下功夫,也就是说需要自己去试探。举例来说,可以监视内容长度的变化或状态码的变化,例如302重定向可能意味着验证成功。此外,还可以根据响应的返回时间对其进行分类,即时间试探法。当然,具体方式完全由读者自己来定,不过在原理上都是一致的——试探法。
上面的配置,也适用于基于表单的身份验证,甚至基本身份验证——唯一不同之处,就是根据具体情况将生成器移动到所需的地方即可,其余部分完全相同。
基于表单的身份验证
毫无疑问,基于表单的身份验证是网上最常见的身份验证方案。实际上,几乎所有PHP应用程序对于这个方案的实现都不太理想。如果正确的实现的话,基于表单的身份验证应该对自动化的密码猜测具有很强的“弹性”,但是说起来容易做起来难呀,毕竟现实中有太多的特殊情况,而这些都是需要给予特殊处理的。
在针对基于表单的身份验证进行暴力破解时,具体设置与基本身份验证示例中的类似。不过,这里没有使用Authorization头部,因为必须按照应用程序的具体情况来设置参数。首先,可以通过AppBandit代理或HTTPView等工具捕获这些信息,注意,这些工具可以直接从浏览器中运行,而无需进行额外的设置。
在进行暴力破解时,脑子一定要灵光,特别是用户名是电子邮件的时候。例如,与其用大量密码来暴力破解一个账户,不如用一部分最常用的密码来暴力破解多个账户,同时,我们还可以动态生成帐户,就像我们接下来要做的那样。
下面,我们来为用户列表设置一个生成器。首先,我们可以定义一些变量,以提高攻击的可配置性。
如您所见,这里正在使用字典(大部分来自seclists)。同时,我们还动态生成了电子邮件地址。实际上,我们可以在同一次攻击中使用多个字段。
现在,让我们向同一个列表中添加100个更常用的密码。在这里,我们使用了来自seclists的另一个字典,具体如下图所示。就像您看到的那样,这种做法不仅更有创意,也更高效。
攻击一旦开始,就需要密切关注任务的运行情况,努力寻找提示登陆成功的线索。当然,对于大多数响应来说,结果都是一样的。对于那些包含有效凭证的请求,可以按照我们前面介绍过的那些方法进行识别。然而,有时候您需要找到自己的识别方法。不过,大多数情况下,使用内置过滤器就足以应付了。例如,您可以过滤包含有效cookie的响应,因为一般来说,找到这样的响应就表示认证成功了。
与身份验证有关注意事项
从某种意义上来说,Web认证系统非常有(gao)趣(xiao)——它们永远不可能完美。这是因为,如果它们太安全,那么就根本无法访问了。反之,如果它们太容易访问,就不太可能是安全的。因此,在使用上述任何技术破解密码时,对于下面这些事项一定要做到心里有数。
在防范暴力破解方面,最常见防御机制就是帐户锁定,然而,在某些情况下,攻击者可以利用这种机制来发动拒绝服务攻击。例如,假设用户名是可猜测的或顺序的,并设置了帐户锁定。那么,如果我们在生成有效用户名方面具有很高的胜率,这就意味着我们也可以将这些人都锁定在系统之外,即拒绝服务攻击。尽管这种攻击威胁不是很大,但仍不失为一个有效的漏洞。
同时,水平和垂直暴力攻击之间的转换也是一种常见的技术。换句话说,我们可以针对多个帐户测试一个密码,而不是针对单个帐户尝试多个密码,因为我们可以枚举帐户或以高胜率的方式生成它们。
如果某些合法的身份认证尝试来自同一个IP地址的话,有的身份认证系统就会简单粗暴地将其锁定。后来,这些系统又通过设置一些例外情况来放宽了这一限制,因为毕竟IPv4地址空间是相对较小的,所以许多客户会共享同一个IP地址——例如,许多移动网络和光纤网络实际上都是这样运作的。所以,攻击者就可以入侵例外列表中的网络,或设法让应用程序误以为他们来自例外列表中的网络,这样就可以绕过帐户锁定限制了。
类似地,如果身份验证系统根据攻击者的IP地址来阻止IP或NETBLOCK的话,那么暴力破解攻击就可能转换为拒绝服务攻击,从而导致同一网络中的所有用户都无法登录。再次重申,这对于移动网络来说影响特别大,因为移动用户不太可能拥有专用的公共IP地址,所以移动应用程序特别容易受到这个问题的影响。
最后,不要仅仅因为页面上有reCAPTCHA就认为必须使用验证码,相反,很多时候它在那里只是个摆设而已。这是因为,reCAPTCHA或其他CAPTCHA系统通常都是嵌入式的,它们经常因配置错误或代码变化的缘故而不进行相关的检查,这种情况经常发生。
实际上,有时解除身份验证并不起作用,也就是说,虽然看起来用户已注销,但实际会话并未被破坏。这样的话,以前使用的会话可能被攻击者重新使用。然而,这个话题实在有点大,需要单独进行解释。在这里,重点是要知道,有时即使不知道密码也能登录,因为还有其他方法。
小结
攻击者可以通过多种方式来完成密码破解/暴力破解,就像前面所说的那样,这种攻击是非常普遍的。到目前为止,还没有找到能够完全抵御这种攻击的安全措施。坦率地说,只要我们有赖于密码,这种攻击就无法避免。毫无疑问,双因子认证方案能够提供更高的安全性,但我们也必须承认,它也不是万能的灵丹妙药,因为在某些情况下,它们照样可以被绕过。
在后续文章中,我们将针对暴力破解攻击方式,介绍一些目前可用的防御机制。