使用 VS Code 开发和调试 Burp Suite 扩展

本文翻译自:https://parsiya.net/blog/2019-12-02-developing-and-debugging-java-burp-extensions-with-visual-studio-code/

00 概述

几天前,我发布了 Bug Diaries Burp 扩展,这是一个 Burp 扩展程序,旨在社区(免费)版本上模仿 Burp Issues 功能。出于某些原因,我决定用 Java 重写它。这是我学习切换到 Java 的系列文章的第一部分。

本部分谈论如何设置环境以使用 Visual Studio Code 进行开发,诸如代码提示,Gradle 构建以及最重要的调试等事情。

你可以克隆仓库以跳过博客中的一些步骤,如果你不熟悉 Gradle 和 Burp 开发,我仍然建议你自己直接克隆以下仓库:

01 用 Python 时的 Bug 日记

原始的扩展是用 Python 写的。直到今天,我所有的 Burp 扩展都是用 Python 写的,在这过程中我记录了我所学到的东西:

我在Burp的 IMesageEditors 上启用右键单击功能时遇到了很多问题 。总之,我决定改用 Java 重写扩展。

以下便是我在开发环境虚拟机中的部署方法。

02 安装 Visual Studio Code

  1. 安装 VS Code .

  2. 安装 Java 扩展包

https://aka.ms/vscode-java-installer-win 上也有一个 给 Java 开发人员的 VS Code 安装程序,不过我没使用它。

03 安装 OpenJDK

由于 Oracle 严格的许可要求,所以我使用 OpenJDK。

  1. 下载 OpenJDK 11(请参考下面的原因)。我使用了 AdoptOpenJDK.net 的安装程序。

  2. 如果你是手动解压 OpenJDK,请修改坏境变量:

    • 设置 JAVA_HOMEC:Program Files\path\to\jdk\。(不包括 bin 目录)

      (对于我的 JDK 就是 C:\Program Files\AdoptOpenJDK\jdk-11.0.5.10-hotspot)

    • 添加 JDK 的 bin 目录到 PATH环境变量中

现在执行 java -version 应该返回像这样的内容(记得在设置完 PATH 后重新打开一个新的命令行):

openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.5+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.5+10,mixed mode

注意:如果安装 JDK 13 或更高版本,则无法使用 Burp 的 exe 文件加载你的扩展程序。截至2019年12月,Burp 的 exe 文件一直都是一个由 JDK 11 (版本 55.0) 构建的捆绑 JRE。如果尝试加载用更高版本的 Java 构建的扩展,则会出现此错误:

java.lang.UnsupportedClassVersionError: burp/BurpExtender has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 55.0

解决方法:

  1. 使用早期版本来构建扩展(推荐)

  2. 使用已安装的 Java 直接运行 Burp 的 jar 文件

    • 实际上我不知道这是否有效,如果您尝试成功了,请告诉我

04 Gradle

Gradle 没有安装程序,所以需要按照以下步骤手动进行安装。

  1. https://gradle.org/releases/ 下载最新版本

  2. 将其解压缩到C:\Program FilesC盘说:"但我更喜欢程序文件!")

    • 在我的虚拟机中,它最终位于 C:\Program Files\gradle-6.0.1

  3. bin 目录添加到 PATH

    • C:\Program Files\gradle-6.0.1\bin

现在执行 gradle -version 应该返回像这样的内容:

gradle -version

------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------

Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5

Kotlin:       1.3.50
Groovy:       2.5.8
Ant:         Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.5 (AdoptOpenJDK 11.0.5+10)
OS:           Windows 10 10.0 amd64

05 设置 Gradle

创建用于开发扩展的目录,在此目录中,运行以下命令:

  • gradle init --type basic

  • 按两次 Enter 以选择默认值

  • 如果你要创建一个特定名称的扩展,请在此步自定义项目名称,后面你可以在 settings.gradle 中修改

这一步完成后将创建一堆目录和文件。

06 build.gradle

打开 build.gradle 并粘贴进以下内容。

// Apply the Java plugin
apply plugin: 'java'

// Use Maven (because Burp Extender is on Maven)
repositories {
    mavenCentral()
}

dependencies {
   // Add the Burp Extender interface
   compile 'net.portswigger.burp.extender:burp-extender-api:2.1'
}

sourceSets {
   main {
       java {
           // Set the source directory to "src"
           srcDir 'src'
      }
  }
}

// Create a task for bundling all dependencies into a jar file.
task bigJar(type: Jar) {
   baseName = project.name + '-all'
   from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
   with jar
}

