-
-
[翻译]使用Visual Studio Code开发和调试Java Burp扩展
-
发表于: 2019-12-29 23:03 7976
-
几天前,我发布了Bug Diaries Burp扩展。这是一个Burp扩展程序,使社区(免费)版 Burp 拥有相似的issue功能 。由于某些原因,现在决定用Java重写。这是我学习切换到Java系列文章的第一部分。
本部分讨论如何设置环境以使用Visual Studio Code进行开发。诸如自动完成,Gradle构建以及最重要的调试之类的事情。
克隆存储库可以跳过博客中的某些步骤。如果不熟悉Gradle和Burp开发,我还是建议自己做一遍,克隆以下存储库:
原始的扩展是用 Python 写的。直到今天,我所有的 Burp 扩展都是用 Python 写的,在这过程中我记录了我所学到的东西:
在Burp的IMesageEditors上启用右键单击功能时遇到很多问题。长话短说,我决定改用Java重写扩展。
以下就是我开发虚拟机(VM)怎么部署的方法。
214K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2K9$3q4Q4x3X3g2E0M7#2)9J5c8Y4k6K6j5$3!0V1k6g2)9J5k6r3A6S2N6X3q4Q4x3X3c8A6L8Y4y4@1j5h3I4D9k6i4u0Q4x3X3c8%4K9h3&6Q4c8e0c8Q4b7U0S2Q4z5p5q4Q4c8e0c8Q4b7U0W2Q4z5f1k6Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0c8Q4b7U0S2Q4z5o6m8Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0N6Q4b7V1u0Q4z5e0W2v1j5i4k6S2i4@1f1#2i4@1u0o6i4K6R3H3i4@1f1#2i4K6S2r3i4K6V1I4i4@1f1@1i4@1u0m8i4@1u0m8i4@1f1#2i4K6V1I4i4K6V1^5i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1%4i4K6W2m8i4K6R3@1g2W2x3`. Code安装程序。 不过我没有使用。
因为Oracle有严格的许可要求,所以我使用OpenJDK。
下载 OpenJDK 11(请参考下面的原因)。我使用了 AdoptOpenJDK.net 的安装程序。
如果你是手动解压 OpenJDK,修改坏境变量:
现在执行 java -version
应该返回像这样的内容(记得在设置完 PATH
后再重新打开一个新的命令行):
注意:如果安装 JDK 13 或更高版本,无法使用 Burp 的 exe 文件加载你的扩展程序。截至2019年12月,Burp 的 exe
文件都是使用由 JDK 11 (版本 55.0) 构建的捆绑 JRE。如果尝试加载用更高版本的 Java 构建的扩展,则会出现此错误:
解决方法:
Gradle 没有安装程序,所以需要按照以下步骤手动进行安装。
现在执行gradle -version
应该返回像这样的内容:
创建用于开发扩展的目录,在此目录中运行以下命令:
这一步完成后将创建一堆目录和文件。
打开build.gradle
并粘贴以下内容。
阅读文件中的注释来查看每个部分的功能,最重要的部分是添加 Burp Extender interface Maven repositor ,这为我们提供了 构建支持 以及使用IntelliCode (這遈樭夲), 重要的代码提示功能。
任何其它的依赖项可以像 Burp extender interface 一样被添加。比如这个示例,可以这样添加 Google‘s Gson version 2.8.6 :
无论本地 Gradle 版本是多少,Gradle Wrapper 都是获得可靠构建的一种方法。需要 Gradle 来安装 Wrapper。
如果你只是想启动 Wrapper,也得先安装 Gradle。在扩展目录中执行 gradle wrapper
。为了使用 Wrapper 构建项目,请把你命令中的 gradle
替换为 gradlew
(*nix) 或 gradlew.bat
(Windows),例如 gradlew.bat build
。
创建 src\burp 目录,这个目录将会包含 burp 的包
在 src\burp
中创建一个名为 BurpExtender.java
的文件
编辑 BurpExtender.java
并添加上这段代码:
注意:如果你的扩展程序只有一个包(或者几个文件),你可以把你的所有文件都直接放到 src
目录下
为了让我们敲代码更轻松,我们把 bigjar
Gradle 任务分配给 VS Code 中的默认构建任务,这一点很重要,如果你的扩展使用了非 Burp 依赖项(像上面的 gson
)。在这种情况下,你需要publish 这个 jar 文件。
按Ctrl+Shift+P
或 F1
打开 VS Code 的命令面板
输入 task
并选择 Configure Default Build Task
.
选择 Create tasks.json file from template
.
选择 Others
.
打开 .vscode\tasks.json
并且粘贴进以下内容:
现在我们可以这样构建项目:
推荐按Ctrl+Shift+B
,这样更快而且看起来很 1337(黑客俚语)。
Terminal (菜单) > Run Task (子菜单) > gradle
打开命令面板,输入 tasks
然后选择Run Build Task
.
执行一次即会下载 Burp Extender 接口并构建库,输出的 jar 文件将会被存放在build\libs\burp-sample-extension-java-all.jar
我们的构建工作一切正常,但你可能已经注意到,VS Code 无法识别从 burp
包中导入的接口。
每次添加新的依赖,我们都需要清理 Java 语言服务器。否则我们会再次遇到一样的错误.
现在我们就有了 IntelliCode 支持.
注意:这是大多数 vscode-java
扩展问题的解决方案。
让我们添加一些代码到扩展中展示如何在每次编译之后测试扩展。
修改 BurpExtender.java
,看下 IntelliCode 是如何让我们更轻松地编写代码的。
这段代码打印了扩展文件的名字到控制台。使用Ctrl+Shift+B
编译扩展。
jar 文件会出现在 build\libs
目录下。
BurpSuite配置:
我的扩展开发周期是:
在 Burp 中使用扩展(监视器2)
这是本篇文章最重要的一部分,我将讨论如何在 VS Code 中调试扩展程序。从网上我找到了这些参考资料:
Eric Gruber 在 695K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2L8X3g2@1M7%4m8A6i4K6u0W2j5$3!0E0i4K6u0r3k6r3g2T1N6h3N6Y4K9h3&6Y4i4K6u0V1j5Y4g2J5M7q4)9J5k6r3g2^5N6r3g2F1M7$3W2G2L8Y4y4Q4x3V1j5`. 上的扩展程序调试展示了如何使用 IntelliJ 来调试 Burp,它给了我使用 jdwp 的想法。
Derek(@StackCrash)在博客里 91eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2A6N6s2y4W2j5$3N6#2P5g2)9J5k6h3y4G2L8g2)9J5c8X3#2&6i4K6u0V1k6X3W2J5M7%4c8Q4x3X3c8T1N6i4u0H3i4K6u0V1M7%4g2A6N6r3g2Q4x3X3c8W2P5s2c8W2L8Y4y4A6L8$3&6Q4x3V1j5`. 中提到,将 burp.StatBurp
添加到项目属性的 Run 部分即可。
VS Code 的 Java 扩展包中自带一个 Java 调试器,要使用它,我们需要使用以下命令行选项运行 Burp:
这将在 localhost:80000
上运行调试服务器。请注意,互联网上的大多数示例都只是以端口来运行,这样服务器会默认监听 0.0.0.0
,这样显然不好(除非你能从远程主机来进行调试)。
接下来,我们必须使用以下参数运行 Burp 的 jar 文件。Burp 的 jar 文件默认安装在以下路径:
完整的命令:
你可能已经在 Burp 的目录中看到了 BurpSuiteCommunity.vmoptions
文件,我们可以向里面添加运行时参数,向文件中添加下面一行来启用调试:
现在我们可以运行 exe
然后调试我们的扩展程序。我已经在 Git 仓库中包含了一个 .vmoptions
样本文件 。
接下来,我们必须在 VS Code 中启动 Java 调试器并连接到调试端口。在 callbacks.printOutput(fileName);
这一行设置断点,然后选择 Debug (菜单) > Start Debugging
或 按下 F5
。
这将创建并打开 .vscode\launch.json
文件 ,粘贴下面这段代码到里面并保存它:
这个文件非常简单,唯一重要的参数就是 hostname
和 port
,指向上面的调试端口(localhost:8000
)。
再次开始调试,Windows 防火墙可能会弹出来。如果可以不是在调试一台远程计算机,请按取消。如果防火墙对话框没关掉但调试器已经超时了,就按 F5
重新调试。
待调试器被附加后,通过在复选框上 Ctrl+鼠标右击
来重新加载扩展,然后能看到调试器成功断在断点处。
非常漂亮也超级有用。
如果查看 build 目录里,会看到很多类文件,我们不希望这些出现在源代码控制中,所以把 build 目录添加到 .gitignore 文件中是明智的,但这意味着我们最终的 jar 文件也将被忽略,我们希望最终的 jar 文件出现在仓库中,以便人们可以下载并使用它。
我们可以通过修改 build.gradle 文件中的 libDirName 来更改扩展程序 jar 文件的存放路径。
此配置将最终的 jar 文件复制到 @jar\burp-sample-extension-java-all.jar
用 Java 创建一个简单的 Burp 扩展
安装 Gradle 和 编译扩展
在 VS Code 中开启 Java IntelliCode
在 VS Code 中调试 Java Burp 扩展
更改 jar 文件的存放路径
原文链接:b77K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5i4u0K6K9i4W2S2i4K6u0W2L8X3g2@1i4K6u0r3j5X3I4G2k6#2)9J5c8U0t1H3x3e0W2Q4x3X3b7I4x3W2)9J5k6o6l9J5i4K6u0V1k6r3g2$3k6h3I4G2M7r3W2F1k6#2)9J5k6r3q4F1k6q4)9J5k6r3c8W2j5Y4g2Y4k6$3W2F1k6#2)9J5k6r3A6S2N6X3q4Q4x3X3c8T1N6i4u0H3i4K6u0V1k6i4S2@1k6h3&6K6K9h3!0F1M7#2)9J5k6s2N6A6N6r3S2Q4x3X3c8$3K9i4y4#2j5h3I4Q4x3X3c8K6N6s2g2V1K9h3!0Q4x3X3c8U0L8$3c8W2i4K6u0r3i4K6t1K6k6r3g2T1N6h3N6Y4K9h3&6Y4i4K6u0V1N6r3S2W2i4K6u0V1k6i4S2@1k6h3&6K6K9h3!0F1i4K6u0V1N6$3W2@1K9q4)9J5k6s2k6K6i4K6u0V1j5$3!0V1k6b7`.`.
翻译:lipss
校对:nxe
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
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
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
// 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 }
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' }
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"); } }