No.1
新闻报道稿
虽然散播、利用该文所提供更多的信息而造成的任何人直接或是间接地的不良后果及经济损失,均由普通用户生前负责管理,火神众测以及该文译者不有鉴于此分担任何人职责。
火神众测拥有为此该文的修正和议决。轴果转发或散播此该文,必须确保此该文的准确性,包括著作权新闻报道稿等该文。需经火神众测容许,严禁任一修正或是不定此该文内容,严禁以任何人方式将其用于商业性目的。
No.2
序言
BurpSuite容许普通用户撰写自己的自订应用程序,支持的应用程序类别有Java、Python、Ruby四种,该系列产品主要就撷取python撰写。
No.3
加装自然环境
先须要加装jython自然环境,浏览门牌号
https://www.jython.org/download

浏览好jython后,开始实用性burpsuite,如下表所示图右图
那么这时就已经实用性好burpsuite的jython自然环境和组件,只要读取pyJAVA方可。
No.4
Burp Extender Apis
如是说下burpsuite提供更多的各USB。burpsuite应用软件这类也提供更多了api文件格式
也能查阅非官方api门牌号:https://portswigger.net/burp/extender/api/allclasses-noframe.html
USB大体能分为五类
应用程序出口处和协助USB类:IBurpExtender、IBurpExtenderCallbacks、IExtensionHelpers、IExtensionStateListener
IBurpExtenderUSB类是Burp应用程序的出口处,所有Burp的应用程序均须要同时实现此USB,并且类重新命名为BurpExtender。
IBurpExtenderCallbacksUSB类是IBurpExtenderUSB的同时实现类与Burp其他各组件(Scanner、Intruder、Spider......)、各通讯第一类(HttpRequestResponse、HttpService、SessionHandlingAction)之间的联结。
IExtensionHelpers、IExtensionStateListener这两个USB类是应用程序的协助和管理操作的USB表述。
UI相关USB类:IContextMenuFactory、IContextMenuInvocation、ITab、ITextEditor、IMessageEditor、IMenuItemHandler
这类USB类主要就是表述Burp应用程序的UI显示和姿势的TNUMBERAP,主要就是应用软件可视化中采用。
Burp辅助工具组件USB类:IInterceptedProxyMessage、IIntruderAttack、IIntruderPayloadGenerator、IIntruderPayloadGeneratorFactory、IIntruderPayloadProcessor、IProxyListener、IScanIssue、IScannerCheck、IScannerInsertionPoint、IScannerInsertionPointProvider、IScannerListener、IScanQueueItem、IScopeChangeListener
这些USB类的功能非常好认知,Burp在USB表述的重新命名中采用了的见名偶得的规范化,看到USB类的中文名称,基本就能揣测出来这个USB是适用于于别的辅助工具组件。
HTTP消息处理USB类:ICookie、IHttpListener、IHttpRequestResponse、IHttpRequestResponsePersisted、IHttpRequestResponseWithMarkers、IHttpService、IRequestInfo、IParameter、IResponseInfo
这些USB的表述主要就是围绕HTTP消息通讯过程中涉及的Cookie、Request、Response、Parameter几大消息第一类,通过对通讯消息头、消息体的数据处理,来达到控制HTTP消息传递的目的。
No.5
尝试写一个最简单的demo
首先导入Burp应用程序的出口处IBurpExtenderUSB类,因为后续所有的功能代码都是从该类里撰写
from burp import IBurpExtender
所有Burp的应用程序均须要同时实现此USB,并且类重新命名为BurpExtender
class BurpExtender(IBurpExtender):
读取扩展时调用此方法。它注册IBurpExtenderCallbacksUSB的实例 ,并且提供更多扩展能调用的方法来执行各种操作。
def registerExtenderCallbacks(self, callbacks):
整体代码如下表所示:
from burp import IBurpExtender
class BurpExtender(IBurpExtender):
def registerExtenderCallbacks(self, callbacks):
# your extension code here
return
这个空的扩展不执行任何人操作,但是仍然能将其读取到Burp中
成功读取我们自己自订的py应用程序
Burp Suite采用此USB将一组回调方法传递给扩展,扩展能采用这些回调方法在Burp中执行各种操作。读取扩展时,Burp调用其 registerExtenderCallbacks()方法并传递IBurpExtenderCallbacksUSB的实例 。然后,扩展能根据须要调用此USB的方法,以扩展Burp的功能。
下面学习各组件的触发代码以及如何生成上下文菜单
No.6
IBurpExtenderCallbacks
来看下此USB有哪些方法
能看到方法非常的多,根据自己的需求选择对应的方法。
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.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
那么我只想要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- 同时实现IHttpListenerUSB的扩展创建的第一类 。
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
实践:
读取pyJAVA
repeater发送数据包
成功触发方法
No.8
createMenultems
创建上下文菜单,类似于下图右图
非官方api如是说门牌号:https://portswigger.net/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卡死问题。
本文译者是属于水滴实验室。以复杂对抗为主,通过研究流量特征分析对抗技术、防御技术与终端安全防御技术来发现防护体系不足,增强产品能力提升。实验室成员均来多年攻防经验的研究员,拥有非常完善的攻防经验,为产品检测、安全防御能力检测提供更多了强有力的保障,同时主要就担任红蓝对抗业务,以红队视角评估企业安全防护体系。