0x00 前言
接上篇丹丹妹,我又给大家带来了下篇,还是以python为开发语言,如有错误的地方还望大家多指正,轻喷。然后呢这边亲亲建议大家代码这种东西还是要多敲,多踩坑。毕竟伟大的爱情家周树人老先生说过只有痛过才能在心底留下不可磨灭的记号。
(多图警告!!!)
0x01 正文接口介绍
● IHttpRequestResponseWithMarkers
此接口是IHttpRequestResponse接口的一个子接口,用于那些被标记的 IHttpRequestResponse 对象,插件可以使用 IBurpExtenderCallbacks.applyMarkers() 创建一个IHttpRequestResponseWithMarkers实例。标记可用于各种情况,如指定Intruder 工具的 payload 位置,Scanner 工具的插入点或将 Scanner 工具的Issue设置高亮。
/*
* 以下两个方法均返回一个整型数组,这个数组包含了已定义标识的起始和结束的偏移量。
* 如果未定义标志将返回null
*/
//获取带有标记的请求的详细信息
java.util.List<int[]> getRequestMarkers()
//获取带有标记的响应的详细信息
java.util.List<int[]> getResponseMarkers()
Demo:
from burp import *
from array import array
class BurpExtender(IBurpExtender, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
callbacks.registerHttpListener(self)
def processHttpMessage(self, toolFlag, messageIsRequest, IHttpRequestResponse):
#通过IBurpExtenderCallbacks.applyMarkers()创建一个IHttpRequestResponseWithMarkers实例
#并设置requestMarkers [5,9] responseMarkers [0,3]
markers = self._callbacks.applyMarkers(IHttpRequestResponse, [array('i', [5,9])], [array('i', [0,3])])
print('RequestMarkers--->',markers.getRequestMarkers()[0])
print('ResponseMarkers--->',markers.getResponseMarkers()[0])
以下Demo配合IScanner设置关键字高亮。
from burp import *
from array import array
class BurpExtender(IBurpExtender, IScannerCheck, IScannerInsertionPoint):
def registerExtenderCallbacks(self, callbacks):
self._helpers = callbacks.getHelpers()
self._callbacks = callbacks
callbacks.registerScannerCheck(self)
def doPassiveScan(self, baseRequestResponse):
array = list()
match = self.getMatche(baseRequestResponse.getResponse(), 'Flag')
array.append(ScanIssue(
[self._callbacks.applyMarkers(baseRequestResponse, None, match)],
baseRequestResponse.getHttpService(),
self._helpers.analyzeRequest(baseRequestResponse).getUrl()
)
)
return array
def doActiveScan(self, baseRequestResponse, insertionPoint):
pass
def getMatche(self, baseReqRes, rule):
length = len(baseReqRes)
matche = [array('i')]
start = self._helpers.indexOf(baseReqRes, rule, True, 0, length)
if (start > 0):
matche[0].append(start)
matche[0].append(start+len(rule))
return matche
class ScanIssue(IScanIssue):
def __init__(self, httpMessages, httpService, url):
self._httpMessages = httpMessages
self._httpService = httpService
self._url = url
def getConfidence(self):
return 'Certain'
def getHttpMessages(self):
return self._httpMessages
def getHttpService(self):
return self._httpService
def getIssueBackground(self):
return None
def getIssueDetail(self):
return None
def getIssueName(self):
return 'test'
def getIssueType(self):
return 0
def getRemediationBackground(self):
return None
def getRemediationDetail(self):
return None
def getSeverity(self):
return 'Information'
def getUrl(self):
return self._url
def getHost(self):
return 'localhost'
def getPort(self):
return int(80)
● Run Screenshot :添加了一个Issues并将Response中关键词设为高亮。
● IHttpService
此接口用于提供关于HTTP服务的详细信息,可以将HTTP请求发送到该服务。此接口提供了以下方法。
//返回HTTP服务信息的主机名或IP地址
java.lang.String getHost()
//返回HTTP服务器信息的端口
int getPort()
//返回HTTP服务信息的协议
java.lang.String getProtocol()
● Demo:
from burp import *
class BurpExtender(IBurpExtender, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
callbacks.registerHttpListener(self)
def processHttpMessage(self, toolFlage, messageIsResponse, messageInfo):
#通过HttpService方法获取Http服务详细信息
IHttpService = messageInfo.getHttpService()
print("Host------>", IHttpService.getHost())
print("Port------>", IHttpService.getPort())
print("Protocol-->", IHttpService.getProtocol())
● Run Output:
●IProxyListener
插件通过注册一个ProxyListener() 监听器,Proxy将在处理请求或者响应时通知该监听器,插件可以对这些信息执行自定义分析或修改。此接口提供了以下方法。
// Proxy模块处理HTTP消息时调用
void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message)
● IInterceptedProxyMessage
通过此接口,插件可以注册一个IProxyListenner来接收Proxy的详细信息 此接口包括以下方法。
//返回被截获的http消息所请求的客户端IP地址
java.net.InetAddress getClientIpAddress()
//返回拦截操作的类型,具体类型可在官方文档关于此接口的属性描述中查看
int getInterceptAction()
//返回当前截获该HTTP消息监听器的名称
java.lang.String getListenerInterface()
//返回被截获消息的详细信息
IHttpRequestResponse getMessageInfo()
//返回请求/响应消息的唯一引用号
int getMessageReference()
// 设置更新拦截操作
void setInterceptAction(int interceptAction)
● Demo:
from burp import *
class BurpExtender(IBurpExtender, IProxyListener):
def registerExtenderCallbacks(self, callbacks):
callbacks.registerProxyListener(self)
def processProxyMessage(self, messageIsRequest, message):
#只对request操作
if(messageIsRequest):
print("IP ---> ", message.getClientIpAddress())
print("Type ---> ", message.getInterceptAction())
print("Listener ---> ", message.getListenerInterface())
#将所有的http信息都做drop操作
message.setInterceptAction(IInterceptedProxyMessage.ACTION_DROP)
● Run Output:
● IIntruderPayloadGeneratorFactory
插件可以实现此接口,并且调用IBurpExtenderCallbacks.registerIntruderPayloadGeneratorFactory() 注册。IntruderPayloadGenerator工厂,然后通过重写该接口的createNewInstance方法来实现自定义Payload生成器, 该接口提供一下方法。
//返回一个IintruderPayloadGenerator Payload生成器对象
IIntruderPayloadGenerator createNewInstance(IIntruderAttack attack)
// 设置PayloadGenerator 名称
java.lang.String getGeneratorName()
IIntruderAttack
此接口用于操作Intruder Attack 模块, 并提供以下方法
//获取HTTP服务器信息
IHttpService getHttpService()
//获取
byte[] getRequestTemplate()
● Run Output:
● IIntruderPayloadGenerator
此接口用于自定义Intruder 的Payload生成器,当发起一个Intruder工具时,插件通过注IIntruderPayloadGeneratorFactory 返回次接口实例。次接口提供入下方法。
//该方法用于获取下一个Payload的值
byte[] getNextPayload(byte[] baseValue)
// 此方法由Burp调用,由Paylaod生成器告知Burp是否继续提供Payload 继续为True