草庐IT

利用 Burp Suite 进行密码爆破

世界尽头与你 2023-04-03 原文

利用 Burp Suite 进行密码爆破

1.Intruder 功能介绍

使用 BP 工具的 Intruder 模块高度可配置,可以对目标网站进行密码爆破,一般被用于网站的安全渗透测试场景

BP 工具的 Intruder 模块包含几个功能标签:

  • Positions:设置请求中的参数及攻击类型
  • Payloads:为上面的参数设置数据集、参数编码、加密等功能
  • Resource Pool:指定请求线程及延时时间
  • Options:请求头、攻击结果、重定向等相关的配置

2.攻击类型

Intruder 进行密码爆破时,可以有 4 种攻击类型供选择:

分别是:Sniper(狙击手模式)、Battering ram(破城锤模式)、Pitchfork(音叉模式)、Cluster bomb(集束炸弹模式)

Sniper 使用一组数据集合,依次对 $ 标记的变量进行爆破,即:针对一个参数变量,使用一个数据集合

使用场景:单一目标,已知用户名,密码未知

Battering ram 使用一组数据集合,同时对 $ 标记的所有变量进行爆破,即:针对多个参数变量,使用一个数据集合

使用场景:两个单一目标,相互不影响

Pitchfork 使用多组数据集合,同时爆破被 $ 标记的变量,即:针对多个参数变量,使用多个数据集合

使用场景:用户名和密码都未知,每个用户名只使用一个密码进行攻击

Cluster bomb 使用多组数据集合进行组合(笛卡尔积)后,依次对多个爆破点变量进行爆破,即:针对多个变量,使用多个数据集合的组合

实用场景:两个目标,每个用户名使用所有密码都进行一次攻击


3.实战

皮卡丘靶场,基于表单的暴力破解:

打开拦截功能,在浏览器中随便输入一个用户名、密码,执行登录操作,这样在 BP 工具拦截模块中可以拦截到这个请求

点击「 Action 」按钮,选择将数据包发送给 Intruder 模块

Positions 标签下,我们需要先点击右侧的「 Clear § 」按钮来清除默认的参数标签:

然后鼠标选择需要设置为变量的值,点击右侧的「 Add § 」按钮来设置它为变量:(这里只设置用户名和密码)

攻击类型我们选择「 Cluster bomb 」,让所有用户名和密码随机组合进行攻击:

接着,我们在 Payloads 标签下,根据参数索引对用户名、密码配置不同的数据集:

数据集可以从本地文件中导入,也可以手动添加或者从剪切板中粘贴🍂

配置数据集完成后,我们可以看一下数据包的个数:(如果数据包的量很大,那么爆破将会持续很长时间!)

最后,点击右上角的「 Start attack 」按钮对目标网站进行密码爆破:

找到数据包长度Length明显不一样的,查看响应包,发现登录成功了,得到用户名是admin,密码是123456,为弱口令:


4.客户端验证码爆破

pikachu验证码绕过(on client):

前端输入错误的验证码会提示验证码错误:

BP抓包,先输入任意用户名密码,正确的验证码,登录试试,果然失败:

不填写验证码字段,只修改用户名和密码:(依然是用户名或密码不存在,并没有提示验证码错误,证明它只是一个前端绕过)

JS绕过的逻辑在这里:

<script language="javascript" type="text/javascript">
    var code; //在全局 定义验证码
    function createCode() {
        code = "";
        var codeLength = 5;//验证码的长度
        var checkCode = document.getElementById("checkCode");
        var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的

        for (var i = 0; i < codeLength; i++) {
            var charIndex = Math.floor(Math.random() * 36);
            code += selectChar[charIndex];
        }
        //alert(code);
        if (checkCode) {
            checkCode.className = "code";
            checkCode.value = code;
        }
    }

    function validate() {
        var inputCode = document.querySelector('#bf_client .vcode').value;
        if (inputCode.length <= 0) {
            alert("请输入验证码!");
            return false;
        } else if (inputCode != code) {
            alert("验证码输入错误!");
            createCode();//刷新验证码
            return false;
        }
        else {
            return true;
        }
    }


    createCode();
</script>

可以判断虽然验证码被提交,但是后台并没有验证。这个验证码框是通过JavaScript实现的,对于不懂安全的人来说,可以起到一定的防范作用。但对于知道这个原理的人来说形同虚设。

接下来,就与基于表单的流程一样,发送数据包到Intruder中,选用Cluster bomb模式修改变量,因为验证码后台并不校验没有用,所以只用选择用户名与密码。


5.服务端验证码复用

和上面一样的思路,但是这次提示验证码不能为空:

随机输入一个验证码,提示错误:

很遗憾,它是一个服务端的验证码检测

从表面上看没有问题,但是我们还需要对验证码是否在后台过期进行进一步验证。首先先点击验证码,获取一个新的验证码

然后返回数据包中,将正确的验证码输入。点击运行,提示用户名和密码不正确。为了验证验证码是否一致有效,我们修改用户名和密码,验证码不变,点击运行,结果一样。说明验证码可以重复利用!

继续将数据包发送到Intruder,设置变量用户名和密码,验证码则输入正确的验证码,不设置变量。输入字典进行破解。


6.BP验证码识别

面对一些简单的网站,在用户名、密码字典数据完善的前提下,使用上面的步骤进行密码爆破的几率很高

但是针对一些包含验证码的网站,我们需要多一步识别验证码的操作,然后在 Payloads 功能标签下将图片识别结果设置到参数中去

这里推荐一个 BP 插件「 captcha-killer

captcha-killer

注意:captcha-killer本身无法识别验证码,它专注于对各种验证码识别接口的调用(例如对于百度云验证码识别接口的调用)

这里给出教程,大家自行探索!

captcha-killer使用教程

有关利用 Burp Suite 进行密码爆破的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

  9. ruby - 捕获 Ruby Logger 输出以进行测试 - 2

    我有一个像这样的ruby​​类:require'logger'classTdefdo_somethinglog=Logger.new(STDERR)log.info("Hereisaninfomessage")endend测试脚本行如下:#!/usr/bin/envrubygem"minitest"require'minitest/autorun'require_relative't'classTestMailProcessorClasses当我运行这个测试时,out和err都是空字符串。我看到消息打印在stderr上(在终端上)。有没有办法让Logger和capture_io一起玩得

  10. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

随机推荐