BurpSuite插件编写基础

admin 2025年2月10日11:02:21评论14 views字数 14842阅读49分28秒阅读模式
 

1. 前言

burp作为web测试中最常用的工具,作为使用者更应该掌握下Extender的写法。这段时间搜集了一下关于插件的写法,发现基于Java的写法好少,基本上都是Python的教程,虽说大体上是一个写法,但是还是想总结总结下。

2. 插件的调用原理

BurpSuite插件编写基础
  1. 插件的总入口是BurpExtender公开类,也就类似普通咱们写的mian函数,而该BurpExtender类是必须继承 IBurpExtender接口的。

  2. 当继承IBurpExtender接口后,会强制要求重写registerExtenderCallbacks()函数,而该函数的作用就是注册回调,当自己的写的插件需要哪些API支持的时候,都需要在该函数中进行注册,这样burp在执行的时候,会读取自己写的插件代码是否有回调注册,如果有就进行执行相应代码。

  3. 基本逻辑流程如下:

BurpExtender  →  registerExtenderCallbacks()  →  IBurpExtenderCallback.registerAPI类名称(this)  →  执行注册函数代码

3. API接口介绍

Burp Extender的API其实可以理解为Burp上大部分功能的对外接口,如 IHttpListener 接口,当继承该API接口并进行回调注册后,Burp工具发出的所有请求包和响应包都会传给HTTP侦听器一份,我就可以对HTTP侦听器获得的http流量进行自定义分析或者修改处理。

3.1 官方API接口类大全:

https://portswigger.net/burp/extender/api/allclasses-noframe.html

3.2 BurpApi中英文CHM版:

3.4 常用的API接口类:

IBurpExtender:所有扩展都必须实现此接口。实现必须在burp包中称为BurpExtender,必须将其声明为public,并且必须提供默认(公共,无参数)构造函数。

IBurpExtenderCallbacks:Burp Suite使用此接口将一组回调方法传递给扩展,扩展可以使用这些回调方法在Burp中执行各种操作。加载扩展时,Burp调用其 registerExtenderCallbacks()方法并传递IBurpExtenderCallbacks接口的实例 。然后,扩展可以根据需要调用此接口的方法,以扩展Burp的功能。

