Burp Extender Apis 插件开发 (一)


由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

前言

BurpSuite允许使用者编写自己的自定义插件,支持的插件类型有Java、Python、Ruby三种,该系列主要分享python编写。

安装环境

先需要安装jython环境,下载地址https://www.jython.org/download

Burp Extender Apis 插件开发 (一)

下载好jython后,开始配置burpsuite,如下图所示

Burp Extender Apis 插件开发 (一)

那么这时候就已经配置好burpsuite的jython环境和模块,只要加载py脚本即可。

No.4 Burp Extender Apis

介绍下burpsuite提供的各个接口。burpsuite软件本身也提供了api文档

Burp Extender Apis 插件开发 (一)

也可以查看官方api地址:https://portswigger.net/burp/extender/api/allclasses-noframe.html

Burp Extender Apis 插件开发 (一)

接口大致可以分为四类

插件入口和帮助接口类:IBurpExtender、IBurpExtenderCallbacks、IExtensionHelpers、IExtensionStateListener

IBurpExtender接口类是Burp插件的入口,所有Burp的插件均需要实现此接口,并且类命名为BurpExtender。IBurpExtenderCallbacks接口类是IBurpExtender接口的实现类与Burp其他各个组件(Scanner、Intruder、Spider......)、各个通信对象(HttpRequestResponse、HttpService、SessionHandlingAction)之间的纽带。IExtensionHelpers、IExtensionStateListener这两个接口类是插件的帮助和管理操作的接口定义。

UI相关接口类:IContextMenuFactory、IContextMenuInvocation、ITab、ITextEditor、IMessageEditor、IMenuItemHandler

这类接口类主要是定义Burp插件的UI显示和动作的处理事件,主要是软件交互中使用。

Burp工具组件接口类:IInterceptedProxyMessage、IIntruderAttack、IIntruderPayloadGenerator、IIntruderPayloadGeneratorFactory、IIntruderPayloadProcessor、IProxyListener、IScanIssue、IScannerCheck、IScannerInsertionPoint、IScannerInsertionPointProvider、IScannerListener、IScanQueueItem、IScopeChangeListener

这些接口类的功能非常好理解,Burp在接口定义的命名中使用了的见名知意的规范,看到接口类的名称,基本就能猜测出来这个接口是适用于哪个工具组件。

HTTP消息处理接口类:ICookie、IHttpListener、IHttpRequestResponse、IHttpRequestResponsePersisted、IHttpRequestResponseWithMarkers、IHttpService、IRequestInfo、IParameter、IResponseInfo

这些接口的定义主要是围绕HTTP消息通信过程中涉及的Cookie、Request、Response、Parameter几大消息对象,通过对通信消息头、消息体的数据处理,来达到控制HTTP消息传递的目的。


No.5 尝试写一个最简单的demo

首先导入Burp插件的入口IBurpExtender接口类,因为后续所有的功能代码都是从该类里编写from burp import IBurpExtender所有Burp的插件均需要实现此接口,并且类命名为BurpExtenderclass BurpExtender(IBurpExtender):加载扩展时调用此方法。它注册IBurpExtenderCallbacks接口的实例 ,并且提供扩展可以调用的方法来执行各种操作。def registerExtenderCallbacks(self, callbacks):整体代码如下:

from burp import IBurpExtenderclass BurpExtender(IBurpExtender):def registerExtenderCallbacks(self, callbacks):# your extension code herereturn

这个空的扩展不执行任何操作,但是仍然可以将其加载到Burp中

Burp Extender Apis 插件开发 (一)

成功加载我们自己自定义的py插件

Burp Extender Apis 插件开发 (一)

Burp Suite使用此接口将一组回调方法传递给扩展,扩展可以使用这些回调方法在Burp中执行各种操作。加载扩展时,Burp调用其 registerExtenderCallbacks()方法并传递IBurpExtenderCallbacks接口的实例 。然后,扩展可以根据需要调用此接口的方法,以扩展Burp的功能。

下面学习各个模块的触发代码以及如何生成上下文菜单

No.6 IBurpExtenderCallbacks

来看下此接口有哪些方法

Burp Extender Apis 插件开发 (一)

可以看到方法非常的多,根据自己的需求选择对应的方法。setExtensionName(java.lang.String name)此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。self._callbacks.setExtensionName("SQL Inject")

Burp Extender Apis 插件开发 (一)

注册功能

# 注册一个 HTTP 监听器,那么当我们开启Burp监听的 HTTP 请求或收到的 HTTP 响应都会通知此监听器callbacks.registerHttpListener(self)# 注册菜单上下文# register message editor tab factorycallbacks.registerMessageEditorTabFactory(self)# register menu item factorycallbacks.registerContextMenuFactory(self)# 注册扫描callbacks.registerScannerCheck(self)

getHelpers() 调用该方法返回对象IExtensionHelpers此方法用于获取IExtensionHelpers对象,扩展可以使用该对象构建和分析HTTP请求。self._helpers = callbacks.getHelpers()那么代码就可以写成如下:

class BurpExtender(IBurpExtender, IHttpListener):def registerExtenderCallbacks(self, callbacks):self._callbacks = callbacks# 用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。self._helpers = callbacks.getHelpers()# 用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name - 扩展名。。self._callbacks.setExtensionName("SQL Inject")# 注册一个 HTTP 监听器,那么当我们开启Burp监听的 HTTP 请求或收到的 HTTP 响应都会通知此监听器callbacks.registerHttpListener(self)# 注册菜单上下文# register message editor tab factorycallbacks.registerMessageEditorTabFactory(self)# register menu item factorycallbacks.registerContextMenuFactory(self)# 注册扫描callbacks.registerScannerCheck(self)

