List

1.前言
2.加载Python插件扩展
3.官方示例插件扩展解析
3.1 Hello world 示例插件解析
3.2 Event listeners 示例插件解析
3.3 Traffic redirector 示例插件解析


[Tips] 转载请保留原文链接及作者.


0x1 前言

想学一下 Python 编写 BurpSuite 的插件扩展,找不到学习的头绪,在 BurpSuite 官方发现给出了不同语言(java,python,ruby)编写的简单插件示例,这里选择 Python 语言,别问。本文输出官方插件件扩展示例解析,遇到不懂的就查官方的API,然后谷歌翻译来一遍并记录,自己再敲一遍就完事了。

https://portswigger.net/burp/extender#SampleExtensions

85681-8l10o5n24ux.png

https://portswigger.net/burp/extender/api/index.html

52714-2rx8q1knwbp.png


0x2 加载Python插件扩展

下载 jython并在 BurpSuite 的 Extender 的 Options 中配置 jython 环境。

75148-rqmji8z0xyi.png


0x3 官方示例插件扩展解析

3.1 Hello world 示例插件解析

查看官方给出的第一个插件示例,这是一个非常简单的扩展,它将一些输出打印到 Burp 中的不同位置。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from burp import IBurpExtender
from java.io import PrintWriter
from java.lang import RuntimeException

class BurpExtender(IBurpExtender):
    
    # 所有扩展都必须实现此接口。 实现必须在burp包中称为BurpExtender,必须声明为public,并且必须提供默认(公共,无参数)构造函数。
    # implement IBurpExtender
    # 实现 IBurpExtender
    
    def    registerExtenderCallbacks(self, callbacks):

        # registerExtenderCallbacks Burpsuite 加载扩展时,将调用此方法。
        # callbacks 参数 - 回调 IBurpExtenderCallbacks 类的对象。

        # set our extension name
        callbacks.setExtensionName("Hello world extension")
        # setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。
        
        # obtain our output and error streams
        stdout = PrintWriter(callbacks.getStdout(), True)
        # getStdout() 此方法用于获取当前扩展的标准输出流。 扩展应该将所有输出写入此流,从而允许Burp用户配置如何在UI中处理该输出。
        stderr = PrintWriter(callbacks.getStderr(), True)
        # getStderr() 此方法用于获取当前扩展的标准错误流。 扩展程序应将所有错误消息写入此流,从而允许Burp用户配置如何在UI中处理该输出。
        
        # write a message to our output stream
        stdout.println("Hello output")
        # 成功安装则在标准UI中显示输出 Hello output。

        # write a message to our error stream
        stderr.println("Hello errors")
        # 安装失败则在错误UI中输出 Hello errors。

        # write a message to the Burp alerts tab
        callbacks.issueAlert("Hello alerts")
        # 在Burpsuite 仪表盘事件日志过滤器中的调试输出 Hello alerts。
        
        # throw an exception that will appear in our error stream
        raise RuntimeException("Hello exception")
        # 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

60406-ly65o544c3e.png

46880-dtqgkrfrltk.png

3.2 Event listeners 示例插件解析

此扩展为各种运行时事件注册侦听器,并在每个事件发生时打印消息。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from burp import IBurpExtender
from burp import IHttpListener
from burp import IProxyListener
from burp import IScannerListener
from burp import IExtensionStateListener
from java.io import PrintWriter