void addScanIssue(IScanIssue issue)// 此方法用于注册新的扫描仪问题。void addSuiteTab(ITab tab)// 此方法用于将自定义选项卡添加到Burp Suite主窗口。void addToSiteMap(IHttpRequestResponse item)// 此方法可用于将具有指定请求/响应详细信息的项目添加到Burp的站点地图。IHttpRequestResponseWithMarkers applyMarkers(IHttpRequestResponse httpRequestResponse, java.util.List<int[]> requestMarkers, java.util.List<int[]> responseMarkers)// 此方法用于将标记应用于与某些特定目的相关的消息偏移量的HTTP请求或响应。IBurpCollaboratorClientContext createBurpCollaboratorClientContext()// 此方法用于创建新的Burp Collaborator客户端上下文,该上下文可用于生成Burp Collaborator有效负载,并轮询Collaborator服务器以查找由于使用这些有效负载而导致的任何网络交互。IMessageEditor createMessageEditor(IMessageEditorController controller, boolean editable)// 此方法用于创建Burp的HTTP消息编辑器的新实例,以使其在其自己的UI中使用。ITextEditor createTextEditor()// 此方法用于创建Burp的纯文本编辑器的新实例,以供扩展程序在其自己的UI中使用。void customizeUiComponent(java.awt.Component component)// 此方法用于根据Burp的UI样式自定义UI组件,包括字体大小,颜色,表行间距等。IScanQueueItem doActiveScan(java.lang.String host, int port, boolean useHttps, byte[] request)// 此方法可用于将HTTP请求发送到Burp Scanner工具以执行活动的漏洞扫描。IScanQueueItem doActiveScan(java.lang.String host, int port, boolean useHttps, byte[] request, java.util.List<int[]> insertionPointOffsets)// 此方法可用于根据要扫描的插入点的自定义列表,将HTTP请求发送到Burp Scanner工具以执行活动漏洞扫描。void doPassiveScan(java.lang.String host, int port, boolean useHttps, byte[] request, byte[] response)// 此方法可用于将HTTP请求发送到Burp Scanner工具以执行被动漏洞扫描。void excludeFromScope(java.net.URL url)// 此方法可用于从Suite范围范围中排除指定的URL。void exitSuite(boolean promptUser)// 此方法可用于以编程方式关闭Burp,并向用户提供可选提示。void generateScanReport(java.lang.String format, IScanIssue[] issues, java.io.File file)// 此方法用于为指定的扫描程序问题生成报告。java.lang.String[] getBurpVersion()// 此方法检索有关正在运行扩展的Burp版本的信息。java.lang.String[] getCommandLineArguments()// 此方法返回启动时传递给Burp的命令行参数。java.util.List<IContextMenuFactory> getContextMenuFactories()// 此方法用于检索扩展名注册的上下文菜单工厂。java.util.List<ICookie> getCookieJarContents()// 此方法用于检索Burp会话处理cookie jar的内容。java.lang.String getExtensionFilename()// 此方法检索从中加载当前扩展名的文件的绝对路径名。java.util.List<IExtensionStateListener> getExtensionStateListeners()// 此方法用于检索扩展注册的扩展状态侦听器。java.lang.String[] getHeaders(byte[] message)// 不推荐使用。 // 使用IExtensionHelpers.analyzeRequest()或 IExtensionHelpers.analyzeResponse()代替。IExtensionHelpers getHelpers()// 此方法用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。java.util.List<IHttpListener> getHttpListeners()// 此方法用于检索扩展注册的HTTP侦听器。java.util.List<IIntruderPayloadGeneratorFactory> getIntruderPayloadGeneratorFactories()// 此方法用于检索扩展注册的Intruder有效负载生成器工厂。java.util.List<IIntruderPayloadProcessor> getIntruderPayloadProcessors()// 此方法用于检索扩展注册的Intruder有效负载处理器。java.util.List<IMessageEditorTabFactory> getMessageEditorTabFactories()// 此方法用于检索扩展注册的消息编辑器选项卡工厂。java.lang.String[][] getParameters(byte[] request)// 不推荐使用。 // 使用IExtensionHelpers.analyzeRequest()代替。IHttpRequestResponse[] getProxyHistory()// 此方法返回代理历史记录中所有项目的详细信息。java.util.List<IProxyListener> getProxyListeners()// 此方法用于检索扩展注册的代理侦听器。IScanIssue[] getScanIssues(java.lang.String urlPrefix)// 对于与指定文字前缀匹配的URL,此方法返回所有当前的扫描问题。java.util.List<IScannerCheck> getScannerChecks()// 此方法用于检索扩展名注册的扫描程序检查。java.util.List<IScannerInsertionPointProvider> getScannerInsertionPointProviders()// 此方法用于检索扩展名注册的扫描仪插入点提供程序。java.util.List<IScannerListener> getScannerListeners()// 此方法用于检索扩展注册的Scanner侦听器。java.util.List<IScopeChangeListener> getScopeChangeListeners()// 此方法用于检索扩展注册的范围更改侦听器。java.util.List<ISessionHandlingAction> getSessionHandlingActions()// 此方法用于检索扩展注册的会话处理操作。IHttpRequestResponse[] getSiteMap(java.lang.String urlPrefix)// 此方法返回站点地图中项目的详细信息。java.io.OutputStream getStderr()// 此方法用于获取当前扩展的标准错误流。java.io.OutputStream getStdout()// 此方法用于获取当前扩展的标准输出流。java.lang.String getToolName(int toolFlag)// 此方法用于获取由提供的工具标志标识的Burp工具的描述性名称。void includeInScope(java.net.URL url)// 此方法可用于在Suite范围范围内包括指定的URL。boolean isExtensionBapp()// 此方法确定当前扩展是否已作为BApp(BApp商店中的Burp App)加载。boolean isInScope(java.net.URL url)// 此方法可用于查询指定的URL是否在当前Suite范围内。void issueAlert(java.lang.String message)// 此方法可用于在Burp Suite警报选项卡中显示指定的消息。void loadConfig(java.util.Map<java.lang.String,java.lang.String> config)// 不推荐使用。 // 使用loadConfigFromJson()代替。void loadConfigFromJson(java.lang.String config)// 此方法使Burp从提供的JSON字符串中加载新的项目级配置。java.lang.String loadExtensionSetting(java.lang.String name)// 此方法用于加载使用该方法保存的扩展的配置设置saveExtensionSetting()。IHttpRequestResponse makeHttpRequest(IHttpService httpService, byte[] request)// 此方法可用于发出HTTP请求并检索其响应。byte[] makeHttpRequest(java.lang.String host, int port, boolean useHttps, byte[] request)// 此方法可用于发出HTTP请求并检索其响应。void printError(java.lang.String error)// 此方法将输出行输出到当前扩展程序的标准错误流。void printOutput(java.lang.String output)// 此方法将输出行打印到当前扩展的标准输出流。void registerContextMenuFactory(IContextMenuFactory factory)// 此方法用于为自定义上下文菜单项注册工厂。void registerExtensionStateListener(IExtensionStateListener listener)// 此方法用于注册一个侦听器,该侦听器将收到有关扩展状态更改的通知。void registerHttpListener(IHttpListener listener)// 此方法用于注册一个侦听器,该侦听器将被通知任何Burp工具发出的请求和响应。void registerIntruderPayloadGeneratorFactory(IIntruderPayloadGeneratorFactory factory)// 此方法用于为入侵者有效载荷注册工厂。void registerIntruderPayloadProcessor(IIntruderPayloadProcessor processor)// 此方法用于注册自定义入侵者有效负载处理器。void registerMenuItem(java.lang.String menuItemCaption, IMenuItemHandler menuItemHandler)// 不推荐使用。 // 使用registerContextMenuFactory()代替。void registerMessageEditorTabFactory(IMessageEditorTabFactory factory)// 此方法用于为自定义消息编辑器选项卡注册工厂。void registerProxyListener(IProxyListener listener)// 此方法用于注册一个侦听器,该侦听器将收到有关代理工具正在处理的请求和响应的通知。void registerScannerCheck(IScannerCheck check)// 此方法用于注册自定义扫描程序检查。void registerScannerInsertionPointProvider(IScannerInsertionPointProvider provider)// 此方法用于注册扫描仪插入点的提供者。void registerScannerListener(IScannerListener listener)// 此方法用于注册一个侦听器,该侦听器将被通知由扫描程序工具报告的新问题。void registerScopeChangeListener(IScopeChangeListener listener)// 此方法用于注册一个侦听器,该侦听器将在Burp套件范围的目标范围更改时得到通知。void registerSessionHandlingAction(ISessionHandlingAction action)// 此方法用于注册自定义会话处理操作。void removeContextMenuFactory(IContextMenuFactory factory)// 此方法用于删除扩展名已注册的上下文菜单工厂。void removeExtensionStateListener(IExtensionStateListener listener)// 此方法用于删除已由扩展注册的扩展状态侦听器。void removeHttpListener(IHttpListener listener)// 此方法用于删除扩展已注册的HTTP侦听器。void removeIntruderPayloadGeneratorFactory(IIntruderPayloadGeneratorFactory factory)// 此方法用于删除扩展名已注册的Intruder有效负载生成器工厂。void removeIntruderPayloadProcessor(IIntruderPayloadProcessor processor)// 此方法用于删除扩展名已注册的Intruder有效负载处理器。void removeMessageEditorTabFactory(IMessageEditorTabFactory factory)// 此方法用于删除扩展名已注册的消息编辑器选项卡工厂。void removeProxyListener(IProxyListener listener)// 此方法用于删除扩展名已注册的代理侦听器。void removeScannerCheck(IScannerCheck check)// 此方法用于删除扩展名已注册的扫描程序检查。void removeScannerInsertionPointProvider(IScannerInsertionPointProvider provider)// 此方法用于删除扩展名已注册的扫描仪插入点提供程序。void removeScannerListener(IScannerListener listener)// 此方法用于删除扩展名已注册的Scanner侦听器。void removeScopeChangeListener(IScopeChangeListener listener)// 此方法用于删除扩展已注册的范围更改侦听器。void removeSessionHandlingAction(ISessionHandlingAction action)// 此方法用于删除扩展已注册的会话处理操作。void removeSuiteTab(ITab tab)// 此方法用于从Burp Suite主窗口中删除先前添加的选项卡。void restoreState(java.io.File file)// 不推荐使用。 // 状态文件已替换为Burp项目文件。IHttpRequestResponsePersisted saveBuffersToTempFiles(IHttpRequestResponse httpRequestResponse)// 此方法用于将IHttpRequestResponse对象的请求和响应保存 到临时文件,以便它们不再保存在内存中。java.util.Map<java.lang.String,java.lang.String> saveConfig()// 不推荐使用。 // 使用saveConfigAsJson()代替。java.lang.String saveConfigAsJson(java.lang.String... configPaths)// 此方法使Burp以JSON格式保存其当前的项目级别配置。void saveExtensionSetting(java.lang.String name, java.lang.String value)// 此方法用于以持久的方式保存扩展的配置设置,以免重新加载扩展和Burp Suite。void saveState(java.io.File file)// 不推荐使用。 // 状态文件已替换为Burp项目文件。ITempFile saveToTempFile(byte[] buffer)// 此方法用于在磁盘上创建一个包含所提供数据的临时文件。void sendToComparer(byte[] data)// 此方法可用于将数据发送到比较器工具。void sendToIntruder(java.lang.String host, int port, boolean useHttps, byte[] request)// 此方法可用于向Burp Intruder工具发送HTTP请求。void sendToIntruder(java.lang.String host, int port, boolean useHttps, byte[] request, java.util.List<int[]> payloadPositionOffsets)// 此方法可用于向Burp Intruder工具发送HTTP请求。void sendToRepeater(java.lang.String host, int port, boolean useHttps, byte[] request, java.lang.String tabCaption)// 此方法可用于将HTTP请求发送到Burp Repeater工具。void sendToSpider(java.net.URL url)// 此方法可用于将种子URL发送到Burp Spider工具。void setExtensionName(java.lang.String name)// 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。void setProxyInterceptionEnabled(boolean enabled)// 此方法设置Burp代理的主侦听模式。void unloadExtension()// 此方法用于从Burp Suite卸载扩展。void updateCookieJar(ICookie cookie)// 此方法用于更新Burp会话处理cookie jar的内容。

