聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
前言
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卡死問題。
本文作者是屬于水滴實驗室。以復雜對抗為主,通過研究流量特征分析對抗技術、防御技術與終端安全防御技術來發現防護體系不足,增強產品能力提升。實驗室成員均來多年攻防經驗的研究員,擁有非常完善的攻防經驗,為產品檢測、安全防御能力檢測提供了強有力的保障,同時主要擔任紅藍對抗業務,以紅隊視角評估企業安全防護體系。
本文轉載自雷神眾測


