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
希望能对大家有帮助!!