IExtensionHelpers:此接口包含许多帮助程序方法,扩展程序可用于辅助Burp扩展程序出现的各种常见任务。扩展可以调用IBurpExtenderCallbacks.getHelpers以获得该接口的实例。

byte[] addParameter(byte[] request, IParameter parameter)// 此方法将新参数添加到HTTP请求,并在适当时更新Content-Length标头。IRequestInfo analyzeRequest(byte[] request)// 此方法可用于分析HTTP请求,并获取有关该请求的各种关键详细信息。IRequestInfo analyzeRequest(IHttpRequestResponse request)// 此方法可用于分析HTTP请求,并获取有关该请求的各种关键详细信息。IRequestInfo analyzeRequest(IHttpService httpService, byte[] request)// 此方法可用于分析HTTP请求,并获取有关该请求的各种关键详细信息。IResponseInfo analyzeResponse(byte[] response)// 此方法可用于分析HTTP响应,并获取有关它的各种关键细节。IResponseKeywords analyzeResponseKeywords(java.util.List<java.lang.String> keywords, byte[]... responses)// 此方法分析一个或多个响应以标识指定关键字的出现次数,并返回IResponseKeywords可以查询的 对象以获得每个关键字的出现次数的详细信息。IResponseVariations analyzeResponseVariations(byte[]... responses)// 此方法分析一个或多个响应以标识许多属性中的变化,并返回IResponseVariations 可以查询以获得变化细节的对象。byte[] base64Decode(byte[] data)// 此方法可用于对指定数据进行Base64解码。byte[] base64Decode(java.lang.String data)// 此方法可用于对指定数据进行Base64解码。java.lang.String base64Encode(byte[] data)// 此方法可用于对指定数据进行Base64编码。java.lang.String base64Encode(java.lang.String data)// 此方法可用于对指定数据进行Base64编码。byte[] buildHttpMessage(java.util.List<java.lang.String> headers, byte[] body)// 此方法构建包含指定的标头和消息正文的HTTP消息。byte[] buildHttpRequest(java.net.URL url)// 此方法创建对指定URL的GET请求。IHttpService buildHttpService(java.lang.String host, int port, boolean useHttps)// 此方法IHttpService根据提供的详细信息构造一个对象。IHttpService buildHttpService(java.lang.String host, int port, java.lang.String protocol)// 此方法IHttpService根据提供的详细信息构造一个对象。IParameter buildParameter(java.lang.String name, java.lang.String value, byte type)// 此方法IParameter根据提供的详细信息构造一个对象。java.lang.String bytesToString(byte[] data)// 此方法可用于将数据从字节数组转换为String形式。IParameter getRequestParameter(byte[] request, java.lang.String parameterName)// 此方法可用于检索HTTP请求中指定参数的详细信息。int indexOf(byte[] data, byte[] pattern, boolean caseSensitive, int from, int to)// 此方法在一条数据中搜索指定模式的首次出现。IScannerInsertionPoint makeScannerInsertionPoint(java.lang.String insertionPointName, byte[] baseRequest, int from, int to)// 此方法IScannerInsertionPoint根据提供的详细信息构造一个对象。byte[] removeParameter(byte[] request, IParameter parameter)// 此方法从HTTP请求中删除参数,并在适当时更新Content-Length标头。byte[] stringToBytes(java.lang.String data)// 此方法可用于将数据从字符串形式转换为字节数组。byte[] toggleRequestMethod(byte[] request)// 此方法可用于在GET和POST之间切换请求的方法。byte[] updateParameter(byte[] request, IParameter parameter)// 此方法更新HTTP请求中参数的值,并且在适当的情况下更新Content-Length标头。byte[] urlDecode(byte[] data)// 此方法可用于对指定数据进行URL解码。java.lang.String urlDecode(java.lang.String data)// 此方法可用于对指定数据进行URL解码。byte[] urlEncode(byte[] data)// 此方法可用于对指定数据进行URL编码。java.lang.String urlEncode(java.lang.String data)// 此方法可用于对指定数据进行URL编码。

