简介

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也是可以的。

image-20240912下午13028451

在Burp选择Extender -> APIs -> Save interface files来保存所有的接口到src/main/java目录下

image-20240912下午13836708

或者直接在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接口。

image-20240913下午82251335

编写代码,实现IBurpExtender接口,完成输出功能,一些说明如下:

  1. 实现类必须是public
  2. 所有的Burp插件都必须实现IBurpExtender接口
  3. 包名为burp,实现类名为BurpExtender(规范)
  4. 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目录中。

image-20240913下午14009571

然后再到Burp中加载该插件即可,展示如下。

image-20240913下午83207234

Montoya API

还是使用maven创建项目

image-20240914下午12219861

选择 Extensions -> APIs -> Save interface files 保存接口到src/main/java目录下

image-20240914下午12326766

或者直接引入依赖(依然不推荐)

<!-- 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

image-20240914下午13636196

加载测试

image-20240914下午14010273

动态调试

动态调试能够帮助我们在代码运行时发现并修复错误、优化性能,并验证逻辑是否按照预期执行。Burp插件遇到一些异常情况时,不会主动抛出异常信息,以及开发过程中可以动态的测试每个方法的用法。

IDEA配置

image-20240914下午124504917

image-20240914下午124652082

得到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

image-20240914下午124935424

这个时候就可以下断点动态调试我们的插件了。

image-20240914下午125158966

开发技巧

  • 很多时候不知道传递的参数对象有什么用,或者内容有哪些,可以通过下断点定位到对应的对象,然后利用IDEA的Evaluate Expression...功能进行测试。

    image-20240914下午11141965

  • Burpsuite GUI基于Java Swing开发的,所以想要各种UI都可以直接画,比如点击某个按钮就弹窗这种

巩固思路

遇到瓶颈了,或者想实现一个功能但是不知道怎么下手,可以多参考类似的插件其他人是如何开发的,学会举一反三。

  • BAPP Store中的插件

    image-20240914下午125954486

    或者找到路径自己反编译

    image-20240914下午10021427

    Mac 保存在 /Users/<user>/.BurpSuite/bapps,Windows保存在 C:\Users\<youruser>\AppData\Roaming\BurpSuite\bapps

    image-20240914下午10709236

  • 个人开发的开源插件

参考文档

Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2024-09-28 14:10:19

results matching ""

    No results matching ""