暴力破解可分为两种,一种是针对性的密码爆破,另外一种是扩展性的密码喷洒。
密码爆破:密码爆破一般很熟悉,即针对单个账号或用户,用密码字典来不断的尝试,直到试出正确的密码,破解出来的时间和密码的复杂度及长度及破解设备有一定的关系。
密码喷洒:密码喷洒和密码爆破相反,也可以叫反向密码爆破,即用指定的一个密码来批量的试取用户,在信息搜集阶段获取了大量的账号信息或者系统的用户,然后以固定的一个密码去不断的尝试这些用户。
密码爆破大家都很熟悉,所以我们这里简单的记一下,我们主要针对网站的一些登录或一些服务的登录,方法基本都类似,这里我们以 dvwa 的暴力破解为例,使用 burp 的 intruder:
拦截数据包后发送到 intruder,然后根据需求加载字典或者使用自带的字典或者是自带的一些模块设置来进行遍历,最后根据返回长度来看下结果。
密码喷洒因为是使用一个密码来遍历用户,所以很多人会纠结于用哪个密码,对于密码第一个可以使用一些弱口令,但随着人们安全意识的提高,这个成功率也有所下降,第二个可以试试类似于公司的名称拼音和缩写这种密码,第三个可以试试年月日组合这种,第四个可以在网上找一些公司泄露的资料,发现一些敏感信息,有些公司的服务有默认密码或者是人们在多个不同的服务平台上经常使用相同的密码,因为密码经常使用重复的,所以这个的成功率会很高。其实这个密码不用太过于纠结。
且一般情况下当一个密码对搜集到的用户试完以后,建议是停留 30 分钟后再试下一轮。或者通过网站的错误提示,例如错误次数 3,当超过 5 次后会锁定 30 分钟,这时就可以喷洒四轮,随后停 30 分钟后再继续进行,密码喷洒对于密码爆破来说,优点在于可以很好的避开系统本身的防暴力机制。
密码喷洒攻击我们也可以用 burp 来做,首先,还是将数据包发送到 burp 的 intruder 模块,将需要遍历的值添加到 payload 中,也就是用户名和密码,而这里的 attack type 攻击类型需要选择 cluster bomb, 这个可能平时用的没有 sniper 类型多,sniper 翻译过来是狙击者,我们理解为对单个的变量进行 payload 遍历,而 cluster bomb 翻译过来就是一群炸弹,这个类型的 payload 最多可以设置 20 个,我们这里的用户名加密码两个即可。
例如 payload1(用户名)包含了两个遍历值是 A 和 B,payload2(密码)也包含了两个遍历值 C 和 D,那么 cluster bomb 执行的遍历过程就是,A 和 C、A 和 D、B 和 C、B 和 D,这个情况就负荷我们的密码喷洒,单个密码跑完一轮用户名后再进行第二个密码。
我们还以 dvwa 为例,设置好遍历的用户名和密码,attack type 选 cluster bomb:
设置好后我们切换到 payload 选项卡设置 payload,按照 cluster bomb 的机制,先是 payload1 的一个值去遍历 payload2 的所有值,然后再进行第二个、第三个以此类推,所以 payload1 我们要把它设置成密码,payload set 选 1,payload type 我们就用 simple list 简单的列表,然后加载密码文件,因为后面涉及到每一轮的间隔问题,所以这里我为了节省时间,直接把正确的密码放到了第一个。
随后我们再设置用户名,这里 payload set 选择 2,payload type 还是 simple list 简单列表,然后加载用户名文件。
我们密码是 179 个,账号是 34 个,按照 cluster bomb 的机制,我们通过上图可以看到 request count 的总数是 179*34 是 6086 个。payload 设置完毕后我们进行下一步,切换到 options 选项卡进行设置。
因为我们密码喷洒优点在于防止被锁,所以再进行一轮遍历后建议停止 30 分钟再试第二次,当然可根据需求具体的调整,具体时间可以从错误提示等处获取,而 burp 对于这种 cluster bomb 攻击类型,其时间间隔设置如下。
首先要所的是线程问题,再进行密码喷洒这种操作时,其实我们并不是只能用一个线程,而是可以用多线程的。在时间间隔设置那里,以毫秒为单位,以上图为例,200000 毫秒也就是 200 秒,换算成分钟接近于 3.3 分钟,这时候密码喷洒过程就是,先以 5 个线程进行一轮,这时停留 16.5 分钟,然后进行下一轮。所以这里需要注意的是,设置的停留时间不是以一轮算的,而是多个线程的总和。
那么根据我们密码喷洒的需求,比如说收集到了 100 个用户名,每一轮完后停留 30 分钟再进行下一轮,那线程数则可以设置为 100,间隔时间可以设置为(半个小时是 1800000 毫秒,除以 100 为 18000 毫秒,也就是 18 秒),这样 100 个线程每个线程隔 18 秒,一轮完后停留时间即为半小时。
这里的线程理论最大可设置为 999,但设置为 999,可能因电脑配置原因或者网络原因,它不能一块放出去,这里我感觉影响不是很大,只要间隔时间设置即可,如果用户名超过 999 个,而线程已经满足不了时,这时候可能就需要自己动手写 python 脚本了。
除了在 web 上我们可能会用到密码喷洒攻击,有时可能一些服务上也会用到,例如 smb 服务这种,我们可以使用公开的 python 脚本拿来用,或者定制需求自己来写脚本实现,这里我们可以通过去 github 上找一下 spray 这个工具,根据介绍是支持 smb、owa、lync 这些,smb 可能用的多一点,其他针对国外服务可能多一点,我们简单看下它的使用,h 参数说明如下。
可以看到目前支持的是 smb、owa、lync、cisco 这些,我们这里通过 smb 参数来指定 smb 服务,然后跟目标地址或域名,再跟用户名列表文件,再跟密码列表文件,最后再跟一个尝试次数和限制时间,看下简单的例子。
其他参数好理解,最后两个数则代表,进行的轮数和停留时间,上图中即每一轮过后停留 35 分钟,我这里为了节省时间,把正确的密码放到了第一个,最后给出的结果是用户名 msfadmin 密码 msfadmin 正确,然后停留 35 分钟进行第二轮。
对于密码复杂度要求我们的耳朵都能听出茧子了,无非是超过 8 位,大写字母,小写字母,数字,特殊符号,一块组合应用。但基本很少有人这么做,一个是不方便记,再一个输入也嫌麻烦。另外还有一个大问题大家也都知道,就是密码重复使用,一个密码多个业务多个平台重复使用,更利于我们的记忆,有些平台注册也有提示,说密码复杂度等级,建议修改,也见过一些平台要求密码复杂度,如果不符合则不让注册的这种。在密码方面还有一个弊端是很多人喜欢用和自己相关的东西来组成密码,例如年月日,姓名拼音或缩写,或者 520 谁谁谁,公司里有些业务也都有默认密码,再加上认为是内网,所以基本很少有改的,而且还是弱口令。
其实这段内容写不写都没啥,因为道理大家都知道,只不过嫌麻烦不做而已,不过还是建议,至少不要和自己相关再随便加几个符号也不算麻烦,但对于爆破却相对难了不少,这里有一个网站,可以对密码计算出其相应的破解速度(https://www.grc.com/haystack.htm)。
这里随便输一个符合要求的密码,看一下给出的破解时间,在线攻击需要近两千个世纪(假设每秒一千个值),离线需要近 20 年(假设每秒一千亿个值),大规模破解阵列需要一周(假设每秒 100 万亿个值),破解时间相对有个参考。
对于密码爆破来说我们经常见到,越来越多的企业开始加入了防爆破机制,常见的就是加登录验证码,图形验证码干扰元素要能防止被机器人识别,也有很多用其他方式的验证码,例如点字或者选择正确的图片等,或者使用短信验证码,在此基础上也可以添加防错误机制,例如登录次数连续超过 5 次则提示稍后重试。而对于密码喷洒攻击,这种登录次数超过 5 次稍后重试则不是很好,有些应用设置了如果超过 5 次则今天就回锁定,只能明天再试,也有一些调节,不过可能对业务使用感有折扣,建议根据业务做平衡处理,另外密码爆破的验证码机制对密码喷洒也有有效的阻止作用,所以最后建议不论那种类型都加上错误次数和验证码机制,最大的点还是在于员工和个人的安全意识,系统做好员工意识到位,让不法分子没有可乘之机。
公众号推荐:aFa攻防实验室
分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。