暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Burpsuite插件编写指南-Java篇(2)

白帽子飙车路 2021-10-19
2093

小目标

继续深入。

先给自己定一个小目标,实现这样一个插件:

Burpsuite中的包文自动传送到我们的插件里

新建项目

我们一起重新新建一个项目。

在 IDEA 新建一个 gradle 项目,SDK选择11

点击下一步,直到完成

接着在 build.gradle 文件中添加Burpsuite插件的依赖(类似于pom.xml)

    compile 'net.portswigger.burp.extender:burp-extender-api:2.2'

目前公开的依赖版本可见:

https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api

然后点击一下gradle的更新,将依赖下载下来,这样就将我们之前手动复制api文件的操作省掉了。

随便写点代码,尝试编译成jar包

package burp;

public class BurpExtender implements IBurpExtender{
    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        callbacks.setExtensionName("sendmyexp");
        callbacks.printOutput("load success");
    }
}

我们在build目录下的lib文件夹中能清晰的看见,已经打包成功

然后直接导入到burpsuite查看

OK 成功 接着下一步

我们需要给自己的插件构建ui界面

在 build.gradle 文件中添加gui的依赖

https://mvnrepository.com/artifact/com.intellij/forms_rt/7.0.3

    implementation group: 'com.intellij', name: 'forms_rt', version: '7.0.3'

新建一个名为ui的包

接着开始画画。先给窗体设置一个名字 Root,等会要用到。

然后给界面添加一个 Jlabel+JTextArea+JButton,布局的话后面再讲,小伙伴先自己研究下。

修改idea的Gui设计器:

然后点击构建,就会自动生成对应的java代码

同时我们修改 BurpExtender的代码,让插件可以在Burpsuite上新增标签页:

package burp;

import burp.ui.SendExpGui;

import java.awt.*;
import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender,ITab{
    public PrintWriter stdout;
    private SendExpGui sendExpGui;
    private IBurpExtenderCallbacks callbacks;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        this.callbacks = callbacks;
        callbacks.setExtensionName("sendmyexp");
        sendExpGui = new SendExpGui(this);
        callbacks.addSuiteTab(this);
    }

    @Override
    public String getTabCaption() {
        return "SendMyExp";
    }

    @Override
    public Component getUiComponent() {
        return sendExpGui.$$$getRootComponent$$$();
    }
}

然后去实现按 "Clear"按钮清空的功能,直接右键创建侦听器

编写一个清空文本框的行为,代码如下:

@Override
public void actionPerformed(ActionEvent e) {
    //清空
    TextArea.setText("");
}

接着再去写传递域名的函数

最终全部的BurpExtender代码如下

package burp;

import burp.ui.SendExpGui;
import java.awt.*;
import java.io.PrintWriter;


public class BurpExtender implements IBurpExtender,ITab,IHttpListener{

    private IBurpExtenderCallbacks callbacks;
    public PrintWriter stdout;
    private SendExpGui sendExpGui;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        this.callbacks = callbacks;
        callbacks.setExtensionName("Sendexp");
        sendExpGui = new SendExpGui(this);
        callbacks.addSuiteTab(this);
        callbacks.registerHttpListener(this);
    }

   @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
                                   IHttpRequestResponse messageInfo) {
       // only process requests
       if (messageIsRequest)
       {
           IHttpService httpService = messageInfo.getHttpService();
           sendExpGui.appendOutput(httpService.getHost());
       }
    }

    @Override
    public String getTabCaption() {
        return "SendExp";
    }

    @Override
    public Component getUiComponent() {
        return sendExpGui.$$$getRootComponent$$$();
    }
}


SendExpGui代码如下:

package burp.ui;

import burp.BurpExtender;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SendExpGui {
    private JPanel root;
    private JTextArea BurpPrint;
    private JButton clearButton;
    private final StringBuilder output;


    public SendExpGui(BurpExtender burpExtender) {

        output = new StringBuilder();
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                BurpPrint.setText("");
            }
        });
    }


    public void appendOutput(String message) {
        output.append(message);
        output.append("\n");
        BurpPrint.setText(output.toString());
    }

    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        root = new JPanel();
        root.setLayout(new GridBagLayout());
        root.setBackground(new Color(-12913370));
        root.setEnabled(true);
        root.setMaximumSize(new Dimension(2147483647, 2147483647));
        root.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), null, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        final JLabel label1 = new JLabel();
        label1.setBackground(new Color(-12913370));
        label1.setHorizontalAlignment(10);
        label1.setHorizontalTextPosition(11);
        label1.setText("Result:   ");
        GridBagConstraints gbc;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.WEST;
        root.add(label1, gbc);
        clearButton = new JButton();
        clearButton.setText("Clear");
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weightx = 1.0;
        root.add(clearButton, gbc);
        final JScrollPane scrollPane1 = new JScrollPane();
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        root.add(scrollPane1, gbc);
        BurpPrint = new JTextArea();
        BurpPrint.setColumns(0);
        BurpPrint.setLineWrap(true);
        BurpPrint.setRows(0);
        BurpPrint.setText("Burpsuit抓取的数据");
        scrollPane1.setViewportView(BurpPrint);
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return root;
    }

}


实现效果:





文章转载自白帽子飙车路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论