简介
Burp在扩展中定义了很多接口,我们只要实现对应的接口,就可以执行对应的操作;如修改请求响应、创建GUI、实现特定的加解密功能...
编写插件支持Python、Java、Ruby三种语言,由于Burp也是Java开发的,考虑到兼容性、动态调试难度、打包方式等,建议插件开发也通过Java语言进行开发。
开发Demo
插件开发生命周期:
- 创建项目,引入依赖
- 创建类实现Burp接口,编写代码实现想要的效果
- 打包为jar,并加载测试
Burp提供了2个版本的API,分别是 Extender API (Legacy)
和 Montoya API
Extender API (Legacy)
: 旧版,所有Burp版本都支持使用,基于JDK 1.8开发Montoya API
: 新版,官方推荐,Burp版本需要不低于v2023.10.3.7
,基于JDK17+开发,但不能高于JDK21
2个版本API的实现逻辑都类似,区别就在于包名规范度和一些命名、函数的区别,总体来说新的API更通俗易懂。
Extender API (Legacy)
个人习惯使用maven来创建项目,当然gradle也是可以的。
在Burp选择Extender -> APIs -> Save interface files
来保存所有的接口到src/main/java
目录下
或者直接在pom.xml
中加入如下依赖
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>burp-extender-api</artifactId>
<version>2.3</version>
</dependency>
[!NOTE]
相比于在pom.xml直接引入依赖,前期更建议用Burp中导出的接口进行实现,因为导出的接口文档更详细、变量名没有混淆更通熟易懂。
在burp
目录下创建BurpExtender
类
[!NOTE]
一些Burpsuite版本在加载插件时,会通过固定的
burp.BurpExtender
类作为入口进行加载,如果jar中没有这个类就会抛出java.lang.ClassNotFoundException: burp.BurpExtender
异常,所以要求在burp
包中创建BurpExtender
类并实现IBurpExtender
接口。
编写代码,实现IBurpExtender
接口,完成输出功能,一些说明如下:
- 实现类必须是
public
的 - 所有的Burp插件都必须实现
IBurpExtender
接口 - 包名为
burp
,实现类名为BurpExtender
(规范) callbacks
是burp提供给我们的1个实例,通过它可是实现多种操作,很重要,后期几乎都会用到它。
package burp;
import java.io.PrintWriter;
public class BurpExtender implements IBurpExtender {
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
// 设置扩展名
callbacks.setExtensionName("TEST");
// 输出方式1
callbacks.printOutput("printOutput method");
// 输出方式2
PrintWriter stdout = new PrintWriter(callbacks.getStdout(), true);
PrintWriter stderr = new PrintWriter(callbacks.getStderr(), true);
stdout.println("stdout method");
stderr.println("stderr method");
// 新增1个alert
callbacks.issueAlert("issue alert method");
// 抛出异常
throw new RuntimeException("exception");
}
}
打包成jar,可参考 使用idea自带的artifacts,注意这里不需要指定Main Class,OK保存后选择菜单栏中的 Build -> Build Artifacts
即可打包jar保存到output目录中。
然后再到Burp中加载该插件即可,展示如下。
Montoya API
还是使用maven创建项目
选择 Extensions -> APIs -> Save interface files
保存接口到src/main/java
目录下
或者直接引入依赖(依然不推荐)
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/montoya-api -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>montoya-api</artifactId>
<version>0.9.25</version>
</dependency>
创建类实现 BurpExtension
接口
package org.gm7;
import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.logging.Logging;
public class MyTestExtender implements BurpExtension {
@Override
public void initialize(MontoyaApi api) {
// 设置扩展名
api.extension().setName("TEST");
// 定义日志
Logging logging = api.logging();
// stdout输出
logging.logToOutput("Hello output.");
// stderr输出
logging.logToError("Hello error.");
// alert消息输出
logging.raiseInfoEvent("Hello info event.");
logging.raiseDebugEvent("Hello debug event.");
logging.raiseErrorEvent("Hello error event.");
logging.raiseCriticalEvent("Hello critical event.");
// 抛出异常信息
throw new RuntimeException("Hello exception.");
}
}
打包成jar
加载测试
动态调试
动态调试能够帮助我们在代码运行时发现并修复错误、优化性能,并验证逻辑是否按照预期执行。Burp插件遇到一些异常情况时,不会主动抛出异常信息,以及开发过程中可以动态的测试每个方法的用法。
IDEA配置
得到debug的参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Burp启动命令配置
启动时加上刚才的debug参数
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -noverify -Xbootclasspath/p:burp-loader-keygen.jar -jar burpsuite_pro_v2020.2.jar
这个时候就可以下断点动态调试我们的插件了。
开发技巧
很多时候不知道传递的参数对象有什么用,或者内容有哪些,可以通过下断点定位到对应的对象,然后利用IDEA的
Evaluate Expression...
功能进行测试。Burpsuite GUI基于Java Swing开发的,所以想要各种UI都可以直接画,比如点击某个按钮就弹窗这种
巩固思路
遇到瓶颈了,或者想实现一个功能但是不知道怎么下手,可以多参考类似的插件其他人是如何开发的,学会举一反三。
BAPP Store中的插件
或者找到路径自己反编译
Mac 保存在
/Users/<user>/.BurpSuite/bapps
,Windows保存在C:\Users\<youruser>\AppData\Roaming\BurpSuite\bapps
- 个人开发的开源插件