【THM】Burp Suite:Intruder(Burp Suite-攻击器)-学习

发布时间 2023-04-12 08:39:50作者: Hekeats

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/burpsuiteintruder

本文相关内容:了解如何使用 Intruder 在 Burp Suite 中自动化执行请求。

img

什么是Intruder(攻击器)?

Intruder是Burp Suite的内置模糊测试工具,它允许我们自动化执行请求,这在模糊测试或者暴力破解攻击中非常有用。

Intruder可以接受一个请求(通常是Burp Proxy先捕获到请求再转发至Intruder中),并能使用这个请求作为模版 来自动向目标服务器发送大量具有细微差别的请求。例如,通过捕获包含登录尝试的请求,我们可以配置Intruder将用户名和密码字段替换为字典中的值,从而能够允许我们对登录表单进行暴力破解攻击;类似地,我们也可以导入模糊测试字典,并结合Intruder对子目录、端点或虚拟主机进行模糊测试,此功能非常类似于Wfuzz或Ffuf等命令行工具所提供的功能。

简而言之,作为一种自动化请求的方式,Intruder是非常强大的,但是还有一个问题:如果要不限速率地使用Intruder,我们必须需要Burp Suite专业版。当我们在Burp Suite社区版中使用Intruder时,它会受到一定的速率限制,而这种速度限制可能会让 许多渗透测试人员选择使用其他工具来进行模糊测试和暴力破解攻击。

让我们查看一下Intruder的界面:

image

我们能够看到的第一个子选项卡是Target,此处允许我们选择攻击目标。(在较新版本的Burp中Intruder没有Target子选项卡)

如果我们从Burp Proxy处发送一个请求到Intruder中(使用Ctrl + I或者右键单击请求并选择“发送给Intruder”),那么此时Target子选项卡应该已经被填充好了字段。

除了Target选项卡(在较新版本的Burp中Intruder没有Target子选项卡)之外,在Intruder中还有四个子选项卡:

  • Positions :这个子选项卡允许我们选择攻击类型,并且能够配置我们希望在请求模板中插入有效载荷(Payload)的位置。
  • Payloads :这个子选项卡允许我们选择将payload(有效载荷)插入到我们在前一个子选项卡中定义的每个位置,例如我们可以选择从字典中加载项目作为有效载荷,至于如何将有效载荷插入到请求模板中,则取决于我们在Positions子选项卡中所选择的攻击类型;有许多有效载荷类型可供我们选择(从简单的字典到基于服务器响应的正则表达式),有效载荷子标签也允许我们改变攻击器(Intruder)的行为与有效载荷,例如,我们可以定义一些预处理规则以应用于每个有效载荷,这些预处理规则包括——添加前缀或后缀,进行匹配和替换,或者当有效载荷匹配到已定义的正则表达式则跳过等等。
  • Resource Pool:这个子选项卡主要允许我们在任务之间分配资源,这对于Burp社区版而言并不是特别有用;Burp Suite专业版允许我们在Burp后台运行各种类型的自动化任务,而Resource Pool就是我们希望在这些自动化任务和Intruder之间手动分配可用内存和计算机处理能力的地方;如果我们不能访问后台自动化的任务,则使用Resource Pool就没有什么意义(本文所使用的是Burp社区版,所以并不能访问后台自动化任务)。
  • Options:Intruder允许我们在Options子选项卡中配置攻击行为,这里的设置主要应用于Burp如何处理结果以及Burp如何处理攻击本身;例如,我们可以选择标记包含指定文本片段的请求,或者定义Burp如何处理重定向(3xx)响应。

