BurpSuite实战教程03-BurpSuite插件开发

news2024/11/15 6:46:52

burp插件开发

Burp Suite的强大除了自身提供了丰富的可供测试人员使用的功能外,其提供的支持第三方拓展插件的功能也极大地方便使用者编写自己的自定义插件。,Burp Suite支持的插件类型有Java、Python、Ruby三种。无论哪种语言的实现,开发者只要选择自己熟悉的语言,按照接口规范去实现想要的功能即可。下面我们就来看看如何开发一个Burp Extender的插件。 本章讲述的主要内容有:

  1. API描述
  2. Burp插件的编写前准备
  3. Burp插件的编写(Java语言版)

api描述

打开Burp Extender的APIs的Tab页,看到的界面如下图所示:
在这里插入图片描述

注意不同版本的api可能不一样,我之前按照官网最新的使用maven依赖的方式,就因为BurpExtension最新版本使用初始化方法initalize和我当前版本的initalise差一个字母,导致折腾了半天,建议开发使用当前文件的api接口导出到项目源代码目录,因为maven的api压根不知道版本对应关系,我的版本:V2022.9。

在idea中新建一个maven空项目,点击apis - save interface files到src/main/java目录
在这里插入图片描述
目录结构如下
在这里插入图片描述
具体api的用途请参考api的描述或者在apis面板上save javadoc files打开html查看
在这里插入图片描述
或者进入官网查看:
https://portswigger.github.io/burp-extensions-montoya-api/javadoc/burp/api/montoya/MontoyaApi.html

插件编写前准备

源代码参考

burpsuite没有详细文档描述插件如何编写,提供了很多相关的案例,需要自行阅读
https://github.com/PortSwigger/burp-extensions-montoya-api-examples

java环境配置

首先确定你burpsuite版本需要使用的jdk,比如我的是jdk17,平时开发都使用的jdk8
在这里插入图片描述
修改idea的环境
点击project structure - SDKS新增jdk17
在这里插入图片描述
Modules上的language level如果没有17就选最大就行,我这里是13就可以了,这只是idea编译代码用到的版本
Project上的Project SDK换成17即可
在这里插入图片描述
pom.xml中添加

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

使用maven执行mvn package确认是否使用的jdk17
在这里插入图片描述
修改pom.xml修改打包方式为jar

    <packaging>jar</packaging>

开启调试

打开idea 运行的Edit Configurations,新建一个Remote,复制command line arguments for remote JVM
Host設置為:localhost,port设置为:50055
在这里插入图片描述
将复制内容添加到burpsuite的bat文件中
在这里插入图片描述
jvm参数加上即可
在这里插入图片描述
重新启动burpsuite
netstat -aon | findstr 50055 查看端口是否开启。

helloworld编写

创建一个测试类:HelloWorld

package com.qj.bc;

import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.logging.Logging;

public class HelloWorld implements BurpExtension {
    @Override
    public void initialise(MontoyaApi api) {
        Logging logging = api.logging();

        // write a message to our output stream
        logging.logToOutput("Hello output.");

        // write a message to our error stream
        logging.logToError("Hello error.");

        // write a message to the Burp alerts tab
        logging.raiseInfoEvent("Hello info event.");
        logging.raiseDebugEvent("Hello debug event.");
        logging.raiseErrorEvent("Hello error event.");
        logging.raiseCriticalEvent("Hello critical event.");

        // throw an exception that will appear in our error stream
        throw new RuntimeException("Hello exception.");
    }
}

使用mvn package打包。
启动远程调试
在这里插入图片描述
打开burpsuite - Extener - Extensions - Add 加入一个
在这里插入图片描述
点击next后,断点断下
在这里插入图片描述
跳过断点后 查看输出和错误日志
在这里插入图片描述
Errors显示
在这里插入图片描述

自定义抓包日志显示器

需求:拦截bp的抓包日志显示到自定义的表格中,点击表格能显示请求和响应的信息。
效果图如下
在这里插入图片描述
官网实例参考:
https://github.com/PortSwigger/burp-extensions-montoya-api-examples/tree/main/customlogger

添加请求过滤器

package com.qj.bc.customlogger;

import burp.api.montoya.core.MessageAnnotations;
import burp.api.montoya.core.ToolSource;
import burp.api.montoya.http.HttpHandler;
import burp.api.montoya.http.RequestHandlerResult;
import burp.api.montoya.http.ResponseHandlerResult;
import burp.api.montoya.http.message.requests.HttpRequest;
import burp.api.montoya.http.message.responses.HttpResponse;

public class MyHttpHandler implements HttpHandler
{
    private final MyTableModel tableModel;

