黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试

黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试


文章目录

  • 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试
  • 写在前面
  • 配置
  • 使用Burp进行模糊测试
    • API文档
    • 编写脚本bhp_fuzzer.py
      • BHPFuzzer类
      • 模糊化方法mutate_payload
    • 小试牛刀
      • 导入自定义模糊器
      • 设置代理
      • 攻击目标站点
    • 可执行的源代码


写在前面

如果您曾经尝试过对web应用程序进行黑客攻击,那么可能已经使用BurpSuite执行了爬虫、代理浏览器流量以及其它的攻击。BurpSuite还允许我们创建自己的工具,称为扩展。使用Python、Ruby或纯Java,我们可以在Burp GUI中添加面板,并将自动化技术构建到Burp Suite中。这一章节中,我们将利用此功能编写一些方便的工具来执行攻击和扩展侦察。第一个扩展将使用从BurpProxy截获的HTTP请求作为在BurpIntruder中运行的变异模糊器的种子。第二个扩展将与Microsoft Bing API通信,向我们显示与目标站点位于同一IP地址的所有虚拟主机,以及在目标域检测到的任何子域。最后,我们将构建一个扩展,从目标网站创建一个单词列表,可以在后续的暴力密码攻击中使用它。
本章节的内容均是假设我们已经玩过Burp,并且知道如何使用代理工具捕获请求,以及如何向Burp Intruder发送捕获的请求。不了解这些的小伙伴可以访问PortSwigger Web Security (http://www.portswigger.net/)查看。
当第一次开始探索Burp Extender API时,确实需要花一些时间才能了解它是如何工作的。这是比较困惑的,因为我是纯种的Python开发人员,Java开发经验有限。但在Burp网站上找到了一些扩展,这些扩展告诉我们其他人是如何开发扩展的。接下来,我们将会使用现有的技术来帮助我们了解如何开始实现自己的代码。本章将介绍一些关于扩展功能的基础知识,但是也会介绍如何使用API文档作为指南。

配置

默认情况下,kali上已经安装了Burp Suite。如果读者使用的是其他机器,可以从其官网(http://www.portswigger.net/)下载并进行设置。
不管怎么说,我们都需要安装一个Jave,Kali本身安装了一个。如果我们是在其它的平台上,请使用系统的安装方法(如apt、yum或rpm)来安装Java,然后安装Jython,一个用Java编写的Python 2实现。到目前为止,我们所有的代码都使用了Python3语法,但本章我们将回到Python2,这是Jython的需求。我们可以在No Starch网站上找到这个JAR文件,以及本书中的其余代码(https://www.nostarch.com/blackhatpython/),或在Jython的官方网站上(https://www.jython.org/download.html)。选择Jython 2.7独立安装程序,将JAR文件保存到合适的位置。
接下来,双击Kali机器上的Burp图标或从命令行运行Burp:

#> java -XX:MaxPermSize=1G -jar burpsuite_pro_v1.6.jar

这里需要说明一下,上述命令是原书中的,我这里运行不成功,我直接通过burpsuite即可运行kali自带的burp,不过遇到了一个小问题,如下图,貌似说Burp在我的JRE上没有经过充分测试。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第1张图片
既然是kali自带的,就这样先用着再说,毕竟没有直接说有问题。接下来点击“OK”,直接进入欢迎页,如下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第2张图片
现在让我们把Burp指向我们的Jython编译器。单击Extender选项卡,然后单击Options选项卡,在Python Environment部分,选择Jython JAR文件的位置,如下图所示,其它选项不用管,接下来我们将开始编写我们的第一个扩展。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第3张图片

使用Burp进行模糊测试

在渗透工作中,我们可能会发现自己正在攻击一个不允许使用传统web应用程序评估工具的web应用程序或服务。例如,应用程序使用了太多的参数,或者以某种方式对其进行了模糊处理,从而使执行手动测试非常耗时。这种情况下,我们面对的标准工具可能无法处理奇怪协议甚至在很多情况下无法处理JSON。在这里我们会发现非常有用的方式:在将请求主体传递给自定义模糊器的同时,建立可靠的HTTP流量基线,包括身份验证Cookie(感觉这里说的不像人话啊,反正我是没有听懂),然后模糊器可以以我们选择的任何方式操作有效载荷。接下来,我们通过创建世界上最简单的web应用程序模糊器来实现我们的第一个Burp扩展,之后我们再扩展更加智能化的工具。
Burp上有许多在执行web应用程序测试时可以使用的工具。通常,我们会使用代理捕获所有请求,当我们看到一个有趣的请求时,会将其发送到另一个Burp工具。一种常见的技术是将它们发送到Repeater工具,该工具允许我们重放网络流量以及手动修改任何感兴趣的内容。要在查询参数中执行更多的自动化的攻击,我们可以向Intruder工具发送请求,该工具尝试自动确定我们可能需要修改的web流量区域,然后允许我们使用各种攻击来尝试获取错误信息或梳理漏洞。Burp扩展可以以多种方式与Burp工具套件交互。在下面的案例中,我们将直接在Intruder工具上添加其它扩展功能。

API文档

首先我们可以看一下BurpAPI文档,以便确定编写自定义扩展时需要扩展哪些Burp类。单击Extender选项卡,然后单击APIs选项卡,我们可以看到这个文档,如下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第4张图片
这些API看起来有点令人畏惧,因为它非常Java-y。Burp的开发人员已经恰当地命名了每个类,我们可以很容易地找到我们想要从哪里开始。特别是,因为我们试图在渗透期间模糊web请求,所以可能希望重点关注IIntruderPayloadGeneratorFactory和IIntruderPayload Generator类,我们先看一文档中对IntruderPayloadGeneratorFactory类的描述吧:
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第5张图片
文档的第一部分告诉我们如何用Burp正确注册我们的扩展,我们将会扩展主Burp类以及IIntruderPayloadGeneratorFactory类。接下来,我们看到在我们的主类中Burp期望两个方法。Burp将调用getGeneratorName方法来检索我们的扩展的名称,并期望我们返回一个字符串;createNewInstance方法要求我们返回IIntruderPayloadGenerator的实例,这是我们必须创建的第二个类。

编写脚本bhp_fuzzer.py

现在让我们实现实际的Python代码来满足这些需求。这里,我们将会了解如何添加IIntruderPayloadGenerator类。先打开一个新的Python文件,将其命名为bhp_fuzzer.py,并输入以下代码:

from burp import IBurpExtender
from burp import IIntruderPayloadGeneratorFactory
from burp import IIntruderPayloadGenerator

from java.util import List, ArrayList

import random

class BurpExtender(IBurpExtender, IIntruderPayloadGeneratorFactory):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()

        callbacks.registerIntruderPayloadGeneratorFactory(self)

        return

    def getGeneratorName(self):
        return "BHP Payload Generator"
    
    def createNewInstance(self, attack):
        return BHPFuzzer(self, attack)

这个简单的框架概述了我们需要完成什么工作才能满足我们的第一组需求(检索我们的扩展的名称)。我们必须首先导入IBurpExtender类,这是我们今后编写的每个扩展时的基本要求。然后我们导了入创建Intruder有效载荷生成器所需的类。接下来我们定义了BurpExtender类,它扩展了IBurpExtender和IIntruderPayloadGeneratorFactory类。我们使用registerIntruderPayloadGeneratorFactory方法注册类,以使得Intruder工具能够知道我们可以生成有效载荷。然后我们实现getGeneratorName方法,只返回有效载荷生成器的名称。最后我们实现createNewInstance方法,该方法接收攻击参数并返回IIntruderPayloadGenerator类的实例,我们称之为BHPFuzzer。
我们先看一下IIntruderPayloadGenerator类的文档,以便了解要实现的内容:
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第6张图片
现在我们知道需要实现基类,它需要公开三个方法。第一个是hasMorePayloads方法,用于决定是否继续向Burp Intruder发送变异请求。我们将使用计数器来处理此问题。一旦计数器达到最大级别,我们将返回False以停止生成模糊用例。第二个是getNextPayload方法,用于从我们捕获的HTTP请求接收原始有效载荷。或者,如果我们在HTTP请求中选择了多个有效载荷区域,将只会收到我们计划进行模糊的字节(具体的后面再详细介绍)。该方法允许我们模糊化原始测试用例,然后将其返回给Burp进行发送。第三个是reset方法,如果我们生成一组已知的模糊请求,模糊器就可以迭代Intruder选项卡中指定的每个有效载荷位置的值。我们的模糊器没有那么挑剔,它总是随机地模糊每个HTTP请求。

BHPFuzzer类

现在我们看一下在Python中如何实现它。将以下代码添加到上面提到的bhp_fuzzer.py脚本的底部:

class BHPFuzzer(IIntruderPayloadGenerator):
    def __init__(self, extender, attack):
        self._extender = extender
        self.helpers = extender._helpers
        self._attack = attack
        self.max_payloads = 10
        self.num_iterations = 0
        return
    
    def hasMorePayloads(self):
        if self.num_iterations == self.max_payloads:
            return False
        else:
            return True
    
    def getNextPayload(self, current_payload):
        # convert into a string
        payload = ''.join(chr(x) for x in current_payload)

        # call our simple mutator to fuzz the POST
        payload = self.mutate_payload(payload)

        # increase the number of fuzzing attempts
        self.num_iterations += 1
        return payload    
    def reset(self):
        self.num_iterations = 0
        return

先定义一个BHPFuzzer类,它扩展了IntruderPayloadGenerator类,然后定义所需的类变量,并添加max_payloads和num_iterations变量,用于让Burp知道何时完成了模糊化。接下来,实现了hasMorePayloads方法,主要是检查是否达到了最大模糊迭代次数。接下来的getNextPayload方法接收原始HTTP有效载荷,并进行模糊化处理。current_payload变量作为字节数组传入,在方法内部先将字节数组转换为字符串,然后传递给mutate_payload模糊化方法。之后增加num_iterations变量用于记录模糊尝试的次数,并返回变异的有效载荷。最后一个是reset方法,它返回时不做任何事情。

模糊化方法mutate_payload

接下来,我们写一个最简单的模糊化方法,将下面的代码添加到上述bhp_fuzzer.py脚本的BHPFuzzer类中:

    def mutate_payload(self, original_payload):
        # pick a simple mutator or even call an external script
        picker = random.randint(1,3)
        # select a random offset in the payload to mutate
        offset = random.randint(0, len(original_payload) - 1)

        front, back = original_payload[:offset], original_payload[offset:]

        # random offset insert a SQL injection attempt
        if picker == 1:
            front += "'"
        # jam an XSS attempt in
        elif picker == 2:
            front += ""
        
        # repeat a random chunk of the original payload
        elif picker == 3:
            chunk_length = random.randint(0, len(back) - 1)
            repeater = random.randint(, 10)
            for _ in range(repeater):
                front += original_payload[:offset + chunk_length]
                
        return front + back

首先,我们将有效载荷分成两个随机长度的块,分别用front和back两个块表示。然后,我们从三个变异器中随机选择:一个简单的SQL注入测试,在front块的末尾添加一个单引号;一个跨脚本(XSS)测试,在front块的末尾添加脚本标记;一个“从原始载荷中选择一个随机块,并随机复制多次,并将结果添加到front块的末尾”的变异器。最后我们把原来的back块添加到修改后的front块后面,以生成修改后的有效载荷。现在,我们有了一个Burp Intruder扩展,并且可以使用。下面我们看看如何加载它。

小试牛刀

导入自定义模糊器

首先加载扩展并确保它不包含错误。单击Burp中的Extender选项卡,然后单击Add按钮,这时会弹框允许我们将Burp指向模糊器。确保设置的选项与下图所示的选项相同。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第7张图片
单击Next,Burp应该开始加载扩展。如果有错误,请单击“错误”选项卡,如下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第8张图片
调试任何输入的错误之后,然后单击“关闭”。我们的Extender屏幕应该如下图所示。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第9张图片
如您所见,我们的扩展已加载,Burp已识别注册的Intruder有效载荷生成器。

设置代理

接下来我们准备在真正的攻击中利用这个扩展。确保我们的web浏览器设置为在端口8080上使用Burp Proxy作为本地主机代理。如下图,先查看Burp上默认的proxy设置。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第10张图片
如果是在kali自带的Firefox上配置代理,可以参照下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第11张图片

攻击目标站点

现在,我们尝试攻击前面第5章攻击过的Acunetix web应用程序,只需浏览到http://testphp.vulnweb.com/即可。
作为测试,我们使用站点上的小搜索栏提交对字符串“test”的搜索。下图显示了如何在代理菜单的HTTP历史选项卡中查看此请求,右键单击请求,将其发送给Intruder。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第12张图片
现在切换到Intruder页面并单击Positions选项卡,这时可以看到突出显示每个查询参数的界面,这就是Burp识别我们应该模糊的点的方法。我们可以尝试移动载荷定界符,或者选择要模糊化的整个负载,但现在我们准备让Burp来决定模糊什么,如下图所示,它显示了有效载荷高亮显示的工作原理。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第13张图片
现在单击payloads选项卡,在这个界面中点击payload type下拉列表并选择Extension-generated。在Payload Options部分,单击Select generator…按钮,然后从下拉列表中选择BHP Payload Generator并点击OK确认,这时候我们的Payload界面应该展示类似下图所示的内容。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第14张图片
现在我们可以发送请求了。在Burp菜单栏顶部,单击Intruder,然后选择Start Attack,这里说明一下,kali自带的Burp是社区版,不是专业版,会收到如下图的提示信息。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第15张图片
点击OK,接下来试试看吧,Burp应该开始发送模糊请求,很快您就可以快速浏览结果了,可是我这里的界面上空空如也,并且唯一的响应消息中也没有出现原书中描述的SQL注入信息(我已经修改原书中的代码,只进行SQL注入的模糊器),如下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第16张图片
不知道是不是因为我中间干了一些其它事情,导致中间断了,我重新从头试一下还是不行。不折腾了,直接把原书网站上下载的代码导入进去试试看,很正常啊,如下图。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第17张图片
直接比对一下代码,发现好几个敲错的地方(牛逼就牛逼在我敲错的地方,在导入extender的时候都没有被检查出来),修改后重新导入自己敲的代码,然后重新运行,这下OK了。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第18张图片
这样一来,如我们所愿,可以看到原书中所示的SQL注入漏洞的告警了,如下图所示。
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第六章 扩展Burp代理(1)配置&Burp模糊测试_第19张图片
尽管我们构建这个模糊器只是为了演示,但读者会惊讶于它对于让web应用程序输出错误、泄露应用程序路径或生成许多其他扫描程序可能会忽略的行为是多么有效。最重要的是,我们成功地获得了自定义扩展来处理Burp的Intruder攻击。接下来的章节,我们将创建一个扩展,以帮助我们对web服务器执行扩展侦察。

可执行的源代码

依据惯例,附上可运行的代码。

from burp import IBurpExtender
from burp import IIntruderPayloadGeneratorFactory
from burp import IIntruderPayloadGenerator

from java.util import List, ArrayList

import random

class BurpExtender(IBurpExtender, IIntruderPayloadGeneratorFactory):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()

        callbacks.registerIntruderPayloadGeneratorFactory(self)

        return

    def getGeneratorName(self):
        return "BHP Payload Generator"
    
    def createNewInstance(self, attack):
        return BHPFuzzer(self, attack)

class BHPFuzzer(IIntruderPayloadGenerator):
    def __init__(self, extender, attack):
        self._extender = extender
        self.helpers = extender._helpers
        self._attack = attack
        self.max_payloads = 10
        self.num_iterations = 0
        return
    
    def hasMorePayloads(self):
        if self.num_iterations == self.max_payloads:
            return False
        else:
            return True
    
    def getNextPayload(self, current_payload):
        # convert into a string
        payload = ''.join(chr(x) for x in current_payload)

        # call our simple mutator to fuzz the POST
        payload = self.mutate_payload(payload)

        # increase the number of fuzzing attempts
        self.num_iterations += 1
        return payload
    
    def reset(self):
        self.num_iterations = 0
        return
    
    def mutate_payload(self, original_payload):
        # pick a simple mutator or even call an external script
        picker = random.randint(1,3)
        # select a random offset in the payload to mutate
        offset = random.randint(0, len(original_payload) - 1)

        front, back = original_payload[:offset], original_payload[offset:]

        # front += "'"

        # random offset insert a SQL injection attempt
        if picker == 1:
            front += "'"
        # jam an XSS attempt in
        elif picker == 2:
            front += ""
        
        # repeat a random chunk of the original payload
        elif picker == 3:
            chunk_length = random.randint(0, len(back) - 1)
            repeater = random.randint(1, 10)
            for _ in range(repeater):
                front += original_payload[:offset + chunk_length]

        return front + back

你可能感兴趣的:(黑帽Python第二版,Burp,Burp,Suite,模糊测试,Fuzzing,黑帽python)