阅读文件中的注释来查看每个部分的功能,最重要的部分是添加 Burp Extender interface Maven repositor ,这为我们提供了 构建支持 和 与IntelliCode (iT的 Ai BaSeD!!1!) 同样重要的代码提示功能。

其它额外的依赖可以像 Burp extender interface 一样被添加。例如,可以这样添加 Google's Gson version 2.8.6

dependencies {
   // Add the Burp Extender interface
   compile 'net.portswigger.burp.extender:burp-extender-api:2.1'
   compile 'com.google.code.gson:gson:2.8.6'
}

07 Gradle Wrapper

无论本地 Gradle 版本是多少,Gradle Wrapper 都是获得可靠构建的一种方法。请注意,你需要 Gradle 来安装 Wrapper。

如果你只是想启动 Wrapper,也得先安装 Gradle。在扩展目录中执行 gradle wrapper 。为了使用 Wrapper 构建项目,请把你命令中的 gradle 替换为 gradlew (*nix) 或 gradlew.bat (Windows),例如 gradlew.bat build

08 创建扩展程序骨架

  1. 创建 src\burp 目录,这个目录将会包含 burp 的包

    • 所以包都将放在 src 目录下

  2. src/burp 中创建一个名为 BurpExtender.java 的文件

    • 该文件将是扩展的入口点

    Extension directory at this step

  3. 编辑 BurpExtender.java 并添加上这段代码:

package burp;

public class BurpExtender implements IBurpExtender
{
   //
   // implement IBurpExtender
   //
   @Override
   public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
  {
       // set our extension name
       callbacks.setExtensionName("Burp Sample Extension Java");
  }
}

注意:如果你的扩展程序只有一个包(或者几个文件),你可以把你的所有文件都直接放到 src 目录下

09 配置 VS Code 任务

为了让你敲代码更轻松,我们把 bigjar Gradle 任务分配给 VS Code 中的默认构建任务,这一点很重要,如果你的扩展使用了非 Burp 依赖项(像上面的 gson)。在这种情况下,你需要发布这个 jar 文件。

  1. Ctrl+Shift+PF1 打开 VS Code 的命令面板

  2. 输入 task 并选择 Configure Default Build Task

  3. 选择 Create tasks.json file from template

  4. 选择 Others

    • VS Code 将创建 .vscode\tasks.json 文件

  5. 打开 .vscode\tasks.json 并且粘贴进以下内容:

{
   // See https://go.microsoft.com/fwlink/?LinkId=733558
   // for the documentation about the tasks.json format
   "version": "2.0.0",
   "tasks": [
      {
           "label": "gradle",
           "type": "shell",
           "command": "gradle bigjar",
           // "command": "gradlew.bat bigjar", // Wrapper on Windows
           // "command": "gradlew bigjar",     // Wrapper on *nix
           "group": {
               "kind": "build",
               "isDefault": true
          }
      }
  ]
}

现在我们可以这样构建项目:

  1. 按下 Ctrl+Shift+B 。推荐,这样更快而且看起来很 1337(黑客俚语)。

  2. Terminal (菜单) > Run Task (子菜单) > gradle

  3. 打开命令面板,输入 task 然后选择 Run Build Task

执行一次即会下载 Burp Extender 接口并构建库,输出的 jar 文件将会被存放在 build\libs\burp-sample-extension-java-all.jar

10 设置 IntelliCode

我们的构建工作一切正常,但你可能已经注意到,VS Code 无法识别从 burp 包中导入的接口。

VS Code errors

每次添加新的依赖(否则我们会再次遇到一样的错误),我们都需要清理 Java 语言服务器。

  1. 使用 Ctrl+Shift+PF1 ,打开 VS Code 的命令面板

  2. 输入 java clean 并选择 Java Clean the Java language server workspace

  3. 询问时我们选择重启 VS Code

  4. 现在我们就有了 IntelliCode 支持

IntelliCode support

注意:这是大多数 vscode-java 扩展问题的解决方案。

11 开始编写 Burp 扩展

让我们添加一些代码到扩展中,用以展示如何在每次编译之后测试扩展。

修改 BurpExtender.java,看下 IntelliCode 是如何让我们更轻松地编写代码的。

IntelliCode in action, woot!

package burp;

public class BurpExtender implements IBurpExtender
{
   //
   // implement IBurpExtender
   //
   @Override
   public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
  {
       // set our extension name
       callbacks.setExtensionName("Burp Sample Extension Java");
       String fileName = callbacks.getExtensionFilename();
       callbacks.printOutput(fileName);
  }
}

