导语:网络应用程序和网络服务特别容易受到密码暴力攻击,在这篇文章中,我将从不同的角度介绍一些类型的网络应用程序暴力攻击。另外,我还将使用现成的免费网络安全工具,来深入分解每种攻击。
网络应用程序和网络服务特别容易受到密码暴力攻击,而且密码暴力攻击类型的软件相对容易访问,默认情况下可以远程使用,而且大部分都是自定义的,更重要的是该类软件会随着网络技术的最新发展而不断变化。在这篇文章中,我将从不同的角度介绍一些类型的网络应用程序暴力攻击。另外,我还将使用现成的免费网络安全工具,如AppBandit攻击代理或在线工具套件的Fuzzer来深入分解每种攻击,Fuzzer(漏洞检查工具)可以发送数据到组件,可以完成数以万计的检查任务,来帮助我们发现软件中不期望有的漏洞。
基本身份验证
从万维网早期开始,就出现了一些基本身份验证及类似的验证(如摘要认证,NTLM验证等),这些就是最初的认证标准。不过如今看过来,基本身份验证在实际的应用中已经没有任何安全保障可言了。但由于目前该验证方法还在被继续使用,所以这并不妨碍开发人员利用该方案对路由器管理界面、网络服务、管理界面等进行密码保护。之所以应用如此广泛,原因之一是因为基本身份验证过程相对比较简单,因为整个身份验证方案会在特殊构造的标头上设置一个中继,该标头包含以base64格式编码的用户名和密码。
下面就看看我是怎么对基本身份验证提示进行暴力攻击的,在进行演示之前,我需要从在线套件工具中打开AppBandit的Fuzzer或Fuzzer,并配置一些参数。
首先,我需要设置授权标头,然后添加基本验证项目,注意,我在设置时会为本文的测试进行一些特定的设置,以方便构建特定的任务。
对于用户名,我将使用已知帐户的列表。不过,我也可以使用来自一些知名数据库的通用字典。
对于密码,我将使用AppBandit和Fuzzer,这两个工具不但都有自己的字典,而且都可以下载并包含论坛里提供的字典文件。从下拉菜单中添加一个字典项目,然后输入“password”进行搜索,不但可以找到各种常见的各种密码列表集,还可以从众所周知的过去已经泄露的数据中提取具有真实攻击效果的密码列表。
确保将最大并行请求数增加到60或更多,并将超时时间减少到5秒,以提高攻击性能。如下图所示,果然,不久之后我就可以通过简单的监控响应代码来找到正确的密码。
基于PIN码的身份验证
PIN码,全称Personal Identification Number。就是SIM卡的个人识别密码。许多应用程序尤其是移动应用程序,都是利用所谓的基于PIN的认证,即使用4至6位代码进行认证。基于通过电子邮件或短信发送令牌生成的双因素身份验证也属于这一类,不过目前双因素身份验证也出现了不同程度攻击。虽然,PIN可以提供相对安全的保障,不过在暴力破解面前,无论你是按顺序还是随机破解,都很容易达到攻击目的。
以下是我针对虚构的JSON服务所进行的攻击演示,不过前提是先对配置请求做一些设置,让JSON服务符合本文的演示目的。在正文中,我使用了一系列设置来正确编码pin的生成器。首先,我需要JSON编码器来引用正确编码的pin。接着,我还需要用一个格式项来将该pin填充到正确的pin长度,这对于下一步的演示很有用。
pad项包含一个简单的计数器,即for循环。用步骤1的方法可以让计数器从0计到9999。我使用pad项的原因是因为只有4位数字被认为是有效的pin。所以,我需要在该数字前面加上额外的零,以覆盖从0开始的所有pin,以制作一个四位数的pin。我也可以使用相同的技术来制作相同的6位和8位数的pin。
要根据需要设置攻击选项,即增加并发请求数和减少超时时间来执行攻击。与你前面看到的基本身份验证的暴力攻击示例不同,现在我提供了一种基于状态代码的简单机制,以区分有效的尝试和无效的尝试,由于这种类型的攻击完全依赖于应用程序,因此你需要找到自己的攻击方法。例如,你可能想要监控内容长度的更改或状态代码的更改,比如302重定向可能意味着成功的身份验证。不过你也可以根据响应时间的多少来进行排序,比如定时启发。
不过同样的攻击配置还可以配置为基于表单的身份验证,甚至基本身份验证。你只需要将生成器移动到所需的位置即可,其余的配置完全相同。
基于表单的身份验证
不用说,基于表单的身份验证是网络上最常见的身份验证方案。实际上任何PHP应用程序都会执行广告验证,如果正确地实现了基于表单的身份验证,就应该能够对抗自动的密码猜测尝试,尽管这听起来很简单,但在现实中,这绝不是一件容易的事情,因为存在许多需要特定类型处理的特殊情况。
如果我要设置基于表单的身份验证暴力破解,那步骤就和以上基本身份验证示例中的步骤相同。所以,我决定这次我不会使用授权标头了,但我还是必须按照应用程序的设置标准来设置参数。我可以首先通过AppBandit代理或HTTPView等工具来获取这些信息,这些工具可以直接从你自己的浏览器上运行,无需额外的设置。
这是一个聪明之举,特别是如果用户名是电子邮件,我就可以覆盖更多的范围。例如,我可以在多个账户中使用一个普通密码的集合,而不是用许多密码暴力破解一个帐户。我也可以动态生成帐户,具体过程,我会在下面讲到。
所以要先为我的用户列表设置一个生成器。首先,我将定义一些变量,以使攻击更具攻击力。
正如你所看到的,我正在使用一些字典(大部分来自seclists)来动态生成电子邮件地址。实际上,我可以在同一次攻击中覆盖多个域。
现在,我会从同一个列表中添加排名前100的常用密码,我还可以使用另一个来自seclists的字典,如下图所示。
一旦攻击开始,你需要密切关注正在运行的任务以获取线索,这些线索将获取有效的登录尝试。根据得到的各种回馈情况,我会得到相同的结果。这些包含有效凭证的请求将按照我前面讨论过的许多方式进行区分。不过你需要找出适合你自己的开启方式。大多数这些情况都由内置过滤器覆盖。例如,你可以过滤包含有效Cookie的响应。在大多数情况下,这都表明身份验证是成功的。
如何鉴别身份验证被攻击了
网络认证系统很有趣,因为它们永远都有缺陷,却永远都在用。如果太安全,将无法访问。如果他们太容易访问,就可能是不安全的。因此,在使用上述任何技术破解密码时,都需要记住一些关键事项。
帐户锁定是防范暴力攻击的常见防御机制,但可根据情况将其转换为拒绝服务。例如,假设用户名是可猜测的或有顺序的,就应该设置帐户锁定。由于我有能力可以生成有效的用户名,这意味着我也可以将每个人都排除在系统之外,即拒绝服务。
水平暴力攻击(horizontal bruteforce )和垂直暴力(vertical bruteforce )攻击之间的转换也是一种常见技术。换句话说,由于我可以枚举这些帐户或某种方式生成它们,所以我可以针对多个帐户测试同一个密码,而不是在单个帐户测试多个密码,。
如果某些认证系统来自相同的IP地址,它们会理所当然的锁定有效的认证尝试。后来,由于IPv4地址空间相对较小,许多客户可能拥有相同的IP地址,因此这些系统被重构为有许多例外,例如,许多移动和光纤网络实际上都是这样工作的。攻击者可能能够利用这些网络或诱使应用程序认为它们来自异常列表中的网络以绕过帐户锁定限制。
同样,如果认证系统根据攻击者的IP地址阻止IP或NETBLOCK,则暴力攻击可以转换为拒绝服务,因为同一网络中的用户将无法登录。再次,对于移动网络来说,因为移动用户不太可能拥有专用的公共IP地址,所以此类移动应用程序受到影响特别大。
你不能仅仅因为页面上有reCAPTCHA,就判定它被使用,很多时候它只是显示在那里。通常,reCAPTCHA或任何其他CAPTCHA系统都是嵌入式的,但由于配置错误或代码更改导致无法进行检查。
解除身份验证可能实际上不起作用,虽然看起来用户已注销,但实际会话不会被破坏。以前使用的会话可以被攻击者重新使用。
总结
攻击者可以通过多种方式来成功获取密码,比如常见的暴力破解,如上文所述,这种攻击非常普遍。目前,我还没有看到有什么安全系统能够彻底根除这一类型的攻击。坦率地说,双因素认证方案是目前相对安全的选择,但在某些情况下,它也可以被绕过。