PrintWriter:在burp中的输入输出显示,需要使用到 PrintWriter 类,可以通过该类即可在burp中输入输出自己想要的内容。

import java.io.PrintWriter;PrintWriter stdout = new PrintWriter(callbacks.getStdout(),true);PrintWriter stderr = new PrintWriter(callbacks.getStderr(),true);stdout.println("Hello output");stderr.println("Hello errors");

IHttpListener:扩展可以实现此接口,然后调用 IBurpExtenderCallbacks.registerHttpListener()以注册HTTP侦听器。任何Burp工具发出的请求和响应都将通知给侦听器。扩展可以通过注册HTTP侦听器来对这些消息执行自定义分析或修改。

void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)// 当即将发出HTTP请求时,以及已接收到HTTP响应时,将调用此方法。// 参数://     toolFlag-指示发出请求的Burp工具的标志。打p工具标志在IBurpExtenderCallbacks界面中定义 。(不同的toolFlag代表了不同的burp组件 https://portswigger.net/burp/extender/api/constant-values.html#burp.IBurpExtenderCallbacks)//     messageIsRequest -标记是否正在为请求或响应调用该方法。//     messageInfo-要处理的请求/响应的详细信息。扩展程序可以在此对象上调用setter方法来更新当前消息,从而修改Burp的行为。