tips:模糊测试是指我们取一组数据并将其应用于一个参数,从而测试目标功能或者查看是否存在某些东西;例如,我们可以在web应用程序中选择进行“端点模糊测试”,这会将字典中的每个项目添加到请求消息的末尾并进行多次发送,然后查看web服务器会如何响应(例如http://MACHINE_IP/WORD_GOES_HERE)。

答题

阅读本小节的内容并启动Burp Suite。

Options子选项卡的哪个部分允许我们控制将在Intruder的结果中捕获的信息?

image

我们可以在哪个 Intruder 子选项卡中为我们计划的攻击定义“攻击类型”?

image

Intruder Positions

当我们想要使用 Intruder 进行攻击时,我们需要做的第一件事就是查看Positions子选项卡,这个子选项卡会告诉 Intruder 在哪里插入有效载荷。

让我们切换到Intruder中的“Positions”子选项卡界面:

image

请注意,Burp 会尝试确定我们希望自动插入有效负载的最有可能的位置(Position)——这些位置将以绿色突出显示并被 silcrows ( §)符号 包围。

在Positions界面的右侧,我们有标记为“添加§”、“清除§”和“自动§”的按钮:

  • Add(添加): 允许我们通过在编辑器中突出显示并单击按钮来定义新位置。
  • Clear(清除):会删除所有已定义的位置,从而留给我们一个空白画布来自己定义位置。
  • Auto(自动): 会尝试自动选择一些最可能的位置,如果我们已经清除了默认位置但又希望恢复它们,这个按钮就可以派上用场。

Intruder攻击类型简介

当我们切换到Intruder的Positions子选项卡时,我们可以从中查看"Attack types" 的下拉菜单。

我们可以看到四种可选的攻击类型:

  • Sniper(狙击手)
  • Battering ram(攻城锤)
  • Pitchfork(干草叉)
  • Cluster bomb(集束炸弹)

在下文中我们将依次介绍上述四种攻击类型。

Sniper攻击

Sniper(狙击手)是Intruder中的第一种也是最常见的攻击类型。

当进行Sniper攻击时,我们需要一组有效载荷,这组有效载荷可以由包含单词列表或者一系列数字的单个字典文件提供;我们会使用Burp Suite术语“Payload Set”来引用那些将要插入到请求中的项目列表,然后Intruder将获取"有效载荷集-Payload Set"中的每个有效载荷,并依次将其放入每个预先定义的位置。

我们可以查看以下示例模板:

#Example Positions

POST /support/login/ HTTP/1.1
Host: MACHINE_IP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://MACHINE_IP
Connection: close
Referer: http://MACHINE_IP/support/login/
Upgrade-Insecure-Requests: 1

username=§pentester§&password=§Expl01ted§

这里定义了两个位置(Position),分别针对用户名(username)和密码(password)主体参数。

在Sniper攻击中,Intruder将占据每个位置(Position)并依次替换每个有效载荷。

例如,假设我们有一个单词列表,其中包含了三个单词:burpsuiteintruder

根据上面示例中的两个位置(Position),Intruder会用这些词发送六个请求:

image

注意Intruder是如何从第一个位置(username)开始并尝试每个有效载荷的,之后它还会移动到第二个位置(password)并再次尝试相同的有效载荷;因此,我们可以计算出Intruder在Sniper攻击中会发送的请求的数量(字典中的单词数目*预先定义的位置数目):requests = numberOfWords * numberOfPositions

这种特性使得Sniper非常适合于单位置攻击:例如,在知道用户名的情况下对密码进行暴力破解攻击,或者对单个API端点进行fuzzing测试。

答题

阅读本小节的内容,可以帮助我们回答以下问题。

image

Battering ram攻击

接下来,让我们看一下Battering Ram(攻城锤)攻击类型。

与Sniper一样,Battering ram也是使用一组有效载荷(例如一个单词列表),但是与Sniper不同的是,Battering Ram会将相同的有效载荷放在所有预先定义的位置上,而不是依次放入每个位置。

让我们使用与上一个小节相同的单词列表和请求示例来说明这一点。

#Example Positions

POST /support/login/ HTTP/1.1
Host: MACHINE_IP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://MACHINE_IP
Connection: close
Referer: http://MACHINE_IP/support/login/
Upgrade-Insecure-Requests: 1

username=§pentester§&password=§Expl01ted§

如果我们使用Battering ram攻击,Intruder就会在每次攻击尝试时将单个有效载荷同时替换到以上位置。

针对上面例子中的两个位置,Intruder在进行Battering ram攻击时,会使用字典中的三个单词(burpsuiteintruder)来发送一共三个请求:

image

我们可以看到:每次发送请求时,例子中的两个位置都会使用相同的有载载荷。

答题

阅读本小节的内容,可以帮助我们回答以下问题。

image

Pitchfork攻击

除了Sniper攻击之外,Pitchfork(干草叉)攻击是你最可能使用的攻击类型。

我们可以将执行一个Pitchfork攻击想象成同时执行着多个Sniper攻击,Sniper攻击只会使用一个有效载荷集(这个有效载荷集可供每个位置使用),而Pitchfork则会在每个位置使用一个有效载荷集(这样就需要多个有效载荷集,最多可以使用20个),并将同时遍历全部有效载荷集。

这种类型的攻击可能需要一些时间来理解,让我们继续使用之前的请求示例,但这次我们需要使用两个单词列表(也就是两个字典):

  1. 我们的第一个字典是供username使用,这个字典包含三个单词:joelharrietalex
  2. 第二个字典是供password使用,假设Joel、Harriet和Alex的密码泄露了:我们已经知道Joel的密码是J03l, Harriet的密码是Emma1815, Alex的密码是Sk1ll

假设我们使用这两个字典针对上一小节的示例执行pitchfork攻击,Intruder发出的请求将如下所示:

image

我们可以看到:在执行Pitchfork攻击时,Intruder会从每个字典中获取第一个单词并将它们放入请求中,请求的每个位置对应放入一个单词,然后Intruder会接着对下一个请求重复类似操作——从每个字典中取出第二个单词并将它们替换到请求模板中。Intruder将持续进行上述操作,直到一个(或所有)字典用完为止,在理想情况下,Pitchfork攻击中所使用的多个有效载荷集应该具有相同的长度,因为一旦其中一个字典被用尽,Intruder就会停止攻击测试;例如,如果我们有两个字典,一个有100行,一个有90行,那么在Pitchfork攻击中Intruder将只会发出90个请求,这样第一个字典中的最后10个单词将不会被使用。

这种攻击类型(Pitchfork攻击)在执行凭据填充攻击时特别有用。

答题

阅读本小节的内容,可以帮助我们回答以下问题。

image

Cluster bomb攻击

最后,让我们来看一下Intruder的最后一种攻击类型:Cluster bomb(集束炸弹)。

与Pitchfork攻击一样,Cluster bomb攻击也允许我们选择多个有效载荷集:每个位置一个有效载荷集,最多可以使用20个有效载荷集;但是,Pitchfork攻击会同时遍历每个有效载荷集,而Cluster bomb攻击则是会单独遍历每个有效载荷集,从而确保使用有效载荷的每个可能组合进行攻击测试。

让我们使用一个例子来让这种攻击类型更加直观。

我们选择与上一小节相同的单词列表(字典):

  • Usernames: joelharrietalex
  • Passwords:J03lEmma1815Sk1ll

假设我们不知道哪个密码属于哪个用户,也就是说:我们现在一共有三个用户和三个密码,但是不知道如何匹配。在这种情况下,我们可以选择使用Cluster bomb攻击,Intruder将基于字典中的单词尝试使用所有可能的组合,最终发送的请求如下:

image

如上图所示:Cluster Bomb攻击将尝试使用所提供的有效载荷集的每个组合,以确保每一种可能的组合都经过了攻击测试。

Cluster Bomb攻击可能会产生大量的流量(请求总次数等于每个有效载荷集中的行数相乘),所以要谨慎使用。因为在Burp Suite社区版中使用Intruder会受到速率限制,所以我们还要意识到:如果基于中等大小的字典进行Cluster Bomb攻击,则可能需要非常长的时间才能完成。

这种攻击类型(Cluster Bomb攻击)适用于任何用户名未知的暴力破解凭据攻击。

答题

阅读本小节的内容,可以帮助我们回答以下问题。

image

Intruder Payloads

在接下来的小节中会有一些实践练习,但首先,我们必须了解如何创建、分配和使用有效载荷(Payloads)。

让我们切换到Intruder中的"Payloads"子选项卡,这个子选项卡可以分为四个部分:

  • Payload Sets:这个子选项卡允许我们查看请求中的攻击位置所对应的有效载荷集以及选择Payload类型——相关下拉菜单为"Payload Set"和"Payload type"。

    • 当我们使用基于单个有效载荷集的攻击类型(即Sniper或Battering Ram)时,"Payload Set"的下拉列表中将只有一个选项,无论我们定义了多少个位置。

      image

    • 当我们使用基于多个有效载荷集的攻击类型(即 Pitchfork 或 Cluster Bomb)时,那么每个攻击位置在"Payload Set"下拉列表中都会有一个对应选项。
      注意:在"Payload Set"下拉列表中给有效载荷集分配编号时,应该从左到右引用攻击位置;例如,如果有两个攻击位置 (在请求中的从左到右顺序是--用户名、密码),那么"Payload Sets"下拉列表中的第一个有效载荷集将引用用户名字段,第二个有效载荷集将引用密码字段。

      image

    Payload Sets中的第二个下拉菜单是"Payload type-有效载荷类型",在默认情况下,Payload类型是"Simple List"——顾名思义,"Simple List"允许我们加载一个单词列表(字典)以供使用;此外,还有其他可用的Payload类型,如Recursive GrepNumbersUsername generator等等。

    image

  • Payload Options :这个子选项卡取决于我们为当前有效载荷集所选择的有效载荷类型。例如,"Simple List"有效载荷类型会给我们一个框,我们可以向集合中添加以及删除有效载荷。

    image

    我们可以手动点击"Add"来从文本框中添加Payload,或者点击"Paste"来粘贴Payload,或者点击"Load…"从文件中加载Payload;此外,我们还可以使用"Remove-删除"按钮来删除当前所选中的行,使用"Clear-清除"按钮来清除整个Payload列表。注意--在这里加载非常大的Payload列表会导致Burp崩溃!

    相比之下,如果此处是"Numbers"有效载荷类型的选项,则将允许我们更改诸如所使用的数字范围以及正在使用的基数之类的选项。

    image

  • Payload Processing:有效载荷处理(Payload Processing)允许我们定义 在将有效载荷(Payload)发送到目标之前应用于Payload集合中的每个Payload的规则;例如,我们可以设置将Payload中的每个单词大写,或者可以设置如果Payload与规定的正则表达式成功匹配 就跳过这个Payload。

    image

  • Payload Encoding:这个子选项卡将允许我们覆盖默认的URL编码选项,默认的URL编码选项通常会自动应用以允许我们的有效载荷安全传输;但是,有时候不使用URL来编码标准的“不安全”字符反而可能是有益的,因此我们可以调整要编码的字符列表,或者直接取消选中"URL-encode these characters"复选框。

    image

当以上部分结合在一起时,就能够为我们所希望执行的任何攻击完美地定制有效载荷集。

答题

阅读本小节的内容并启动Burp Suite。

哪种有效载荷类型可以让我们将单词列表加载到有效载荷集合中?

image

我们可以使用哪个有效载荷处理规则在Payload集合中的每个有效载荷末尾添加字符?

image

简单示例练习

我们在上文中介绍了很多理论——现在是我们将理论付诸实践的时候了。

准备阶段

在和本文相关的TryHackMe实验房间中 启动目标机器。

让我们尝试访问目标机器的以下页面:/support/login

image

这是一个相当典型的登录界面,通过查看登录表单的源代码,我们可以看到该页面未做任何保护措施:

---
<form method="POST">
    <div class="form-floating mb-3">
        <input class="form-control" type="text" name=username  placeholder="Username" required>
        <label for="username">Username</label>
    </div>
    <div class="form-floating mb-3">
        <input class="form-control" type="password" name=password  placeholder="Password" required>
        <label for="password">Password</label>
    </div>
    <div class="d-grid"><button class="btn btn-primary btn-lg" type="submit">Login!</button></div>
</form>
---

image

通过阅读以上代码,我们可以确认该登录表单缺乏保护措施,这意味着我们可以使用Intruder中的"Cluster bomb"攻击类型来执行暴力破解攻击(在本小节示例中,由于已提供了登录凭据泄露文件,所以将选择使用"Pitchfork"攻击类型)。

为了方便演示,在本小节的示例练习中有一个包含登录凭据的字典文件可供我们使用,我们可以下载和本文相关的TryHackMe实验房间所提供的任务文件,或者在启动目标机器之后,使用wget http://10.10.205.239:9999/Credentials/BastionHostingCreds.zip命令来下载任务文件。

本小节的示例场景:

Bastion Hosting 三个月前遭到网络攻击,这次攻击导致他们所有员工的用户名、电子邮件和明文密码都被泄露;虽然员工被告知立即更改密码,但是,其中有一两个员工并没有当回事...

由于我们已经有了用户名列表和密码列表,并且每个用户名都与一个密码相关联,因此我们可以避免直接进行暴力破解攻击,而是使用撞库攻击。

实践阶段

下载并解压缩由TryHackMe实验房间所提供的BastionHostingCreds.zip任务文件。

image

zip 文件应包含四个单词列表:

  • emails.txt
  • usernames.txt
  • passwords.txt
  • combined.txt

分别是包含泄露的电子邮件、用户名、密码的列表,最后一个是包含组合的电子邮件和密码的列表;我们将使用usernames.txt单词列表和passwords.txt单词列表来完成本小节的示例练习。

使用浏览器中导航到 http://10.10.205.239/support/login ,激活攻击机上的Burp 代理并开启拦截,然后在浏览器中进行登录操作,这将成功捕获到相关请求:

image

使用快捷键Ctrl + I将上图中的请求消息转发给Intruder功能模块,查看Positions子选项卡,确保以用户名和密码字段作为攻击位置并且选择"Pitchfork"攻击:

image

切换到"Payloads"子选项卡,我们可以发现我们有两个可用的有效载荷集:

image

虽然没有命名,但是我们知道在请求消息中用户名字段位于密码字段的左侧,所以上图中的第一个有效载荷集对应用户名字段,第二个有效载荷集则对应密码字段。

我们将这两个有效载荷集都设置为"Simple list"有效载荷类型,然后分别导入字典文件(转到"Payload Options"并选择"Load"按钮进行加载即可):

image

image

然后我们回到Intruder的Positions子选项卡,点击"Start Attack-开始攻击"按钮即可。

攻击完成后,我们将看到一个显示结果的新窗口,但同时我们也遇到了一个新问题,Burp发送了 100 个请求:我们应该如何知道哪些请求是有效的(如果有的话)?

image

最常见的解决方案是根据响应的状态代码来区分成功或不成功的登录请求(这仅在状态代码存在差异时才有效),在理想情况下,成功的登录请求将为我们提供 200 响应代码,而失败的登录请求将为我们提供 401 响应代码;然而,在许多情况下,我们可能只会看到 302 响应代码(302代表重定向)。

如果无法根据响应代码找到有效请求,那么我们现在要采用的解决方案是基于响应消息的长度来识别请求之间的差异,例如,成功的登录尝试请求可能会产生一个包含 400 字节的响应消息,而不成功的登录尝试请求可能会产生一个包含 600 字节的响应消息(因为不成功的请求所对应的响应消息会包含错误提示信息)。

我们可以在显示结果的窗口中单击"Length"列,这将按字节长度对响应消息进行排序:

image

一旦我们对响应消息完成排序,我们就会发现与众不同的请求。

你可能已经猜到,响应长度较短的请求是使用有效凭据发出的(因为登录成功的响应将不会包含错误提示信息)——我们可以通过使用该凭据完成登录来进行确认。

  • 用户名:m.rivera
  • 密码:letmein1

image

我们通过撞库攻击成功地暴力破解了/support/login登录页面!

挑战任务练习

在上一小节中,我们已经成功获得了访问技术支持系统的权限,现在让我们看一下我们能利用这个页面做什么。

技术支持的主界面( http://10.10.205.239/support/ )向我们展示了一张票据表——如果我们点击表中的任何一行,我们就会被重定向到一个新页面,在那里我们可以查看完整的票据。

image

通过观察URL,我们可以看到这些票据页面是有编号的,例如:http://10.10.205.239/support/ticket/NUMBER

那么,这意味着什么呢?

编号意味着我们可以知道上述这些票据不是用难以猜到的id来识别的——这些票据都会被分配一个整数标识符。

如果我们使用Intruder对/support/ticket/NUMBER端点进行模糊测试会发生什么?可能会发生以下两种情况:

  1. 端点已经过正确设置,只允许我们查看分配给当前用户的票据;
  2. 端点并没有设置正确的访问控制机制,这将允许我们能够读取所有的现有票据。

如果是第二种情况,则说明目标页面存在一个被称为IDOR(Insecure Direct Object References-不安全的直接对象引用)的漏洞。

答题

我们只需要对一个位置进行模糊测试,所以应该选择使用Intruder中的Sniper攻击。

我们选择对 http://10.10.205.239/support/ticket/78 进行模糊测试(发送针对相关页面的请求并进行捕获,将请求转发给Intruder):

image

image

攻击完成后,我们将看到一个显示结果的新窗口,选择按状态码排序,发现一共有五个响应码为200的登录尝试,我们需要找到包含flag的票据:

image

image

我们找到的flag内容为:THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl} 。

image

综合练习-绕过CSRF Token(令牌)

使用Burp代理捕获到发送给 http://10.10.205.239/admin/login/ 的请求并检查响应消息:

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Fri, 20 Aug 2021 22:31:16 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Set-Cookie: session=eyJ0b2tlbklEIjoiMzUyNTQ5ZjgxZDRhOTM5YjVlMTNlMjIzNmI0ZDlkOGEifQ.YSA-mQ.ZaKKsUnNsIb47sjlyux_LN8Qst0; HttpOnly; Path=/
Vary: Cookie
Front-End-Https: on
Content-Length: 3922
---
<form method="POST">
    <div class="form-floating mb-3">
        <input class="form-control" type="text" name=username  placeholder="Username" required>
        <label for="username">Username</label>
    </div>
    <div class="form-floating mb-3">
        <input class="form-control" type="password" name=password  placeholder="Password" required>
        <label for="password">Password</label>
    </div>
    <input type="hidden" name="loginToken" value="84c6358bbf1bd8000b6b63ab1bd77c5e">
    <div class="d-grid"><button class="btn btn-warning btn-lg" type="submit">Login!</button></div>
</form>

image

我们有和上文示例一样的用户名和密码字段,但是此时在响应中还设置了一个会话cookie,以及一个CSRF(跨站点请求伪造)令牌作为隐藏字段(loginToken)被包含在表单中。

如果刷新此页面,我们看到这两个值(会话cookie和loginToken)都会随着每次请求而改变:这意味着在每次发出请求时,都需要重新从这两个字段中提取有效值。

换句话说,每次尝试登录时,我们都需要唯一的会话cookie值以及隐藏在输入表单中的loginToken值。

接下来我们需要使用Burp Suite中的“Macros(宏)”功能。

在许多情况下,我们可以使用被称为“Recursive Grep(递归提取)”的有效载荷类型来尝试令牌绕过,但不幸的是,在本小节示例中,由于目标web应用程序会将我们重定向回登录页面,而不是简单地向我们显示两个目标参数,因此我们将需要以更艰难的方式来实现令牌绕过。

具体来说,我们必须定义一个“Macros(宏)”(即一组简短的重复操作),并且让“Macros(宏)”在每个请求发送之前执行,这将获取到一个唯一的会话cookie和匹配的登录令牌,然后就可以将它们替换到我们的每个攻击请求中。

操作

使用浏览器导航到: http://10.10.205.239/admin/login/

image

激活Burp代理并在浏览器中尝试登录上图页面,这将捕获到相关请求,我们将请求发送给Intruder即可。

将攻击类型设置为“Pitchfork”,然后清除所有预定义位置仅选择用户名和密码字段,其他两个位置(会话cookie和loginToken)将由我们的宏进行处理。

image

接着切换到Payloads子选项卡,加载我们之前使用过的 用于支持登录攻击的用户名字典和密码字典(操作过程和前文一样)。

处理好用户名和密码参数后,我们现在需要找到一种方法来获取不断变化的会话cookie和loginToken,不幸的是,由于重定向响应,使用"Recursive Grep(递归提取)"有效载荷类型在这里不起作用,因此我们不能完全在Intruder中执行令牌绕过操作——我们将需要构建一个“Macros(宏)”。

宏(Macros)允许我们重复执行同一组动作,在本例中,我们想向/admin/login/发送GET请求。

  • 切换到 "Project Options" 选项卡,然后再切换到 "Sessions(会话)" 子选项卡。
  • 向下滚动到子选项卡底部的“Macros(宏)”部分,然后单击“Add(添加)”按钮。
  • 出现的菜单将向我们显示我们的请求历史记录,如果此处列表中没有发送到http://10.10.205.239/admin/login/的GET请求,我们可以在浏览器中导航到/admin/login/位置,然后我们就会看到GET请求出现在历史记录列表中。
  • 选择我们需要的GET请求后,单击“Ok(确定)”。
  • 最后,给宏(Macros)一个合适的名称,然后再次单击“Ok(确定)”完成宏定义过程。

image

image

image

现在我们已经定义了宏,我们还需要设置会话处理规则来定义如何使用宏。

  • 在Project Options的"Sessions"子选项卡中,向上滚动到“Session Handling Rules(会话处理规则)”部分,并选择“Add(添加)”一个新规则。

  • 这将弹出一个新窗口,其中有两个选项卡:“Details”和“Scope”;在默认情况下,我们将位于Details选项卡中。

    image

  • 我们可以在上图中填写适当的描述,然后切换到Scope(范围)选项卡。

  • 在"Tools Scope"部分,取消选中Intruder以外的所有复选框——我们不需要将此规则应用于其他任何地方。

  • 在"URLScope"部分,选择"Use suite scope",这会将宏设置为仅在已添加到全局范围的站点上运行,如果尚未设置全局范围,可以将 "Use custom scope"选项保留为默认值并添加http://10.10.205.239/

    image

现在我们需要切换回Details选项卡并查看"Rule Actions"部分。

  • 点击 "Add" 按钮——这将出现一个下拉菜单,列出我们可以添加的操作。
  • 从菜单列表中选择"Run a Macro"。
  • 在出现的新窗口中,选择我们之前所创建的宏。

image

image

现在,我们可以使用这个宏在Intruder发送请求之前覆盖某些参数,这意味着我们能够尝试得到会话cookie和loginTokens,并将它们的值直接添加到我们的请求中;简而言之——在Intruder开始攻击之前,我们可以限制仅更新哪些参数以及cookies,从而能够将会话cookie和loginTokens添加到攻击请求中:

  • 选择 "Update only the following parameters(仅更新以下参数)",然后单击单选按钮下方输入框旁的“编辑”按钮。
  • 在"Enter a new item(输入新项目)"文本框中,输入"loginToken",点击"添加",再点击"关闭"。
  • 选择 "Update only the following cookies(只更新以下cookies)",然后点击相应的“编辑”按钮。
  • 在"Enter a new item(输入新项目)"文本框中,输入"session",按“添加”,然后按“关闭”。
  • 最后,点击Ok确认我们的操作。

image

现在你应该已经配置好了一个宏,这个宏将会替换攻击请求中的CSRF令牌和会话cookie,我们剩下要做的就是切换回Intruder并开始攻击!

注意:在这种攻击中,每个攻击请求都应该得到302状态码响应,如果你看到的是403错误状态码,那么则说明你的宏没有正常工作。

与我们之前在上文中执行的登录凭据填充攻击一样,这里的响应代码都是相同的(302重定向),同样,我们可以根据长度对响应消息进行排序,以找到有效的登录凭据;你将看到相当多不同的响应长度,然而,表示成功登录的响应消息仍然会显著地更短。

image

使用我们刚刚找到的凭据进行登录(在输入凭据之前,你可能需要刷新登录页面)。

  • 用户名:o.bennett
  • 密码:bella1

image