web暴力破解之AppBandit——可攻击短信验证PIN码和基于表单的登录
写在前面的话
在很多现实的攻击案例中,大多数攻击者都是通过暴力破解的方式来入侵目标系统的,此时攻击者主要利用的是弱密码以及密码管理方面的安全问题。Web应用和Web服务特别容易受到密码暴力破解攻击,因为它们相对来说比较容易实现远程访问,而且数量和种类都非常丰富。在这篇文章中,我们将站在攻击者的角度跟大家介绍几种不同类型的针对Web应用的暴力破解攻击。
注:我们将使用到网上现成的开源Web安全工具,例如AppBandit Attack Proxy和Fuzzer from the OnlineSuite来演示攻击路径。
基础认证
在互联网发展的早期,基础认证(例如摘要认证和NTLM等)是普遍采用的认证标准。毫无疑问,这种方法的安全性是不足以满足我们需求的,但是很多开发人员仍在使用这种认证方案来对路由器管理接口和Web服务等关键节点进行保护。之所以这种认证方法能够得到广泛使用,主要是因为它实现起来非常简单(基于特殊构造的Header,其中包含的用户名和密码均以base64格式编码)。
接下来,我们要开发一个针对基础认证的暴力破解攻击。打开AppBandit的Fuzzer或Fuzzer from the online suite,并配置一些相关参数。首先,我们需要设置授权Header,然后添加基础认证选项:
我们将从已知账号中选取用户名,然后从某些著名数据库中选择常用字典:
AppBandit和Fuzzer没有自带字典文件,但是它们都可以使用外部字典。我们可以直接把字典文件拖进工具窗口,然后你就可以使用各种类型的常用字典列表了:
确保你将并行请求的最大数量设置为60以上,并降低timeout到5秒左右,这样可以提升攻击的效率。接下来,我们只需要观察控制台中的响应码就可以了解密码的破解情况了。
基于PIN码的认证
很多应用程序,尤其是移动端App都会使用基于PIN码的认证,即使用4-6位数字码进行认证。基于电子邮件或SMS短信发送认证令牌来实现2FA的方法也属于这类攻击范畴。毫无疑问,PIN码安全性的熵其实非常低,无论你准备按数字顺序破解还是随机破解,暴力破解的实施难度都不大。
接下来,我们将对一个虚拟的JSON服务发起攻击。首先,我们要配置有效的服务请求。然后再请求body中,我们还需要对PIN码生成器进行正确编码。因此,我们需要JSON编码器来引用这些值。除此之外,我们还需要将PIN码长度填充到正确长度。
用于实现数据填充的pad对象包含一个简单的循环计数器(0-9999),因为这里有效的PIN码是4位数字,所以我们需要在数字前填充额外的‘0’来制作4位数字PIN码,我们还可以利用同样的技术来制作6位或8位数字PIN码。
大家可以根据自己的需要来配置请求数量并降低timeout。跟针对基础认证的暴力破解攻击不同,这种类型的攻击需要根据目标应用程序的特性来设计。
基于表单的认证
基于表单的认证机制是目前Web最常见的身份验证方案。实际上,几乎任何一个PHP应用都实现了这种认证,但大多数的安全性都不高。为了发动针对表单认证的暴力破解攻击,我们这里需要设置目标应用程序所需要的参数。我们可以使用AppBandit Proxy或类似HTTPView这样的工具来捕捉信息。
这里我们可以稍微转变一下思路,比如说,我们不需要用很多密码去测试一个账号,我们可以用一小部分的常用密码来测试大量的账号。接下来,我们需要设置一个用户列表生成器。首先,我们要定义一些变量,并提升攻击的可配置性。
我们现在使用了一些字典(大多数来自seclists),我们可以动态生成电子邮件地址。实际上,我们还可以同时对多个域名实施攻击。
现在,我们要添加一百个常用密码(使用另一个seclists字典),结果如下:
在真实的攻击场景中,你可能还需要观察控制台中的响应请求,因为在很多情况下我们可以通过分析有效cookie来了解攻击是否成功。
总结
目前还没有任何一个安全系统可以完全抵御这种类型的攻击,因为攻击者可以通过多种方式来实现密码爆破攻击。坦白的说,只要我们还在使用密码,我们就是不安全的。虽然双因素身份认证机制是目前比较安全的一种方案,但是它同上是作为一种可选项出现的,而且在某些情况下2FA同样能够被绕过。