一、插件扩展作用
BurpSuite插件:
BurpSuite程序提供了一个用于扩展 BurpSuite 的功能的工具,它依赖于 Burp 提供的 API。通过该 API接口,用户可以根据自己的需求开发定制化的功能。
BurpSuite插件作用:
1、自定义用户的UI界面:插件可以自定义一个Tab界面,提供用户操作。
2、参数处理和修改:插件可以帮助用户处理请求和响应参数,例如自动添加或修改请求参数、替换敏感数据或关键字、对请求进行加密等。
3、自定义扫描插件:根据漏洞的POC编写对应的扩展插件,插件可以自动验证漏洞,自动化挖掘漏洞。
二、插件开发基础
01、支持的语言类型
Burp Suite 插件扩展开发支持三种主要的编程语言:Java 和 Python、Ruby。这三种语言都可以用于开发插件,并且在功能上并没有太大区别。然而,使用原生的 Java 开发插件相比使用Python、Ruby,可以获得更高的加载和执行效率。
02、接口
接口的基本概念
Java 接口是一种抽象的编程构造,它定义了一组方法签名(方法名称、参数和返回类型),但没有提供方法的实现细节。接口可以看作是一种契约或协议,规定了类应该具备的行为。具体的实现则由实现接口的类来提供。
接口使用关键字 interface 来声明,并可以包含方法、常量和默认方法。
Java 接口的声明语法格式如下:
public interface InterfaceName {
// 声明常量
// 声明方法(没有方法体)
// 默认方法的定义
// 静态方法的定义
}
BurpSuite接口声明:
public interface IBurpExtender
{
void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks);
}
*左右滑动查看更多
一个简单的示例,演示如何声明和使用接口:
// 定义接口
public interface Animal {
// 声明方法
void makeSound();
}
// 实现接口的类
public class Dog implements Animal {
// 实现接口中的方法
public void makeSound() {
System.out.println("Woof!");
}
}
// 使用接口
public class Main {
public static void main(String[] args) {
// 创建接口的实例
Animal dog = new Dog();
// 调用接口的方法
dog.makeSound(); // 输出: Woof!
}
}
*左右滑动查看更多
在编写BurpSuite的插件之前,我们需要对Java的接口有一定的了解,才会方便我们后续对BurpSuite的API接口的学习和使用。
BurpSuite相关接口
BurpSuite官方提供了每一个API接口的具体说明:
https://portswigger.net/burp/extender/api/index.html
*左右滑动查看更多
a、IBurpExtender接口
接口规定在对BurpSuite的插件进行开发,我们必须继承IBurpExtender接口,并且我们实现该接口的实现类必须叫“BurpExtender.java”并声明为public。
该接口具体实现的方法:
package burp;
public class BurpExtender implements IBurpExtender{
public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
// TODO here
}
}
*左右滑动查看更多
b、IBurpExtenderCallbacks接口
该接口在上文的IBurpExtender接口当中有提到,即registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks)。
IBurpExtenderCallbacks 接口是 Burp Suite 插件开发中的关键接口之一,它提供了与 Burp Suite 交互的回调方法和功能。接口定义了许多方法,用于处理插件的初始化、发送和接收 HTTP 请求、处理扫描结果、创建菜单和标签等。
IBurpExtenderCallbacks接口方法介绍:
1、registerHttpListener(IHttpListener listener):此方法用于注册将收到通知的侦听器 任何 Burp 工具发出的请求和响应。
2、registerProxyListener(IProxyListener listener):此方法用于注册将收到通知的侦听器代理工具正在处理的请求和响应。
3、createBurpMenu(java.awt.Component component):此方法用于自定义 Burp Suite 用户界面组件的外观和行为。通过该方法,你可以对 Burp Suite 的各个界面组件进行修改和定制。
关于该接口其他方法的具体使用可到官网的接口说明查看:
c、IHttpListener接口
自定义扩展可以实现此接口,通过调用上文提到的IBurpExtenderCallbacks.registerHttpListener() 注册一个 HTTP 监听器。BurpSuite发起 HTTP 请求或收到 HTTP 响应都会通知此监听器。自定义插件可以得到这些交互的数据,进行分析和修改。
三、插件开发
通过以上对IBurpExtender接口、IBurpExtenderCallbacks接口、IHttpListener接口的了解,从这三个接口学习一个Burpsuite的插件是如何编写,以及它们三个的调用关系。
环境搭建
环境配置和搭建: idea+maven+jdk8。
dean创建Maven项目。
引入依赖包。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>BurpSuite</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>burp-extender-api</artifactId>
<version>LATEST</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
*左右滑动查看更多
查看BurpSuit依赖包导入情况。
example-event-listeners插件案例学习
package burp;
import java.io.PrintWriter;
public class BurpExtender implements IBurpExtender, IHttpListener,
IProxyListener, IScannerListener, IExtensionStateListener
{
private IBurpExtenderCallbacks callbacks;
private PrintWriter stdout;
//
// implement IBurpExtender接口
//
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
{
this.callbacks = callbacks;
// 设置插件的名字
callbacks.setExtensionName("Event listeners");
stdout = new PrintWriter(callbacks.getStdout(), true);
//注册一个HttpListener对象,所有经过BurpSuite的数据包都将通知该对象,执行processHttpMessage的内容
callbacks.registerHttpListener(this);
// 注册一个IProxyListener对象,所有经过BurpSuite的Proxy模块的数据包都将通知该对象,执行processProxyMessage内容
callbacks.registerProxyListener(this);
}
//
// implement IHttpListener
//
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)
{
stdout.println(
(messageIsRequest ? "HTTP request to " : "HTTP response from ") +
messageInfo.getHttpService() +
" [" + callbacks.getToolName(toolFlag) + "]");
}
//
// implement IProxyListener
//
public void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message)
{
stdout.println(
(messageIsRequest ? "Proxy request to " : "Proxy response from ") +
message.getMessageInfo().getHttpService());
}
}
*左右滑动查看更多
将example-event-listeners代码导入idea进行打包。
导入BurpSuite。
查看插件详情:在控制台可以看到Proxy请求信息和HTTP request的请求信息(从BurpSuite发出是数据包都可为HTTP request)。
example-event-listeners插件案例详情,通过该案例总结一下(Burpsuite主程序)和(burp插件程序)之间的调用关系:
1、(Burpsuite主程序)加载(burp插件程序),调用BurpExtender类(编写的插件的类必须命名为BurpExtender),实际调用BurpExtender类中registerExtenderCallbacks方法,传递IBurpExtenderCallbacks 接口类型参数,以IBurpExtenderCallbacks 接口的变量为主,通过 sIBurpExtenderCallbacks 接口的对象进行注册调用。
2、(burp插件程序)注册HttpListener接口,BurpExtender类继承HttpListener接口。告诉(Burpsuite主程序)当前HttpListener对象的存在。
3、(Burpsuite主程序)产生了一个请求或者响应包,比如代理proxy收到了一个来自浏览的请求,(Burpsuite主程序)将通知注册的HttpListener接口。
4、(burp插件程序)中的HttpListener对象收到通知,执行自己的processHttpMessage函数中的内容。
在example-event-listeners插件的案例中,通过在IBurpExtenderCallbacks 接口中注册HttpListener接口,BurpExtender类继承HttpListener接口,执行HttpListener接口processProxyMessage函数,将请求和响应的通知输出到UI中。
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)
{
stdout.println(
(messageIsRequest ? "HTTP request to " : "HTTP response from ") +
messageInfo.getHttpService() +
" [" + callbacks.getToolName(toolFlag) + "]");
}
*左右滑动查看更多
四、小结
编写BurpSuite插件程序注意事项:
1、BurpSuite插件程序的包名称必须为burp,类的名称必须是BurpExtender,并且是public。
2、BurpSuite插件程序必须继承实现IBurpExtender接口。
3、BurpSuite插件程序需要调用其他的接口,如HttpListener, IProxyListener接口,必须在registerExtenderCallbacks方法中,通过IBurpExtenderCallbacks对象进行注册,注册过的函数才会生效。
原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| BurpSuite插件开发(JAVA)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论