    public MyHttpHandler(MyTableModel tableModel)
    {

        this.tableModel = tableModel;
    }


    @Override
    public RequestHandlerResult handleHttpRequest(HttpRequest request, MessageAnnotations annotations, ToolSource toolSource) {
        return RequestHandlerResult.from(request,annotations);
    }

    /**
     *
     * @param request 被抓包的请求信息
     * @param response 返回的响应信息
     * @param annotations 消息标记,比如高亮,添加注释等。
     * @param toolSource 这个请求来源于那个工具,比如是proxy还是爆破,还是其他的工具,比如proxy抓包的HTTP请求,爆破自定义的请求等等
     * @return
     */
    @Override
    public ResponseHandlerResult handleHttpResponse(HttpRequest request, HttpResponse response, MessageAnnotations annotations, ToolSource toolSource) {
        tableModel.add(new HttpResponseReceived(toolSource,request,response));
        return ResponseHandlerResult.from(response,annotations);
    }
}

添加http请求对象

因为http拦截到有四个参数

  1. request 被抓包的请求信息
  2. response 返回的响应信息
  3. annotations 消息标记,比如高亮,添加注释等。
  4. toolSource 这个请求来源于那个工具,比如是proxy还是爆破,还是其他的工具,比如proxy抓包的HTTP请求,爆破自定义的攻击请求(点击start attack才能抓到)等等

封装一个类用于包装这几个参数,因为界面上要显示请求响应,来源等信息

package com.qj.bc.customlogger;

import burp.api.montoya.core.ToolSource;
import burp.api.montoya.http.message.requests.HttpRequest;
import burp.api.montoya.http.message.responses.HttpResponse;

public class HttpResponseReceived {
    private ToolSource toolSource;
    private HttpRequest request;
    private HttpResponse response;

    public HttpResponseReceived(ToolSource toolSource, HttpRequest request, HttpResponse response) {
        this.toolSource = toolSource;
        this.request = request;
        this.response = response;
    }

    public ToolSource toolSource(){
        return toolSource;
    }
    public HttpRequest initiatingRequest(){
        return request;
    }
    public HttpResponse getResponse(){
        return response;
    }
}

添加表格数据源

,这个数据最终显示在表格中,定义一个表格modal

package com.qj.bc.customlogger;
import burp.api.montoya.http.message.responses.HttpResponse;

import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
import java.util.List;
public class MyTableModel extends AbstractTableModel
{
    private final List<HttpResponseReceived> log;

    public MyTableModel()
    {
        this.log = new ArrayList<>();
    }

    @Override
    public synchronized int getRowCount()
    {
        return log.size();
    }

    @Override
    public int getColumnCount()
    {
        return 2;
    }

    @Override
    public String getColumnName(int column)
    {
        return switch (column)
                {
                    case 0 -> "Tool";
                    case 1 -> "URL";
                    default -> "";
                };
    }

    @Override
    public synchronized Object getValueAt(int rowIndex, int columnIndex)
    {
        HttpResponseReceived responseReceived = log.get(rowIndex);

        return switch (columnIndex)
                {
                    case 0 -> responseReceived.toolSource().toolType();
                    case 1 -> responseReceived.initiatingRequest().url();
                    default -> "";
                };
    }

    public synchronized void add(HttpResponseReceived responseReceived)
    {
        int index = log.size();
        log.add(responseReceived);
        fireTableRowsInserted(index, index);
    }

    public synchronized HttpResponseReceived get(int rowIndex)
    {
        return log.get(rowIndex);
    }
}

定义burp拓展

package com.qj.bc.customlogger;

import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.ui.UserInterface;
import burp.api.montoya.ui.editor.HttpRequestEditor;
import burp.api.montoya.ui.editor.HttpResponseEditor;

import javax.swing.*;
import java.awt.*;

import static burp.api.montoya.ui.editor.EditorOptions.READ_ONLY;

public class CustomLogger implements BurpExtension
{
    private MontoyaApi api;

    @Override
    public void initialise(MontoyaApi api)
    {
        this.api = api;
        MyTableModel tableModel = new MyTableModel();
        //在burpsuite中添加一个tab页签,名字是Custom logger
        api.userInterface().registerSuiteTab("Custom logger", constructLoggerTab(tableModel));
        //注册一个http抓包请求拦截器,用来获取所有抓包的数据添加到表格
        api.http().registerHttpHandler(new MyHttpHandler(tableModel));
    }

