声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
前言
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卡死问题。
本文作者是属于水滴实验室。以复杂对抗为主,通过研究流量特征分析对抗技术、防御技术与终端安全防御技术来发现防护体系不足,增强产品能力提升。实验室成员均来多年攻防经验的研究员,拥有非常完善的攻防经验,为产品检测、安全防御能力检测提供了强有力的保障,同时主要担任红蓝对抗业务,以红队视角评估企业安全防护体系。
本文转载自雷神众测