IHttpRequestResponse:此接口用于检索和更新有关HTTP消息的详细信息。 注意: setter方法通常只能在处理邮件之前使用,而不能在只读上下文中使用。与响应详细信息有关的getter方法只能在发出请求之后使用。

java.lang.String getComment()// 如果适用,此方法用于检索该项目的用户注释注释。java.lang.String getHighlight()// 如果适用,此方法用于检索该项目的用户注释突出显示。IHttpService getHttpService()// 此方法用于检索此请求/响应的HTTP服务。byte[] getRequest()// 此方法用于检索请求消息。byte[] getResponse()// 此方法用于检索响应消息。void setComment(java.lang.String comment)// 此方法用于更新此项的用户注释注释。void setHighlight(java.lang.String color)// 此方法用于更新该项目的用户注释突出显示。void setHttpService(IHttpService httpService)// 此方法用于为此请求/响应更新HTTP服务。void setRequest(byte[] message)// 此方法用于更新请求消息。void setResponse(byte[] message)// 此方法用于更新响应消息。

IProxyListener:扩展可以实现此接口,然后调用 IBurpExtenderCallbacks.registerProxyListener()以注册代理侦听器。代理工具正在处理的请求和响应将通知给侦听器。扩展可以通过注册代理侦听器来执行对这些消息的自定义分析或修改,并控制UI内消息的拦截。

