实现效果

创建鼠标右键菜单,点击后,出现几个功能:

  • 获取History中最新的Cookie并弹窗显示
  • 增加XFF头

涉及接口:

  • IContextMenuFactory

实现代码

创建项目过程省略,直接从代码入手,使用旧版API开发。

package burp;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BurpExtender implements IBurpExtender, IContextMenuFactory {
    // 回调对象
    private IBurpExtenderCallbacks callbacks;
    // 辅助类,一般用于辅助分析数据包结构
    private IExtensionHelpers helpers;

    // 实现 IBurpExtender 接口函数
    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        // 设置插件名字
        callbacks.setExtensionName("Demo");

        // callbacks到处都要用,搞成类变量
        this.callbacks = callbacks;

        // 辅助类,一般用于辅助分析数据包结构,类变量方便其他函数调用
        helpers = callbacks.getHelpers();

        // 注册 ContextMenuFactory ,必须要注册了burp有新消息才会通知你
        callbacks.registerContextMenuFactory(this);


    }

    @Override
    public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
        // 定义菜单对象
        List<JMenuItem> menuItems = new ArrayList<>();
        // 判断点击鼠标右键的地方是否为repeater中
        if (invocation.getToolFlag() != IBurpExtenderCallbacks.TOOL_REPEATER){
            return menuItems;
        }
        // 创建子菜单-一级菜单
        JMenuItem getCookie = new JMenuItem("getCookie");
        getCookie.addActionListener(new getCookieAction(callbacks)); // 添加动作

        // 创建子菜单-多级菜单
        JMenu addXFF = new JMenu("XFF");
        JMenuItem addXFFItem = new JMenuItem("addXFF");
        addXFF.add(addXFFItem); // 多级菜单
        addXFFItem.addActionListener(new addXFFAction(invocation, helpers)); // 添加点击实现逻辑

        // 添加到菜单对象中
        menuItems.add(getCookie);
        menuItems.add(addXFF);
        return menuItems;
    }

    /**
     * 点击getCookie后执行的操作
     */
    private class getCookieAction implements ActionListener {
        private IBurpExtenderCallbacks callbacks;
        public getCookieAction(IBurpExtenderCallbacks callbacks) {
            this.callbacks = callbacks;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // 获取所有的history
            IHttpRequestResponse[] proxyHistory = callbacks.getProxyHistory();
            // 拿到最新的
            IHttpRequestResponse newHistory = proxyHistory[proxyHistory.length - 1];
            // 拿到最新的请求包
            String httpRequest = new String(newHistory.getRequest());
            String[] httpRequestSplit = httpRequest.split("\r\n");
            // 匹配到Cookie
            String cookie = "";
            for (String data: httpRequestSplit) {
                if (data.startsWith("Cookie")) {
                    cookie = data;
                    break;
                }
            }
            // 如果Cookie不为空,弹窗显示Cookie
            if (!cookie.equals("")){
                JOptionPane.showMessageDialog(null, cookie, "new cookie", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }

    /**
     * 点击addXFF后执行的操作
     */
    private class addXFFAction implements ActionListener {
        private IContextMenuInvocation invocation;
        private IExtensionHelpers helpers;
        public addXFFAction(IContextMenuInvocation invocation, IExtensionHelpers helpers) {
            this.invocation = invocation;
            this.helpers = helpers;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // 可以弹出一个框,让用户输入增加的IP;但此处主要为了演示使用,故不深入。

            // 获取选中的请求
            IHttpRequestResponse message = invocation.getSelectedMessages()[0];
            // 获取请求
            IRequestInfo requestInfo = helpers.analyzeRequest(message.getRequest());
            // 获取header
            List<String> headers = requestInfo.getHeaders();
            // 添加header
            headers.add("X-Forwarded-For: 1.2.3.4");
            // 生成请求数据包,后面是body
            byte[] newReq = helpers.buildHttpMessage(headers, Arrays.copyOfRange(message.getRequest(), requestInfo.getBodyOffset(), message.getRequest().length));
            // 设置到显示面板中
            message.setRequest(newReq);
        }
    }
}

实现测试

如果不在repeater中,无法显示菜单。

image-20240920上午83839561

在repeater中可以显示菜单

image-20240920上午84032718

点击 getCookie 后获取到history中最新的cookie

image-20240920上午84120323

点击addXFF,则在header最后增加了对应的XFF头。

image-20240920上午84214507

扩展总结

  • callbacks对象提供了很多实用的方法,burp里面的大多数数据都可以从它获取到(issues、history、scope、sitemap...),大多数操作也可以由它创建(主动扫描、爬虫任务...)。
  • 只需要实现IContextMenuFactory接口,然后创建对应的菜单和实现方法即可
  • 可以通过invocation 这个对象获取到选中的内容,从而进行各种操作(增删改查数据包、颜色、comment等)

参考

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

results matching ""

    No results matching ""