BurpExtenderApis插件开发(一)

放大字体  缩小字体 发布日期:2020-02-17  来源:来自互联网  作者:来自互联网  浏览次数:113
导读

IBurpExtender接口类是Burp插件的入口,所有Burp的插件均需要实现此接口,并且类命名为BurpExtender。 所有Burp的插件均需要实现此接口,并且类命名为BurpExtend…

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

前言

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

安装环境

先需要安装jython环境,下载地址

https://jython.org/download

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

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

No.4Burp Extender Apis

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

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

接口大致可以分为四类

插件入口和帮助接口类: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的插件均需要实现此接口,并且类命名为BurpExtender

class BurpExtender(IBurpExtender):

加载扩展时调用此方法。它注册IBurpExtenderCallbacks接口的实例 ,并且提供扩展可以调用的方法来执行各种操作。

def registerExtenderCallbacks(self, callbacks):

整体代码如下:

from burp import IBurpExtender

class BurpExtender(IBurpExtender):

def registerExtenderCallbacks(self, callbacks):

# your extension code here

return

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

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

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

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

No.6IBurpExtenderCallbacks

来看下此接口有哪些方法

可以看到方法非常的多,根据自己的需求选择对应的方法。

setExtensionName(java.lang.String name)

此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。

self._callbacks.setExtensionName("SQL Inject")

注册功能

# 注册一个 HTTP 监听器,那么当我们开启Burp监听的 HTTP 请求或收到的 HTTP 响应都会通知此监听器

callbacks.registerHttpListener(self)

# 注册菜单上下文

# register message editor tab factory

callbacks.registerMessageEditorTabFactory(self)

# register menu item factory

callbacks.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 factory

callbacks.registerMessageEditorTabFactory(self)

# register menu item factory

callbacks.registerContextMenuFactory(self)

# 注册扫描

callbacks.registerScannerCheck(self)

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

No.7processHttpMessage

刚才介绍了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/burp/extender/api/constant-values.html#burp.IBurpExtenderCallbacks

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

# Proxy和Repeater触发插件

if toolFlag == 64 or toolFlag == 4:

整体代码如下:

# -*-coding:utf-8 -*-

# Burp监听到数据包,就会调用processHttpMessage方法

from burp import IBurpExtender, IHttpListener

SLEEP_TIME = 10

class 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脚本

repeater发送数据包

成功触发方法

No.8createMenultems

创建上下文菜单,类似于下图所示

官方api介绍地址:https://portswigger/burp/extender/api/burp/IContextMenuFactory.html

需要导入以下模块

from burp import IBurpExtender, IMessageEditorTabFactory, IContextMenuFactory

from javax.swing import JMenuItem

需要注册菜单

# register message editor tab factory

callbacks.registerMessageEditorTabFactory(self)

# register menu item factory

callbacks.registerContextMenuFactory(self)

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

# 创建菜单右键

def createMenuItems(self, invocation):

self.invocation = invocation

menu_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, IContextMenuFactory

from javax.swing import JMenuItem

class 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 factory

callbacks.registerMessageEditorTabFactory(self)

# register menu item factory

callbacks.registerContextMenuFactory(self)

# 创建菜单右键

def createMenuItems(self, invocation):

self.invocation = invocation

menu_list = []

menu_list.append(JMenuItem("Send to createMenuItems", None,

actionPerformed=self.run))

return menu_list

def run(self, event):

print 'call createMenuItems'

实践:

右键点击Send to createMenuItems

成功触发

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

下节课讲解如何解决payload很多,burp卡死问题。

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

本文转载自雷神众测

 
 
打赏
免责声明
• 
本文为会员发布,作者: 来自互联网。欢迎转载,转载请注明原文出处:http://www.zneh.com/znkb/show-354063.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。