void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message)// 当代理正在处理HTTP消息时,将调用此方法。// 参数://     messageIsRequest -指示HTTP消息是请求还是响应。//     message- IInterceptedProxyMessage扩展程序可用于查询和更新消息详细信息,并控制是否应拦截消息并将其显示给用户以进行手动查看或修改的对象。

4 API接口功能分类

插件入口和帮助接口类:IBurpExtenderIBurpExtenderCallbacks、 IExtensionHelpersIExtensionStateListener

IExtensionHelpersIExtensionStateListenerIBurpExtender接口类是Burp插件的入口,所有Burp的插件均需要实现此接口,并且 类命名为BurpExtenderIBurpExtenderCallbacks接口类是IBurpExtender接口的实 现类与Burp其他各个组件(Scanner、Intruder、Spider……)、各个通信对象 (HttpRequestResponse、HttpService、SessionHandlingAction)之间的连接。 IExtensionHelpersIExtensionStateListener这两个接口类是插件的帮助和管理操作的接口定义。

UI相关接口类:IContextMenuFactoryIContextMenuInvocationITabITextEditor、 IMessageEditorIMenuItemHandler 这类接口类主要是定义Burp插件的UI显示和动作的处理事件,主要是软件交互中使用。

Burp工具组件接口类:IInterceptedProxyMessageIIntruderAttack、 IIntruderPayloadGeneratorIIntruderPayloadGeneratorFactory、 IIntruderPayloadProcessorIProxyListenerIScanIssueIScannerCheck、 IScannerInsertionPointIScannerInsertionPointProviderIScannerListenerIScanQueueItemIScopeChangeListener 这些接口类的功能非常好理解,Burp在接口定义的命名中使用了的见名知意的规 范,看到接口类的名称,基本就能猜测出来这个接口是适用于哪个工具组件。

HTTP消息处理接口类:ICookieIHttpListenerIHttpRequestResponse、 IHttpRequestResponsePersistedIHttpRequestResponseWithMarkersIHttpService、 IRequestInfoIParameterIResponseInfo 这些接口的定义主要是围绕HTTP消息通信过程中涉及的CookieRequest、 ResponseParameter几大消息对象,通过对通信消息头、消息体的数据处理,来达到控制HTTP消息传递的目的。

5 总结

Burp的插件编写其实理清楚了整个框架编写流程,再好好熟悉下内置的这些API,基本上就可以写一些自己想要的小功能插件了。

 

原文始发于微信公众号(SecretTeam安全团队):BurpSuite插件编写基础

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月10日11:02:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   BurpSuite插件编写基础https://cn-sec.com/archives/3721601.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息