    /**
     * 使用JSplitPane,添加一个左面是http请求的表格,下面是个http的请求和响应编辑器
     * @param tableModel
     * @return
     */
    private Component constructLoggerTab(MyTableModel tableModel)
    {
        // main split pane
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

        // tabs with request/response viewers
        JTabbedPane tabs = new JTabbedPane();

        UserInterface userInterface = api.userInterface();

        HttpRequestEditor requestViewer = userInterface.createHttpRequestEditor(READ_ONLY);
        HttpResponseEditor responseViewer = userInterface.createHttpResponseEditor(READ_ONLY);

        tabs.addTab("Request", requestViewer.uiComponent());
        tabs.addTab("Response", responseViewer.uiComponent());

        splitPane.setRightComponent(tabs);

        // table of log entries
        JTable table = new JTable(tableModel)
        {
            /**
             * 当表格的某个请求被选择后,需要将请求和响应的结果,设置到请求响应编辑器中
             * @param rowIndex
             * @param columnIndex
             * @param toggle
             * @param extend
             */
            @Override
            public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
            {
                // show the log entry for the selected row
                HttpResponseReceived responseReceived = tableModel.get(rowIndex);
                requestViewer.setRequest(responseReceived.initiatingRequest());
                responseViewer.setResponse(responseReceived.getResponse());

                super.changeSelection(rowIndex, columnIndex, toggle, extend);
            }
        };

        JScrollPane scrollPane = new JScrollPane(table);

        splitPane.setLeftComponent(scrollPane);

        return splitPane;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为造车锚定智选模式, 起点赢家赛力斯驶入新能源主航道

文|螳螂观察 作者| 易不二 近日&#xff0c;赛力斯与华为的一纸联合业务深化合作协议&#xff0c;给了频频猜测赛力斯与华为之间关系的舆论一个明确的定调&#xff1a;智选模式已成为华为与赛力斯共同推动中国新能源汽车产业高质量发展的坚定选择。 自华为智能汽车业务开启零…

【Java】TCP网络编程(字节/符流)

文章目录概念TCP网络编程ServerSocketsocket使用区别和原理演示概念 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的协议&#xff0c;用于在计算机网络中可靠地传输数据。TCP是Internet协议族中的一个核心协议&#xff0c;它在传输层提供可靠、有序、基于流的传输服…

影视网络U盘系统开发思路

由于光纤入户千兆宽带的普及&#xff0c;在用户侧的下载速度得到前所未有的提高。与此同时&#xff0c;用户对于高清视频的需求日益增强&#xff0c;原有的视频点播系统在传输高清视频码流上时有卡顿现象发生&#xff0c;这严重影响了用户的娱乐体验。现时&#xff0c;大部分用…

IOS逆向之frida安装

首先手机要越狱&#xff0c;这个就不说了&#xff0c;博主就是咸鱼搞了个160的苹果6&#xff0c; 自己刷到苹果6支持最新的12.5.7版本后越狱&#xff1b; 谁让他低版本&#xff0c;不支持 CrackerXI砸壳呢&#xff0c;当时你要是使用 frida-ios-dump 也是可以的&#xff1b; …

【MySQL之SQL语法篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录一、数据管理技术的三个阶段二、SQL语句学习1. DCL数据控制语言1.1 创建用户1.2 修改用户名1.3 修改密码1.4 删除用户1.5 授权1.6 查看权限1.7 回收权限2. DDL数据定义语言2.1 操作数据库2.2 操作数据表2.3 操作数据3. DQL数据查询语言基本语法3.1 单表查询3.1.1选择表…

Linux基础命令-ln创建链接文件

文章目录 ln 命令介绍 命令格式 基本参数 参考实例 1&#xff09; 创建文件的硬链接 2&#xff09;创建文件的软链接 3&#xff09;创建链接文件时&#xff0c;相同目标文件创建备份文件 命令总结 ln 命令介绍 先看下帮助文档中的含义 NAME ln - make links …

HTML标签——表单标签

HTML标签——表单标签 目录HTML标签——表单标签一、input系列标签1.文本框&#xff08;拓展&#xff09;value属性和name属性作用介绍2.单选框3.复选框4.文件选择二、select下拉菜单标签三、label标签一、input系列标签 1.文本框 场景&#xff1a;在网页中显示输入单行文本的…

FL studio2023体验版及切换水果中文语言切换教程

FL studio2023提供了试用版本可供使用&#xff0c;功能和入门版的功能一样&#xff0c;但是有个缺点是不能够保存。只能当下做完&#xff0c;马上输出。入门版没有提供Audio音频编辑和录制的功能&#xff0c;建议要下手可以从完整版本去考虑。因为就算现在没有要录音&#xff0…

【Leedcode】栈和队列必备的面试题(第一期)

栈和队列必备的面试题&#xff08;第一期&#xff09; 文章目录栈和队列必备的面试题&#xff08;第一期&#xff09;一、题目二、思路&#xff08;图解&#xff09;三、存在的问题与隐患&#xff08;报错提示&#xff09;&#xff08;1&#xff09;s中只有右括号&#xff0c;无…

Capture Modules:车载网络报文捕获模块

&#xff08;以下所有图片均来源于Technica官网&#xff09; Technica Engineering的新一代硬件设备&#xff0c;即Capture Modules&#xff0c;提供了五种变体以涵盖不同带宽的车载以太网&#xff08;100BASE-T1和1000BASE-T1&#xff09;以及常见的IVN技术&#xff08;CAN、C…

云原生架构基础概念及应用办法

什么是云原生&#xff1f; 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展&#xff0c;适用于各种不同的云平台。 如果要更直接通俗的来解释下上面的概念。 云原生更准确来说就是一种文化&#xff0c;是一种潮流&a…

modbus转profinet网关连接UV系列流量计程序实例

用户现场是西门子1200PLC通过兴达易控Modbus转Profinet网关连接流量计的配置&#xff0c;对流量瞬时值及报警值监控及控制程序案例 硬件连接兴达易控网关采用Profinet双网口&#xff0c;一端连接PLC、一端连接编程软件&#xff0c;单路485接口连接流量计&#xff0c;对流量值实…

mac使用sublime text卡顿解决方法,附常用快捷键

在mac上使用sublime text总是卡顿&#xff0c;比如选中一段文字复制&#xff0c;然后去干别的&#xff0c;等会回来点击空白处取消对文字的选择&#xff0c;点好多下都取消不了。 再比如修改tab格式也是改着改着就卡住了。 解决方法也很简单&#xff0c;打开sublime text的配置…

MIT:只需一层RF传感器,就能为AR头显赋予“X光”穿透视力

近年来&#xff0c;AR在仓库、工厂等场景得到应用&#xff0c;比如GlobalFoundries、亚马逊、菜鸟裹裹就使用摄像头扫描定位货品&#xff0c;并使用AR来导航和标记。目前&#xff0c;这种方案主要基于视觉算法&#xff0c;因此仅能定位视线范围内的目标。然而&#xff0c;在一些…

python基础—字符串操作

&#xff08;1&#xff09;字符串&#xff1a; Python内置了一系列的数据类型&#xff0c;其中最主要的内置类型是数值类型、文本序列&#xff08;字符串&#xff09;类型、序列&#xff08;列表、元组和range&#xff09;类型、集合类型、映射&#xff08;字典&#xff09;类型…

论文阅读 | Cross-Attention Transformer for Video Interpolation

前言&#xff1a;ACCV2022wrokshop用transformer做插帧的文章&#xff0c;q&#xff0c;kv&#xff0c;来自不同的图像 代码&#xff1a;【here】 Cross-Attention Transformer for Video Interpolation 引言 传统的插帧方法多用光流&#xff0c;但是光流的局限性在于 第一&…

Android Qcom Audio架构学习

总结&#xff1a; Android Audio不简单呀&#xff0c;一个人摸索入门不容易的&#xff0c;研究了一段时间&#xff0c;感觉还不是很懂&#xff0c;但以下的知识对入门还是有帮助的。 Audio架构中的名词 FE(Front End) 提供pcm的设备信息&#xff0c;将数据从用户空间传输到音…

【大数据离线开发】8.2 Hive的安装和配置

8.3 Hive的安装和配置 安装模式&#xff1a; 嵌入模式 &#xff1a;不需要使用MySQL&#xff0c;需要Hive自带的一个关系型数据库&#xff1a;Derby本地模式、远程模式 ----> 需要MySQL数据库的支持 安装 hive 安装包 1、解压tar -zxvf apache-hive-2.3.0-bin.tar.gz -C…

美格智能发布高性价比5G CPE解决方案SRT838I,赋能5G FWA行业数字化转型

2月27日&#xff0c;在MWC 2023世界移动通信大会上&#xff0c;美格智能重磅发布高性价比5G CPE解决方案SRT838I&#xff0c;该方案搭载高通骁龙X62调制解调器及射频系统WCN6856高速5G解决方案设计&#xff0c;其具有广覆盖、强信号、高速率等特点&#xff0c;非常符合5G CPE的…

.NET 导入导出Project(mpp)以及发布后遇到的Com组件问题

最近公司项目有一个对Project导入导出的操作&#xff0c;现在市面上能同时对Project进行导入导出的除了微软自带的Microsoft.Office.Interop.MSProject&#xff0c;还有就是Aspose.Tasks for .NET。但因为后者是收费软件且破解版的现阶段只到18.11&#xff0c;只支持.net Frame…