这段代码打印了扩展文件的名字到控制台。使用 Ctrl+Shift+B 编译扩展。

Extension built

jar 文件会出现在 build\libs目录下。

Built jar

安装扩展:

  1. 在第二个监视器(屏幕)中启动 Burp

  2. 通过 Window (菜单) > Detach Extender 打开 Extender 窗口

  3. 按下 windows+左箭头 将其放置到屏幕的一边

  4. Windows 会显示其它进程的列表,要我选择一个放到屏幕的另一遍

  5. 选择 Burp,以便 Extender 和 Burp 并排出现在第二个屏幕中

  6. 点住这两个窗口之间的边界以调整其大小

我的扩展开发周期是:

  1. 在监视器1中编辑 VS Code 中的代码

  2. 按下 Ctrl+Shift+B 进行编译

  3. 通过 Ctrl+鼠标左键 选中 Extender 中扩展前面的复选框来重新加载它(在监视器2中)

  4. 在 Burp 中使用扩展(监视器2)

Extension loaded

12 使用 VS Code 调试扩展

这是本篇文章最重要的一部分,我将讨论如何在 VS Code 中调试扩展程序。环顾四周,我只能找到这些参考资料:

VS Code 的 Java 扩展包中自带一个 Java 调试器,要使用它,我们需要使用以下命令行选项运行 Burp:

  • -agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n

这将 localhost:80000 上运行调试服务器。请注意,互联网上的大多数示例都只是以端口来运行,这样服务器会默认监听 0.0.0.0,这样显然不好(除非你从远程主机来进行调试)。

接下来,我们必须使用以下参数运行 Burp 的 jar 文件。Burp 的 jar 文件默认安装在以下路径:

  • C:\Program Files\BurpSuiteCommunity\burpsuite_community.jar

完整的命令:

java -agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n
    -jar "C:\Program Files\BurpSuiteCommunity\burpsuite_community.jar"
  • 提示:使用这个作为快捷方式,以便你一直在你的开发环境虚拟机中调试 Burp

  • 你可能会得到关于 JDK 未被 Burp 测试通过的错误,忽略它

13 使用 Burp 的捆绑 JRE

你可能已经在 Burp 的目录中看到了 BurpSuiteCommunity.vmoptions 文件,我们可以向里面添加运行时参数,向文件中添加下面一行来启用调试:

-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n

现在我们可以运行 exe 然后调试我们的扩展程序。我已经在 Git 仓库中包含了一个 .vmoptions 样本文件 。

接下来,我们必须在 VS Code 中启动 Java 调试器并连接到调试端口。在 callbacks.printOutput(fileName); 这一行设置断点,然后选择 Debug (菜单) > Start Debugging 或 按下 F5

这将创建并打开 .vscode\launch.json 文件 ,粘贴下面这段代码到里面并保存它:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "BurpExtension",
            "request": "attach",
            "hostName": "localhost",
            "port": 8000 // Change this if you had set a different debug port.
        }
    ]
}

这个文件非常简单,唯一重要的参数就是 hostnameport ,它们应该指向上面的调试端口(localhost:8000)。

再次开始调试,Windows 防火墙可能会弹出来。如果可以,并且你不是在调试一台远程计算机,请按取消。如果防火墙对话框没关掉但调试器已经超时了,就按 F5 重新调试。

待调试器被附加后,通过在复选框上 Ctrl+鼠标右击 来重新加载扩展,然后能看到调试器成功断在断点处。

Achievement unlocked: Debugging in VS Code

14 保存扩展程序到一个不同的路径中

如果查看 build 目录,你将会看到很多类文件,我们不希望这些出现在源代码控制中,所以把 build 目录添加到 .gitignore 文件中是明智的,但这意味着我们最终的 jar 文件也将被忽略,我们希望最终的 jar 文件出现在仓库中,以便人们可以下载并使用它。

我们可以通过修改 build.gradle 文件中的 libDirName 来更改扩展程序 jar 文件的存放路径。

libsDirName = "../@jar"

此配置将最终的 jar 文件复制到 @jar\burp-sample-extension-java-all.jar

15 总结

我们今天从这篇文章学到了什么?

  1. 用 Java 创建一个简单的 Burp 扩展

  2. 安装 Gradle 和 编译扩展

  3. 在 VS Code 中开启 Java IntelliCode

  4. 在 VS Code 中调试 Java Burp 扩展

  5. 更改 jar 文件的存放路径

猜你喜欢

转载自www.cnblogs.com/dubh3/p/12061538.html