利用python开发burp-suite的扩展插件

0x01. 介绍

相信大家了解过burpsuite这个神兵利器,也利用过其中的一些功能强大插件。Burp 的扩展模块(extender)可以让你通过各种方式扩展BP的功能。而今天就想带大家了解如何 利用Bp提供的api来用python脚本编写插件, 从而控制bp,打造属于自己的BP
note:我们编写的插件可以控制BP的几乎所有功能。

0x02. api介绍

https://portswigger.net/burp/extender/api/index.html 里面有十分详细的api介绍,在这里我们先简单的介绍几个api
1. IHttpListener 会接收所有流经BP的request和response
2. IBurpExtender 必须继承的类,类似于注册为插件
3. IHttpRequestResponse 此接口用于检索和更新有关http消息的详细信息。
4. IProxyListener 扩展可以实现这个接口,然后调用IBurpExtenderCallbacks.registerProxyListener()来注册一个代理监听器。监听器将收到代理工具正在处理的请求和响应的通知。通过注册代理侦听器,扩展可以执行自定义分析或修改这些消息,并控制消息拦截。
5. 接下来我们就可以利用这几个接口来开发我们的插件了

0x03. 开发插件

在这里我用python语言开发一个小插件

from burp import IBurpExtender
from burp import IHttpListener
from burp import IHttpRequestResponse
from burp import IResponseInfo
from burp import IProxyListener

#从burp中导入这几个api模块

print 'this is my extender '

class BurpExtender(IBurpExtender,IHttpListener,IHttpRequestResponse, IProxyListener):  
    '''
    定义一个类,这个类继承了IBurpExtender 使其成为一个插件模块
    继承IHttpListener, 使其可以接受流经的request和response
    继承IHttpRequestResponse,使其可以获得HTTP的详细信息
    继承IProxyListener ,注册成一个代理服务器!
    '''

    def registerExtenderCallbacks(self,callbacks):

        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self._callbacks.setExtensionName('leslie') # 设定插件名字 

        callbacks.registerHttpListener(self)  # 必须得注册才具有功能
        callbacks.registerProxyListener(self)

    def processHttpMessage(self, toolFlag, messageIsRequest, messageinfo):
        if toolFlag == 4 :  # flag值代表着不同的组队,此时是proxy,表示被拦截的消息
            if messageIsRequest: # 如果是一个请求
                request = messageinfo.getRequest() # 获得请求信息
                analyzedRequest = self._helpers.analyzeRequest(request) # 解析
                headers = analyzedRequest.getHeaders()

                print headers  # 打印出http请求头

从上面的代码可以知道,我们的插件功能获得BP拦截中的信息,并且打印。 怎么样,是不是很简单的就实现了功能。接下来让我们再深入一点

from burp import IBurpExtender
from burp import IHttpListener
from burp import IHttpRequestResponse
from burp import IResponseInfo
from burp import IProxyListener
import re

def DealParm(parameter,cookie): # 定义这样一个函数,接受HTTP头参数列表和cookie标志位,返回字典格式。
    cookiedict = {}  # 初始化一个cookie字典
    otherdict = {}  # 参数列表
    for i in parameter:   # 对于参数中的每一个值
        if i.getType() == i.PARAM_COOKIE:  # 如果是一个cookie
            cookiedict[str(i.getName())] = str(i.getValue())
        else:
            otherdict[str(i.getName())] = str(i.getValue())
    if cookie  如果想只返回cookie字典 为True,否则返回其他
        return cookiedict
    else:
        return otherdict


def CheckUrl(url_data):  # 一个非常简单的验证,验证参数里的恶意攻击
    if 'order%20by' in url_data:
            return True
    else:
        return False


class BurpExtender(IBurpExtender,IHttpRequestResponse, IProxyListener):
    '''
    像上面的代码一样的功能,初始化插件扩展
    '''

    def registerExtenderCallbacks(self,callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self._callbacks.setExtensionName('leslie')

        callbacks.registerProxyListener(self)


    def processProxyMessage(self, messageIsRequest, message):
        if messageIsRequest:
            request = message.getMessageInfo()  # 获得信息
            request_after = request.getRequest()  # 获得请求信息
            analyzedRequest = self._helpers.analyzeRequest(request_after)  # 进行解析

            method = analyzedRequest.getMethod()  # 以什么方式的 比如'GET' 或者 'POST'
            headers = analyzedRequest.getHeaders() # 获得http头

            url = str(self._helpers.analyzeRequest(request).getUrl())# 获得url

            parameter = analyzedRequest.getParameters() # 获得参数列表
            cookie = DealParm(parameter,True)  # 利用刚才的函数获得cookie
            otherPara = DealParm(parameter,False) # 获得其他数据


            print 'Cookie:',cookie  # 打印出数据
            print 'Parm:', otherPara
            print 'Headers:',headers

            if url:  # 如果存在url
                print 'this is the url : ', url  
                if CheckUrl(url):  # 检查url,如果是恶意的
                    print ' dangerous request!!!'
                    message.setInterceptAction(message.ACTION_DROP)  # !!执行DROP 丢弃,我们可以通过插件来执行BP的功能

0x04. 总结和启发
通过上面的代码实现,我们实现了两个功能:
1. 获得bp拦截的信息
2. 对信息进行处理,检查,而且还可以对信息执行放行或者拦截,记录等等功能
这只是非常简单的雏形,其中的细节利用我们可以无限放大,结合python实行更加自动化!
也就是说,python可以做的事,我们在插件里也做。我们可以通过编写插件而自动化的控制BP
希望能对大家有帮助!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据