Legacy接口编写BurpSuite插件

在burp目录下新建类BurpExtender.java,必须是在burp目录下。其他目录旧版BurpSuite认不出来。

代码如下:

import burp.*;
import com.self.burp.ui.UIMain;
import javax.swing.*;
import java.awt.*;
import java.io.PrintWriter;
import java.util.List;

// implements 继承IBurpExtender类, ITab类, IHttpListener类
public class BurpExtender implements IBurpExtender, ITab, IHttpListener {
    private IBurpExtenderCallbacks callbacks;
    private IExtensionHelpers helpers;
    // 采用PrintWriter标准输出,打印log信息
    private PrintWriter stdout;
    private JPanel jPanelMain;
    // 创建BurpUIMain对象才能实现对UI内容修改
    BurpUIMain burpUIMain = new UIMain();

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks iBurpExtenderCallbacks) {
    // 插件入口类IBurpExtender,所有插件都必须实现该接口,该接口下面只有如上一个方法,并只会在启动插件的时候调用一次。因此常在该方法内执行一些初始化操作,如定义插件名称、初始化UI、注册全局变量、注册监听器等
        this.callbacks = iBurpExtenderCallbacks;
        // 设置插件名字
        callbacks.setExtensionName("RequestUrlPrint");
        // 采用helpers分析数据包
        this.helpers = callbacks.getHelpers();
        // 激活插件时,显示的内容
        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.stdout.println("Loading successfully ...");
        // 用于注册Proxy监听器,监听Proxy模块正在处理的请求和响应的通知
        // callbacks.registerProxyListener(this);
        // 用于注册HTTP监听器,监听所有模块(Proxy、Repeater等模块)正在处理的请求和响应的通知
        callbacks.registerHttpListener(this);
        // 初始化UI组件,获取到 UI 中主界面变量,注册到BurpSuite
        jPanelMain = burpUIMain.getRoot();
        callbacks.customizeUiComponent(jPanelMain);
        // 添加自定义的Tab页面
        callbacks.addSuiteTab(this);
    }

    @Override
    public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
        // processHttpMessage(),i表示是从哪个工具获取到的请求,b表示当前是请求包还是响应包,iHttpRequestResponse表示获取到的请求包或响应包
        if (i==callbacks.TOOL_PROXY || i==callbacks.TOOL_REPEATER || i==callbacks.TOOL_INTRUDER) {
            // 判断是请求包or响应包
            if (b) {
                // helpers.analyzeRequest()方法分析获取请求包信息
                IRequestInfo iRequestInfo = helpers.analyzeRequest(iHttpRequestResponse);
                // iHttpRequestResponse.getRequest() 获取请求信息,格式 byte[]
                // iHttpRequestResponse.getHttpService().getPort() 获取请求端口
                // iHttpRequestResponse.getHttpService().getHost() 获取请求Host地址
                // iHttpRequestResponse.getHttpService().getProtocol() 获取请求协议http或者https
                // iHttpRequestResponse.setHighlight 设置请求高亮显示
                // iHttpRequestResponse.setComment() 设置proxy中备注信息
                // iHttpReueqstResponse.setRequest() 请求修改后,设置新的请求发送
                // iRequestInfo.getUrl() 获取完整请求URL
                // iRequestInfo.getHeaders() 获取请求头,格式 List<String>
                // iReuqestInfo.getMethod() 获取请求方法:Post、GET等
                // iRequestInfo.getParameters() 获取参数,格式 List<IParameter>
                // 获取请求主体
                IRequestInfo iRequestInfo = this.helpers.analyzeRequest(iHttpRequestResponse);
                byte[] bytes = iHttpRequestResponse.getRequest();
                String reqbody = this.helpers.bytesToString(bytes).substring(iRequestInfo.getBodyOffset()).trim();
                String reqUrl = iRequestInfo.getUrl().toString();
                String request = new String(iHttpRequestResponse.getRequest());
                List<String> headers = iRequestInfo.getHeaders();
                byte[] body = request.substring(iRequestInfo.getBodyOffset()).getBytes();
                // 添加请求头
                headers.add("reqtest:abcd1234");
                // 使用helpers.buildHttpMessage(Headers,)设置新的请求包,返回格式 byte[]
                byte[] newreq = helpers.buildHttpMessage(headers, body); 
                // 设置新的请求包,并发送
                iHttpRequestResponse.setRequest(newreq);
            } else {
                // iHttpReueqstResponse.setResponse() 设置修改后的响应包
                // iHttpReueqstResponse.getResponse() 获取响应包信息,格式 byte[]
                // iResponseInfo.getStatusCode() 获取响应码
                // iResponseInfo.getHeaders() 获取响应头,格式 List<String>
                
                IResponseInfo iResponseInfo = helpers.analyzeResponse(iHttpRequestResponse.getResponse());
                List<String> headers = iResponseInfo.getHeaders();
                String resp = new String(iHttpRequestResponse.getResponse());
                byte[] body = resp.substring(iResponseInfo.getBodyOffset()).getBytes();
                // 添加响应头
                headers.add("resp:test");
                // 使用helpers.buildHttpMessage()设置新的响应包,返回格式 byte[]
                byte[] newresp = helpers.buildHttpMessage(headers, body);
                // 设置新的响应包,并发送
                iHttpRequestResponse.setResponse(newresp);
            }
        }
        // 使用stdout.println()打印日志
        stdout.println(
            (b ? "HTTP request to " : "HTTP response from ") + iHttpRequestResponse.getHttpService() + "[" + callbacks.getToolName(i) + "]"
        );
    }

    @Override
    public String getTabCaption() {
        // 设置自定义Tab名称
        return "BurpGui";
    }

    @Override
    public Component getUiComponent() {
        return jPanelMain;
    }


}

使用 Idea IDE 的Swing UI设计器,新建一个GUI窗体,就可以方便设计GUI页面了

UIMain.java代码如下:

import com.self.burp.BurpExtender;
import javax.swing.*;
import java.awt.*;

public class UIMain {
    private JPanel root;
    
    public UIMain() {
        //下面可以添加各类监听器
        
        **....此处省略....**
    
    }
    
    // 通过函数返回JPanel
    public JPanel getRoot() {
        return root;
    }
}

下面可以根据自己需求利用BurpSuite Legacy扩展接口编写BurpSuite插件了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K2epUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值