最简单的一个基础配置写好了,接下来实现功能。

No.7 processHttpMessage

刚才介绍了registerHttpListener方法注册了监听器,那么只要Burp监听到数据包,就会调用processHttpMessage方法。processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)下面是代码和参数的介绍

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):''':param toolFlag: 一个标志,指示发出请求的Burp工具,Burp工具标志在IBurpExtenderCallbacks界面中定义.例如Proxy和Repeater触发插件:param messageIsRequest: 标记是否为请求数据包或响应数据包:param messageInfo: 要处理的请求/响应的详细信息。扩展可以调用此对象上的setter方法来更新当前消息,从而修改Burp的行为。:return:'''

这里toolFlag的数字代表模块,例如哪个模块触发监听器,比如Proxy或者Repeater等官网给的链接:https://portswigger.net/burp/extender/api/constant-values.html#burp.IBurpExtenderCallbacks

Burp Extender Apis 插件开发 (一)

那么我只想要Proxy和Repeater触发插件的功能,代码则如下:

# Proxy和Repeater触发插件if toolFlag == 64 or toolFlag == 4:

整体代码如下:

# -*-coding:utf-8 -*-# Burp监听到数据包,就会调用processHttpMessage方法from burp import IBurpExtender, IHttpListenerSLEEP_TIME = 10class BurpExtender(IBurpExtender, IHttpListener):def registerExtenderCallbacks(self, callbacks):self._callbacks = callbacks# 用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。self._helpers = callbacks.getHelpers()# 用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name - 扩展名。。self._callbacks.setExtensionName("processHttpMessage")# 用于注册侦听器,该侦听器将通知任何Burp工具发出的请求和响应。扩展可以通过注册HTTP侦听器来执行自定义分析或修改这些消息。参数:listener- 实现IHttpListener接口的扩展创建的对象 。callbacks.registerHttpListener(self)def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):''':param toolFlag: 一个标志,指示发出请求的Burp工具,Burp工具标志在IBurpExtenderCallbacks界面中定义.例如Proxy和Repeater触发插件:param messageIsRequest: 标记是否为请求数据包或响应数据包:param messageInfo: 要处理的请求/响应的详细信息。扩展可以调用此对象上的setter方法来更新当前消息,从而修改Burp的行为。:return:'''# Proxy和Repeater触发插件if toolFlag == 64 or toolFlag == 4:# 处理响应内容if not messageIsRequest:print 'call processHttpMessage'

实践:加载py脚本

Burp Extender Apis 插件开发 (一)

repeater发送数据包

Burp Extender Apis 插件开发 (一)

成功触发方法

Burp Extender Apis 插件开发 (一)


No.8 createMenultems

创建上下文菜单,类似于下图所示官方api介绍地址:https://portswigger.net/burp/extender/api/burp/IContextMenuFactory.html

Burp Extender Apis 插件开发 (一)

需要导入以下模块

from burp import IBurpExtender, IMessageEditorTabFactory, IContextMenuFactoryfrom javax.swing import JMenuItem

需要注册菜单

# register message editor tab factorycallbacks.registerMessageEditorTabFactory(self)# register menu item factorycallbacks.registerContextMenuFactory(self)

创建上下文菜单,触发run方法

# 创建菜单右键def createMenuItems(self, invocation):self.invocation = invocationmenu_list = []menu_list.append(JMenuItem("Send to createMenuItems", None,actionPerformed=self.run))return menu_list

定义run方法

def run(self, event):print 'call createMenuItems'

整体代码如下

# -*-coding:utf-8 -*-# 右键菜单from burp import IBurpExtender, IMessageEditorTabFactory, IContextMenuFactoryfrom javax.swing import JMenuItemclass BurpExtender(IBurpExtender, IMessageEditorTabFactory, IContextMenuFactory):def registerExtenderCallbacks(self, callbacks):self._callbacks = callbacks# 用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。self._helpers = callbacks.getHelpers()# 用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name - 扩展名。。self._callbacks.setExtensionName("createMenuItems")# register message editor tab factorycallbacks.registerMessageEditorTabFactory(self)# register menu item factorycallbacks.registerContextMenuFactory(self)# 创建菜单右键def createMenuItems(self, invocation):self.invocation = invocationmenu_list = []menu_list.append(JMenuItem("Send to createMenuItems", None,actionPerformed=self.run))return menu_listdef run(self, event):print 'call createMenuItems'

实践:右键点击Send to createMenuItems

Burp Extender Apis 插件开发 (一)

成功触发

Burp Extender Apis 插件开发 (一)

这里抛出一个问题:那就是界面卡死问题。当我们想写一个检测注入漏洞的插件时,payload很多,那么burp会等待payload运行完才会反应,这样就陷入了卡死。下节课讲解如何解决payload很多,burp卡死问题。

本文作者是属于水滴实验室。以复杂对抗为主,通过研究流量特征分析对抗技术、防御技术与终端安全防御技术来发现防护体系不足,增强产品能力提升。实验室成员均来多年攻防经验的研究员,拥有非常完善的攻防经验,为产品检测、安全防御能力检测提供了强有力的保障,同时主要担任红蓝对抗业务,以红队视角评估企业安全防护体系。



分享到:


相關文章: