使用Visual Studio Code开发和调试Java Burp扩展

shengge0 2020-01-10

几天前,我发布了Bug Diaries Burp扩展。这是一个Burp扩展程序,使社区(免费)版 Burp 拥有相似的issue功能 。由于某些原因,现在决定用Java重写。这是我学习切换到Java系列文章的第一部分。

本部分讨论如何设置环境以使用Visual Studio Code进行开发。诸如自动完成,Gradle构建以及最重要的调试之类的事情。

克隆存储库可以跳过博客中的某些步骤。如果不熟悉Gradle和Burp开发,我还是建议自己做一遍,克隆以下存储库:

  • https://github.com/parsiya/burp-sample-extension-java

Python版扩展的错误记录

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

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

以下就是我开发虚拟机(VM)怎么部署的方法。

安装Visual Studio代码

  1. 安装 VS Code.
  2. 安装 Java Extension Pack.

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

安装OpenJDK

因为Oracle有严格的许可要求,所以我使用OpenJDK。

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

    • Red Hat 安装包在 https://developers.redhat.com/products/openjdk/download,不过你需要一个免费的开发者帐户。
  2. 如果你是手动解压 OpenJDK,修改坏境变量:

    • 设置 JAVA_HOME 为 C: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文件。
    • 实际上我不知道这方法有没有效,如果尝试成功了,记得告诉我

Gradle

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

  1. 下载最新版本 https://gradle.org/releases/.
  2. 解压缩到C:\Program Files (安装提示是C:\但我更喜欢放到program files!)
    • 在我的虚拟机中,Gradle安装目录是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

设置Gradle

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

  • gradle init --type basic
  • 按两次 Enter 选择默认值
  • 如果你要创建一个特定名称的扩展,请在这里自定义项目名称,后面你可以在 settings.gradle文件中修改

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

构建.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 (這遈樭夲), 重要的代码提示功能。

任何其它的依赖项可以像 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'
}

Gradle 包

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

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

创建一个框架扩展

  1. 创建 src\burp 目录,这个目录将会包含 burp 的包
    • 所有包都将放在 src 目录下.

使用Visual Studio Code开发和调试Java Burp扩展

  1. src\burp 中创建一个名为 BurpExtender.java 的文件

    • 该文件将是扩展的入口点
  2. 编辑 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 目录下

设置VS Code

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

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

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

  3. 选择 Create tasks.json file from template.

  4. 选择 Others.
    1. 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. 打开命令面板,输入 tasks 然后选择Run Build Task.

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

设置IntelliCode

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

使用Visual Studio Code开发和调试Java Burp扩展

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

  1. 使用 Ctrl+Shift+PF1 ,打开 VS Code 的命令面板
  2. 输入 java clean 并选择 Java Clean the Java language server workspace.
  3. 询问是否重启 VS Code.
  4. 现在我们就有了 IntelliCode 支持.

使用Visual Studio Code开发和调试Java Burp扩展

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

Burp 设置

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

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

使用Visual Studio Code开发和调试Java Burp扩展

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 编译扩展。

使用Visual Studio Code开发和调试Java Burp扩展

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

使用Visual Studio Code开发和调试Java Burp扩展

BurpSuite配置:

  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)

使用Visual Studio Code开发和调试Java Burp扩展

使用VSCode调试扩展

这是本篇文章最重要的一部分,我将讨论如何在 VS Code 中调试扩展程序。从网上我找到了这些参考资料:

  • Eric Gruber 在 https://blog.netspi.com/debugging-burp-extensions/ 上的扩展程序调试展示了如何使用 IntelliJ 来调试 Burp,它给了我使用 jdwp 的想法。

  • Derek(@StackCrash)在博客里 https://www.itsecguy.com/my-first-burp-suite-extension/ 中提到,将 burp.StatBurp 添加到项目属性的 Run 部分即可。
    • 这与 Dafydd Stuttard 在 Burp support ticket 中所说的一致,“将 Burp JAR文件作为库添加到项目中,然后通过在 burp.StartBurp.main() 中调用 main 方法来启动 Burp”

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 测试通过的错误,忽略它

使用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+鼠标右击 来重新加载扩展,然后能看到调试器成功断在断点处。

使用Visual Studio Code开发和调试Java Burp扩展

非常漂亮也超级有用。

将扩展的jar存放在不同的路径中

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

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

libsDirName = "../@jar"

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

Eclipse配置

导入Gradle Project

之前的配置已经把Gradle配置好了。直接可以在eclipse里使用。

在Eclipse选择 File -> Import -> Gradle里Existing Gradle Project。导入存在的项目就可以了

生成jar

在项目选择export -> Java -> JAR file ,选择项目里的.classpath和.project。然后完成就生成jar包了。

使用Visual Studio Code开发和调试Java Burp扩展

使用Visual Studio Code开发和调试Java Burp扩展

使用Visual Studio Code开发和调试Java Burp扩展

学习小结

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

  2. 安装 Gradle 和 编译扩展

  3. 在 VS Code 中开启 Java IntelliCode

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

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

原文链接:https://parsiya.net/blog/2019-12-02-developing-and-debugging-java-burp-extensions-with-visual-studio-code/#debugging-the-extension-with-vs-code

翻译:lipss

校对:nxe

相关推荐