作为一个安全从业人员,不会开发也就算了,要是连扫描器轮子也不会造,那么他一定是一个纯纯搬运工,不合格的安全er。平常我们对burp抓包用的最多,用burp插件扫描也是最快的,因此造一个属于自己的轮子出来也是我的目标之一。胖子不是一口就吃成的,这里我们一步步修炼,正式开启扫描气之路。
熟悉burp api
首先api(应用程序编程接口)在开发工具中的作用是不言而喻的,用于不同软件组件之间的通信和交互。Burp Suite提供了一个功能强大的API,允许开发人员通过编写脚本或程序来扩展和自动化Burp Suite的各种功能,我们在其Extender处看一下它的API有哪些。
保存接口文件,将其保存在某一文件夹下,编辑器打开
接口功能了解
所有的接口都提供了注释,那么我们就可以了解每一个接口它的功能是什么
接口名称 | 接口关联 | 作用 |
IBurpCollaboratorClientContext | 表示Burp Collaborator客户端上下文的实例,可用于生成Burp Collaborator载荷并轮询Collaborator服务器,以获取使用这些载荷导致的任何网络交互。 | |
IBurpCollaboratorInteraction | 表示与Burp Collaborator服务器发生的网络交互 | |
IBurpExtender | 所有扩展必须实现这个接口。实现类必须命名为BurpExtender,位于burp包中,必须声明为public,并且必须提供一个默认的(public、无参数的)构造函数。 | |
IBurpExtenderCallbacks | 这个接口被Burp Suite用来向扩展传递一组回调方法,扩展可以使用这些回调方法在Burp内执行各种操作。 | |
IContextMenuFactory | 扩展可以实现IBurpExtenderCallbacks接口,并调用其中的方法来添加自定义的上下文菜单项。这些菜单项可以为用户提供扩展自定义的操作,以满足特定的需求和场景。 | |
IContextMenuInvocation | 在Burp Suite中用于提供上下文菜单调用的详细信息。当用户在Burp Suite界面中右键单击某个目标(例如请求、响应等),触发了一个由扩展提供的自定义上下文菜单时,Burp Suite会将上下文菜单调用的相关信息传递给该接口的实现。 | |
ICookie | 用于保存关于一个HTTP cookie的详细信息 | |
IExtensionHelpers | 为扩展提供一组工具方法,以便于扩展能够更方便地处理一些常见任务,如解析HTTP请求、响应、处理URL、编码解码数据等。 | |
IExtensionStateListener | 这个接口的用途在于当扩展执行一些后台线程、打开系统资源(如文件或数据库连接)时,可以通过注册监听器,在扩展被卸载(unloaded)时,及时终止线程、关闭资源,以确保扩展的操作不会在不需要时持续执行,避免资源泄漏和不必要的开销。 | |
IHttpHeader | 用于保存关于一个HTTP/2头部的详细信息。 | |
IHttpListener | 允许扩展注册一个HTTP监听器,以便在Burp工具发出请求和响应时得到通知。通过注册这个监听器,扩展可以对这些消息执行自定义的分析或修改操作。这使得扩展能够更深入地观察和干预Burp工具处理的HTTP请求和响应,以满足特定的分析、安全性检查或其他定制需求。 | |
IHttpRequestResponse | 这个接口提供了方法,使扩展能够检索和更新HTTP消息的详细信息。在处理HTTP请求和响应的过程中,扩展可以使用这些方法来读取和修改消息的各种属性和内容。 | |
IHttpRequestResponsePersisted | extends IHttpRequestResponse | 允许扩展为IHttpRequestResponse对象应用标记。标记可以用于在不同的情况下进行定位,例如在扫描中标记不同的信息,以便后续的处理或显示。 例如,标记可以用于标识在 Intruder 攻击中哪些部分需要替换为负载,或者标记 Scanner 问题中需要强调的部分。通过这种方式,扩展可以更精确地控制和处理不同的操作。 |
IHttpService | 用于提供关于一个可以发送HTTP请求的HTTP服务的详细信息。 | |
IInterceptedProxyMessage | 这个接口允许扩展通过注册一个代理监听器,从 Burp Proxy 接收有关被拦截的 HTTP 消息的详细信息。扩展可以通过这些信息来分析、处理或修改代理的交互过程。 | |
IIntruderAttack | 用于保存有关 Intruder 攻击的详细信息。 | |
IIntruderPayloadGenerator | 这个接口允许扩展创建自定义的 Intruder 负载生成器,以便在 Intruder 攻击中生成定制的负载。扩展需要实现这个接口来定义如何生成负载,然后在注册的工厂中使用这个接口的实例来为新的 Intruder 攻击生成负载。 | |
IIntruderPayloadGeneratorFactory | 允许扩展创建自定义的 Intruder 负载生成器工厂。扩展可以通过实现这个接口并注册工厂,以便在 Intruder 攻击中生成定制的负载。通过这个机制,扩展可以为 Intruder 提供自定义的负载生成策略,以满足特定的攻击需求。 | |
IIntruderPayloadProcessor | 允许扩展创建自定义的 Intruder 负载处理器。通过实现这个接口并注册处理器,扩展可以在 Intruder 攻击过程中对生成的负载进行自定义的处理操作。这样,扩展可以实现特定的负载修改逻辑,以满足不同的攻击场景和需求。 | |
IMenuItemHandler | 该接口被标记为过时 | 这个接口的作用是允许扩展注册自定义的上下文菜单项。但是由于这个接口已被标记为过时,不再建议使用它,而是建议使用 IContextMenuFactory 接口来实现相同的功能。 |
IMessageEditor | 允许扩展获取Burp的HTTP消息编辑器实例,以便在扩展的用户界面中使用。通过这个编辑器,扩展可以展示和修改Burp的HTTP请求和响应,实现自定义的消息查看和编辑功能,以适应特定的需求和场景。 | |
IMessageEditorController | 允许在 Burp 的消息编辑器中获取有关当前显示的消息的详细信息,以便在进行自定义处理、导出或其他操作时使用。扩展可以通过实现 IMessageEditorController 接口来为编辑器提供有关当前消息的附加信息和操作。 | |
IMessageEditorTab | 对于注册了 IMessageEditorTabFactory 的扩展,必须返回这个接口的实例。Burp 将使用这些实例在其 HTTP 消息编辑器中创建自定义选项卡。 | |
IMessageEditorTabFactory | 这个接口允许扩展为 Burp 的 HTTP 消息编辑器注册一个自定义选项卡的工厂。通过实现这个接口和注册工厂,扩展可以在 Burp 的 HTTP 编辑器中提供自定义的渲染或编辑功能,以满足特定的消息处理需求。 | |
IParameter | 用于保存关于一个HTTP请求参数的详细信息。 | |
IProxyListener | 这个接口允许扩展注册一个自定义的代理监听器,以便在代理工具处理请求和响应时获得通知。通过注册这个监听器,扩展可以实现对请求和响应的自定义处理,还可以控制Burp界面中消息的拦截操作,以适应特定的需求和场景。 | |
IRequestInfo | 这个接口允许扩展分析HTTP请求并检索请求的关键详细信息。通过获取一个 IRequestInfo 对象,扩展可以了解请求的HTTP方法、URL、头部和参数等关键信息,以便在扩展中进行进一步的处理和分析。 | |
IResponseInfo | 这个接口允许扩展分析HTTP响应并检索响应的关键细节。通过获取一个 IResponseInfo 对象,扩展可以了解响应的状态码、头部、内容类型和长度等关键信息,以便在扩展中进行进一步的处理和分析。 | |
IResponseKeywords | 用于表示一组HTTP响应中出现的关键字的计数 | |
IResponseVariations | 用于表示一组HTTP响应之间在不同属性方面的变化。 | |
IScanIssue | 这个接口允许扩展获取Scanner问题的详细信息。扩展可以通过注册监听器或调用方法来获得已有问题的详细信息,还可以自定义问题并添加到扫描结果中。注意,扩展生成的问题描述和其他文本受到HTML白名单的限制,只允许格式化标签和简单的超链接。 | |
IScannerCheck | 这个接口允许扩展创建自定义的Scanner检查,以便在扫描过程中进行主动或被动扫描。 扩展可以通过实现这个接口并注册检查,来添加特定的扫描逻辑。在扫描时,Burp将会调用注册的检查来执行扫描操作,并根据检查的结果报告任何发现的扫描问题。 | |
IScannerInsertionPoint | 这个接口允许定义用于主动扫描检查的插入点。扩展可以通过注册扫描检查来获取这个接口的实例,然后在扫描中使用这些插入点来测试不同的漏洞情况。 | |
IScannerInsertionPointProvider | 这个接口的作用是允许扩展实现自定义的Scanner插入点提供者工厂。通过实现这个接口和注册工厂,扩展可以为Burp的扫描检查提供特定的插入点,以增加扫描的灵活性和适用性。 | |
IScannerListener | 允许扩展注册一个自定义的Scanner监听器,以便在Scanner工具报告新问题时获得通知。通过注册这个监听器,扩展可以执行自定义的问题分析、记录或其他操作,以满足特定的需求和场景。 | |
IScanQueueItem | 这个接口允许扩展获取Burp Scanner主动扫描队列中项目的详细信息。扩展可以通过调用扫描方法来触发主动扫描并获取项目的引用,以便进一步处理扫描结果。 | |
IScopeChangeListener | 允许扩展注册一个自定义的范围变更监听器。通过注册这个监听器,扩展可以在Burp的全局目标范围发生变更时获得通知。这使得扩展可以在范围变更时执行一些特定的操作,例如更新相关的设置或执行某些操作。 | |
ISessionHandlingAction | 这个接口的作用是允许扩展注册一个自定义的会话处理操作。通过注册这个操作,扩展可以在Burp的会话处理规则界面中创建自定义操作,供用户选择并在会话处理期间使用。这使得扩展可以为会话处理规则添加自定义的操作逻辑,以适应不同的会话处理需求。 | |
ITab | 用于向Burp提供自定义选项卡的详细信息,以便将其添加到Burp的用户界面中,使用类似于 IBurpExtenderCallbacks.addSuiteTab() 的方法。 | |
ITempFile | 用于保存通过调用 IBurpExtenderCallbacks.saveToTempFile() 创建的临时文件的详细信息。 | |
ITextEditor | 允许扩展获取Burp的原始文本编辑器实例,以便在扩展的用户界面中实现自定义的文本编辑功能。通过这个编辑器,扩展可以展示和修改文本内容,实现自定义的文本处理功能,以满足特定的需求和场景。 |
插件编写
编写第一个 Burp Suite 插件
- 新建burpExtender项目,把burp的api接口和要写的插件类都放在一个包下
- 既然了解了每一个api的作用,那么我们在编写插件的功能时想要实现什么功能就去实现对应的接口就可以了。下面这个代码就是一个框架,我们要编写的插件就是在框架里面去编写
package burp;
/*1.所有扩展必须实现IBurpExtender接口。
2.实现类必须命名为BurpExtender,位于burp包中,必须声明为public,
*/
public class BurpExtender implements IBurpExtender {
//实现IBurpExtender就必须实现里面的registerExtenderCallbacks
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
}
}
Hello World
- 万事开头难,明知难就不要死磕,先copy经典的代码再尝试自己写一个简单的代码,让自己有点成就感才有学下去的动力。编写插件就和学编程语言一样,第一个代码大概率都是"hello world!"。
package burp;
import burp.IBurpExtender;
import burp.IBurpExtenderCallbacks;
import java.io.PrintWriter;
/*1.所有扩展必须实现IBurpExtender接口。
2.实现类必须命名为BurpExtender,位于burp包中,必须声明为public,
*/
public class BurpExtender implements IBurpExtender {
//实现IBurpExtender就必须实现里面的registerExtenderCallbacks
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
//设置扩展在burp中的名称
callbacks.setExtensionName("Hello World");
//获取输出和错误流
PrintWriter stdout=new PrintWriter(callbacks.getStdout(),true);
PrintWriter stderr=new PrintWriter(callbacks.getStderr(),true);
//向输出和错误流写入信息
stdout.println("Hello output");
stderr.println("Hello errors");
//发布警报到 Burp 的警报标签页
callbacks.issueAlert("Hello alerts");
//抛出运行时异常
throw new RuntimeException("Hello exception");
}
}
导入burp插件
- 然后我们把整个项目打成jar包
- 此时已经成功构建为jar包
- burp导入插件
- 输出处显示Hello output
- 错误报运行时异常
参考链接+代码链接:
相关参考链接和自己的代码也都附上了。
https://portswigger.net/blog/writing-your-first-burp-suite-extension
https://github.com/Xiao-XuXu/burpExtender