0x00 前言
burp作为web测试中最常用的工具,作为使用者更应该掌握下Extender的写法。这段时间搜集了一下关于插件的写法,发现基于Java的写法好少,基本上都是Python的教程,虽说大体上是一个写法,但是还是想总结总结下。
0x01 插件的调用原理
1、插件的总入口是BurpExtender公开类,也就类似普通咱们写的mian函数,而该BurpExtender类是必须继承 IBurpExtender接口的。
2、当继承IBurpExtender接口后,会强制要求重写registerExtenderCallbacks()函数,而该函数的作用就是注册回调,当自己的写的插件需要哪些API支持的时候,都需要在该函数中进行注册,这样burp在执行的时候,会读取自己写的插件代码是否有回调注册,如果有就进行执行相应代码。
3、基本逻辑流程如下:
BurpExtender→registerExtenderCallbacks()→IBurpExtenderCallback.registerAPI类名称(this)→执行注册函数代码
0x02 API接口介绍
Burp Extender的API其实可以理解为Burp上大部分功能的对外接口,如 IHttpListener 接口,当继承该API接口并进行回调注册后,Burp工具发出的所有请求包和响应包都会传给HTTP侦听器一份,我就可以对HTTP侦听器获得的http流量进行自定义分析或者修改处理。
1. WooYun知识库:
BurpSuite插件开发指南之 API 上篇
BurpSuite插件开发指南之 API 下篇
2. 官方API接口类大全:
All Classes
3. BurpApi中英文CHM版:
链接: https://pan.baidu.com/s/1qu9uprF-cJxCdyrMj7OsYA 提取码: fqe1
4. 常用的API接口类:
IBurpExtender:所有扩展都必须实现此接口。实现必须在burp包中称为BurpExtender,必须将其声明为public,并且必须提供默认(公共,无参数)构造函数。
1 2 3 4 5
| void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
|
IBurpExtenderCallbacks:Burp Suite使用此接口将一组回调方法传递给扩展,扩展可以使用这些回调方法在Burp中执行各种操作。加载扩展时,Burp调用其 registerExtenderCallbacks()方法并传递IBurpExtenderCallbacks接口的实例 。然后,扩展可以根据需要调用此接口的方法,以扩展Burp的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
| void addScanIssue(IScanIssue issue)
void addSuiteTab(ITab tab)
void addToSiteMap(IHttpRequestResponse item)
IHttpRequestResponseWithMarkers applyMarkers(IHttpRequestResponse httpRequestResponse, java.util.List<int[]> requestMarkers, java.util.List<int[]> responseMarkers)
IBurpCollaboratorClientContext createBurpCollaboratorClientContext()
IMessageEditor createMessageEditor(IMessageEditorController controller, boolean editable)
ITextEditor createTextEditor()
void customizeUiComponent(java.awt.Component component)
IScanQueueItem doActiveScan(java.lang.String host, int port, boolean useHttps, byte[] request)
IScanQueueItem doActiveScan(java.lang.String host, int port, boolean useHttps, byte[] request, java.util.List<int[]> insertionPointOffsets)
void doPassiveScan(java.lang.String host, int port, boolean useHttps, byte[] request, byte[] response)
void excludeFromScope(java.net.URL url)
void exitSuite(boolean promptUser)
void generateScanReport(java.lang.String format, IScanIssue[] issues, java.io.File file)
java.lang.String[] getBurpVersion()
java.lang.String[] getCommandLineArguments()
java.util.List<IContextMenuFactory> getContextMenuFactories()
java.util.List<ICookie> getCookieJarContents()
java.lang.String getExtensionFilename()
java.util.List<IExtensionStateListener> getExtensionStateListeners()
java.lang.String[] getHeaders(byte[] message)
IExtensionHelpers getHelpers()
java.util.List<IHttpListener> getHttpListeners()
java.util.List<IIntruderPayloadGeneratorFactory> getIntruderPayloadGeneratorFactories()
java.util.List<IIntruderPayloadProcessor> getIntruderPayloadProcessors()
java.util.List<IMessageEditorTabFactory> getMessageEditorTabFactories()
java.lang.String[][] getParameters(byte[] request)
IHttpRequestResponse[] getProxyHistory()
java.util.List<IProxyListener> getProxyListeners()
IScanIssue[] getScanIssues(java.lang.String urlPrefix)
java.util.List<IScannerCheck> getScannerChecks()
java.util.List<IScannerInsertionPointProvider> getScannerInsertionPointProviders()
java.util.List<IScannerListener> getScannerListeners()
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)
void includeInScope(java.net.URL url)
boolean isExtensionBapp()
boolean isInScope(java.net.URL url)
void issueAlert(java.lang.String message)
void loadConfig(java.util.Map<java.lang.String,java.lang.String> config)
void loadConfigFromJson(java.lang.String config)
java.lang.String loadExtensionSetting(java.lang.String name)
IHttpRequestResponse makeHttpRequest(IHttpService httpService, byte[] request)
byte[] makeHttpRequest(java.lang.String host, int port, boolean useHttps, byte[] request)
void printError(java.lang.String error)
void printOutput(java.lang.String output)
void registerContextMenuFactory(IContextMenuFactory factory)
void registerExtensionStateListener(IExtensionStateListener listener)
void registerHttpListener(IHttpListener listener)
void registerIntruderPayloadGeneratorFactory(IIntruderPayloadGeneratorFactory factory)
void registerIntruderPayloadProcessor(IIntruderPayloadProcessor processor)
void registerMenuItem(java.lang.String menuItemCaption, IMenuItemHandler menuItemHandler)
void registerMessageEditorTabFactory(IMessageEditorTabFactory factory)
void registerProxyListener(IProxyListener listener)
void registerScannerCheck(IScannerCheck check)
void registerScannerInsertionPointProvider(IScannerInsertionPointProvider provider)
void registerScannerListener(IScannerListener listener)
void registerScopeChangeListener(IScopeChangeListener listener)
void registerSessionHandlingAction(ISessionHandlingAction action)
void removeContextMenuFactory(IContextMenuFactory factory)
void removeExtensionStateListener(IExtensionStateListener listener)
void removeHttpListener(IHttpListener listener)
void removeIntruderPayloadGeneratorFactory(IIntruderPayloadGeneratorFactory factory)
void removeIntruderPayloadProcessor(IIntruderPayloadProcessor processor)
void removeMessageEditorTabFactory(IMessageEditorTabFactory factory)
void removeProxyListener(IProxyListener listener)
void removeScannerCheck(IScannerCheck check)
void removeScannerInsertionPointProvider(IScannerInsertionPointProvider provider)
void removeScannerListener(IScannerListener listener)
void removeScopeChangeListener(IScopeChangeListener listener)
void removeSessionHandlingAction(ISessionHandlingAction action)
void removeSuiteTab(ITab tab)
void restoreState(java.io.File file)
IHttpRequestResponsePersisted saveBuffersToTempFiles(IHttpRequestResponse httpRequestResponse)
java.util.Map<java.lang.String,java.lang.String> saveConfig()
java.lang.String saveConfigAsJson(java.lang.String... configPaths)
void saveExtensionSetting(java.lang.String name, java.lang.String value)
void saveState(java.io.File file)
ITempFile saveToTempFile(byte[] buffer)
void sendToComparer(byte[] data)
void sendToIntruder(java.lang.String host, int port, boolean useHttps, byte[] request)
void sendToIntruder(java.lang.String host, int port, boolean useHttps, byte[] request, java.util.List<int[]> payloadPositionOffsets)
void sendToRepeater(java.lang.String host, int port, boolean useHttps, byte[] request, java.lang.String tabCaption)
void sendToSpider(java.net.URL url)
void setExtensionName(java.lang.String name)
void setProxyInterceptionEnabled(boolean enabled)
void unloadExtension()
void updateCookieJar(ICookie cookie)
|
IExtensionHelpers:此接口包含许多帮助程序方法,扩展程序可用于辅助Burp扩展程序出现的各种常见任务。扩展可以调用IBurpExtenderCallbacks.getHelpers以获得该接口的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| byte[] addParameter(byte[] request, IParameter parameter)
IRequestInfo analyzeRequest(byte[] request)
IRequestInfo analyzeRequest(IHttpRequestResponse request)
IRequestInfo analyzeRequest(IHttpService httpService, byte[] request)
IResponseInfo analyzeResponse(byte[] response)
IResponseKeywords analyzeResponseKeywords(java.util.List<java.lang.String> keywords, byte[]... responses)
IResponseVariations analyzeResponseVariations(byte[]... responses)
byte[] base64Decode(byte[] data)
byte[] base64Decode(java.lang.String data)
java.lang.String base64Encode(byte[] data)
java.lang.String base64Encode(java.lang.String data)
byte[] buildHttpMessage(java.util.List<java.lang.String> headers, byte[] body)
byte[] buildHttpRequest(java.net.URL url)
IHttpService buildHttpService(java.lang.String host, int port, boolean useHttps)
IHttpService buildHttpService(java.lang.String host, int port, java.lang.String protocol)
IParameter buildParameter(java.lang.String name, java.lang.String value, byte type)
java.lang.String bytesToString(byte[] data)
IParameter getRequestParameter(byte[] request, java.lang.String parameterName)
int indexOf(byte[] data, byte[] pattern, boolean caseSensitive, int from, int to)
IScannerInsertionPoint makeScannerInsertionPoint(java.lang.String insertionPointName, byte[] baseRequest, int from, int to)
byte[] removeParameter(byte[] request, IParameter parameter)
byte[] stringToBytes(java.lang.String data)
byte[] toggleRequestMethod(byte[] request)
byte[] updateParameter(byte[] request, IParameter parameter)
byte[] urlDecode(byte[] data)
java.lang.String urlDecode(java.lang.String data)
byte[] urlEncode(byte[] data)
java.lang.String urlEncode(java.lang.String data)
|
PrintWriter:在burp中的输入输出显示,需要使用到 PrintWriter 类,可以通过该类即可在burp中输入输出自己想要的内容。
1 2 3 4 5 6
| 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侦听器来对这些消息执行自定义分析或修改。
1 2 3 4 5 6
| void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)
|
IHttpRequestResponse:此接口用于检索和更新有关HTTP消息的详细信息。 注意: setter方法通常只能在处理邮件之前使用,而不能在只读上下文中使用。与响应详细信息有关的getter方法只能在发出请求之后使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| java.lang.String getComment()
java.lang.String getHighlight()
IHttpService getHttpService()
byte[] getRequest()
byte[] getResponse()
void setComment(java.lang.String comment)
void setHighlight(java.lang.String color)
void setHttpService(IHttpService httpService)
void setRequest(byte[] message)
void setResponse(byte[] message)
|
IProxyListener:扩展可以实现此接口,然后调用 IBurpExtenderCallbacks.registerProxyListener()以注册代理侦听器。代理工具正在处理的请求和响应将通知给侦听器。扩展可以通过注册代理侦听器来执行对这些消息的自定义分析或修改,并控制UI内消息的拦截。
1 2 3 4 5
| void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message)
|
0x03 API接口功能分类
插件入口和帮助接口类:IBurpExtender、IBurpExtenderCallbacks、 IExtensionHelpers、IExtensionStateListener
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消息传递的目的。
0x04 总结
Burp的插件编写其实理清楚了整个框架编写流程,再好好熟悉下内置的这些API,基本上就可以写一些自己想要的小功能插件了。
0x05 参考文章
[ 1 ] http://code2sec.com/burpsuitecha-jian-kai-fa-tips.html
[ 2 ] https://www.freebuf.com/column/171237.html
[ 3 ] https://portswigger.net/burp/extender/api/allclasses-noframe.html
[ 4 ] https://www.cnblogs.com/ermei/p/6689006.html