class BurpExtender(IBurpExtender, IHttpListener, IProxyListener, IScannerListener, IExtensionStateListener):
    
    # 所有扩展都必须实现此接口。 实现必须在burp包中称为BurpExtender,必须声明为public,并且必须提供默认(公共,无参数)构造函数。
    # implement IBurpExtender
    # 实现 IBurpExtender
    
    def    registerExtenderCallbacks(self, callbacks):
        # keep a reference to our callbacks object
        self._callbacks = callbacks
        
        # set our extension name
        callbacks.setExtensionName("Event listeners")
        # setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。
        
        # obtain our output stream
        self._stdout = PrintWriter(callbacks.getStdout(), True)
        # getStdout() 此方法用于获取当前扩展的标准输出流。 扩展应该将所有输出写入此流,从而允许Burp用户配置如何在UI中处理该输出。

        # register ourselves as an HTTP listener
        callbacks.registerHttpListener(self)
        # registerHttpListener() 此方法用于注册一个侦听器,该侦听器将被通知任何Burp工具发出的请求和响应。
        
        # register ourselves as a Proxy listener
        callbacks.registerProxyListener(self)
        # registerProxyListener() 此方法用于注册一个侦听器,该侦听器将收到有关代理工具正在处理的请求和响应的通知。
        
        # register ourselves as a Scanner listener
        callbacks.registerScannerListener(self)
        # registerScannerListener() 此方法用于注册一个侦听器,该侦听器将被通知由扫描程序工具报告的新问题。 扩展程序可以通过注册扫描器侦听器来执行自定义分析或记录扫描器问题。

        # register ourselves as an extension state listener
        callbacks.registerExtensionStateListener(self)
        # registerExtensionStateListener() 此方法用于注册一个侦听器,该侦听器将收到有关扩展状态更改的通知。
    
    #
    # implement IHttpListener
    # 当即将发出HTTP请求时,以及在收到HTTP响应时,将调用此方法。

    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        # messageIsRequest boolean 标记是否正在为请求或响应调用该方法,输出1为请求,0为响应。
        # self._stdout.println(messageIsRequest)
       
        self._stdout.println(
                ("HTTP request to " if messageIsRequest else "HTTP response from ") +
                messageInfo.getHttpService().toString() +
                " [" + self._callbacks.getToolName(toolFlag) + "]")
        
        # toolFlag  int 指示发出请求的Burp工具的标志。Burp工具标志在IBurpExtenderCallbacks接口中定义。
        # callbacks.getToolName 此方法用于获取由提供的工具标志标识的Burp工具的描述性名称。
        # messageInfo 要处理的请求/响应的详细信息。扩展可以调用这个对象上的setter方法来更新当前消息,从而修改Burp的行为。
        # getHttpService() 此方法用于检索此请求/响应的HTTP服务。
        # java toString() 方法返回此对象本身(它已经是一个字符串)。
        # self._stdout.println(messageInfo.getHttpService().toString())    输出请求的host http://127.0.0.1


    #
    # implement IProxyListener
    # 当代理正在处理HTTP消息时,将调用此方法。

    def processProxyMessage(self, messageIsRequest, message):
        # messageIsRequest boolean 标记是否正在为请求或响应调用该方法,输出1为请求,0为响应。
        self._stdout.println(
                ("Proxy request to " if messageIsRequest else "Proxy response from ") +
                message.getMessageInfo().getHttpService().toString())
        
        # self._stdout.println(messageInfo.getHttpService().toString())    输出请求的host http://127.0.0.1

    #
    # implement IScannerListener
    # 将新问题添加到Burp Scanner的结果时,将调用此方法。

    def newScanIssue(self, issue):

        self._stdout.println("New scan issue: " + issue.getIssueName())
        # issue 扩展程序可以查询的IScanIssue对象,以获取有关新问题的详细信息。
        # getIssueName() 此方法返回问题类型的名称。

    #
    # implement IExtensionStateListener
    # 

    def extensionUnloaded(self):
        # 卸载扩展时调用此方法。
        self._stdout.println("Extension was unloaded")

14004-wp30achy2e.png

93564-iqeqpenwinj.png

3.3 Traffic redirector 示例插件解析

该扩展将所有出站请求从一台主机重定向到另一台。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from burp import IBurpExtender
from burp import IHttpListener

HOST_FROM = "www.secbook.com"
HOST_TO = "www.baidu.com"

class BurpExtender(IBurpExtender, IHttpListener):

    #
    # implement IBurpExtender
    # 实现 IBurpExtender
    
    def    registerExtenderCallbacks(self, callbacks):
        # obtain an extension helpers object
        self._helpers = callbacks.getHelpers()
        # getHelpers() 此方法用于获取IExtensionHelpers对象,扩展可使用该对象执行许多有用的任务。
        
        # set our extension name
        callbacks.setExtensionName("Traffic redirector")
        # setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。
        
        # register ourselves as an HTTP listener
        callbacks.registerHttpListener(self)
        # registerHttpListener() 此方法用于注册一个侦听器,该侦听器将被通知任何Burp工具发出的请求和响应。

    #
    # implement IHttpListener
    # 实现 IHttpListener
    
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        # only process requests
        if not messageIsRequest:
            # # 判断如果返回响应则结束该函数。
            return

        # get the HTTP service for the request
        # 获取请求的HTTP服务
        httpService = messageInfo.getHttpService()
        # getHttpService() 此方法用于检索此请求/响应的HTTP服务。
        
        # if the host is HOST_FROM, change it to HOST_TO
        # 如果 host 为 HOST_FROM ,就更改为 HOST_TO
        if (HOST_FROM == httpService.getHost()):
            # httpService.getHost() 此方法返回服务的主机名或IP地址。
            # This method returns the hostname or IP address for the service.
            messageInfo.setHttpService(self._helpers.buildHttpService(HOST_TO,
                httpService.getPort(), httpService.getProtocol()))

            # setHttpService() 此方法用于更新此请求/响应的HTTP服务。
            # buildHttpService() 此方法根据提供的详细信息构造IHttpService对象。
            # httpService.getPort() 此方法返回服务的端口号。
            # httpService.getProtocol() 此方法返回服务的协议。预期值为"http"或"https"。

50815-ff6koaaj955.png

这里不够明显还记得Event listeners 示例插件吗?
它会将各种运行时的事件打印出来。

73317-e0ypuchlq7k.png

可以看到请求的Host为 www.secbook.info 域名返回HTTP信息的则是 www.baidu.com 返回。
Traffic redirector 该插件扩展强制修改了HTTP请求包中的 Host 来达到重定向的效果。


0x3 待更新

参考:
https://portswigger.net/burp/extender#SampleExtensions
https://portswigger.net/burp/extender/api/index.html
https://search.maven.org/artifact/org.python/jython-standalone/2.7.2/jar
https://translate.google.cn/

标签: Web安全, 安全工具

添加新评论

marisa.png