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卡死問題。

本文作者是屬於水滴實驗室。以複雜對抗為主,通過研究流量特徵分析對抗技術、防禦技術與終端安全防禦技術來發現防護體系不足,增強產品能力提升。實驗室成員均來多年攻防經驗的研究員,擁有非常完善的攻防經驗,為產品檢測、安全防禦能力檢測提供了強有力的保障,同時主要擔任紅藍對抗業務,以紅隊視角評估企業安全防護體系。



分享到:


相關文章: