幾天前,我發布了Bug Diaries Burp擴展。這是一個Burp擴展程序,使社區(免費)版 Burp 擁有相似的issue功能 。由於某些原因,現在決定用Java重寫。這是我學習切換到Java系列文章的第一部分。
本部分討論如何設置環境以使用Visual Studio Code進行開發。諸如自動完成,Gradle構建以及最重要的調試之類的事情。
克隆存儲庫可以跳過博客中的某些步驟。如果不熟悉Gradle和Burp開發,我還是建議自己做一遍,克隆以下存儲庫:
Python版擴展的錯誤記錄
原始的擴展是用 Python 寫的。直到今天,我所有的 Burp 擴展都是用 Python 寫的,在這過程中我記錄了我所學到的東西:
- Swing in Python Burp Extensions - Part 1
- Swing in Python Burp Extensions - Part 2 - NetBeans and TableModels
- Swing in Python Burp Extensions - Part 3 - Tips and Tricks
在Burp的IMesageEditors上啟用右鍵單擊功能時遇到很多問題。長話短說,我決定改用Java重寫擴展。
以下就是我開發虛擬機(VM)怎么部署的方法。
安裝Visual Studio代碼
- 安裝 VS Code.
- 安裝 Java Extension Pack.
https://aka.ms/vscode-java-installer-win上也有一個給Java開發人員用的VS Code安裝程序。 不過我沒有使用。
安裝OpenJDK
因為Oracle有嚴格的許可要求,所以我使用OpenJDK。
-
下載 OpenJDK 11(請參考下面的原因)。我使用了 AdoptOpenJDK.net 的安裝程序。
-
如果你是手動解壓 OpenJDK,修改壞境變量:
- 設置 JAVA_HOME 為 C:Program Files\path\to\jdk\。(不包括 bin 目錄)
- (對於我的 JDK 就是
C:\Program Files\AdoptOpenJDK\jdk-11.0.5.10-hotspot)
- (對於我的 JDK 就是
- 設置 JAVA_HOME 為 C:Program Files\path\to\jdk\。(不包括 bin 目錄)
- 添加 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
解決方法:
- 推薦使用早期版本構建擴展
- 使用已安裝的Java直接運行Burp的jar文件。
- 實際上我不知道這方法有沒有效,如果嘗試成功了,記得告訴我
Gradle
Gradle 沒有安裝程序,所以需要按照以下步驟手動進行安裝。
- 下載最新版本 https://gradle.org/releases/.
- 解壓縮到C:\Program Files (安裝提示是
C:\但我更喜歡放到program files!)- 在我的虛擬機中,Gradle安裝目錄是
C:\Program Files\gradle-6.0.1
- 在我的虛擬機中,Gradle安裝目錄是
- 將
bin目錄添加到PATHC:\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。
創建一個框架擴展
-
創建 src\burp 目錄,這個目錄將會包含 burp 的包
- 所有包都將放在
src目錄下.
- 所有包都將放在
-
在
src\burp中創建一個名為BurpExtender.java的文件- 該文件將是擴展的入口點

- 編輯
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 文件。
-
按
Ctrl+Shift+P或F1打開 VS Code 的命令面板 -
輸入
task並選擇Configure Default Build Task. -
選擇
Create tasks.json file from template. -
選擇
Others.- VS Code 將創建
.vscode\tasks.json文件
- VS Code 將創建
-
打開
.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
}
}
]
}
現在我們可以這樣構建項目:
-
推薦按
Ctrl+Shift+B,這樣更快而且看起來很 1337(黑客俚語)。 -
Terminal (菜單) > Run Task (子菜單) > gradle -
打開命令面板,輸入
tasks然后選擇Run Build Task.
執行一次即會下載 Burp Extender 接口並構建庫,輸出的 jar 文件將會被存放在 build\libs\burp-sample-extension-java-all.jar
設置IntelliCode
我們的構建工作一切正常,但你可能已經注意到,VS Code 無法識別從 burp 包中導入的接口。

每次添加新的依賴,我們都需要清理 Java 語言服務器。否則我們會再次遇到一樣的錯誤.
- 使用
Ctrl+Shift+P或F1,打開 VS Code 的命令面板 - 輸入
java clean並選擇Java Clean the Java language server workspace. - 詢問是否重啟 VS Code.
- 現在我們就有了 IntelliCode 支持.

注意:這是大多數 vscode-java 擴展問題的解決方案。
Burp 設置
讓我們添加一些代碼到擴展中展示如何在每次編譯之后測試擴展。
修改 BurpExtender.java,看下 IntelliCode 是如何讓我們更輕松地編寫代碼的。

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 編譯擴展。

jar 文件會出現在 build\libs目錄下。

BurpSuite配置:
- 在第二個監視器(擴展屏幕)中啟動 Burp
- 通過
Window (菜單) > Detach Extender()分離Extender窗口 - 按下 windows+左箭頭 將其放置到屏幕的一邊
- Windows 會顯示其它進程的列表,要我選擇一個放到屏幕的另一邊
- 選擇 Burp,以便 Extender 和 Burp 並排出現在第二個屏幕中
- 拖住這兩個窗口之間的邊界以調整其大小
我的擴展開發周期是:
- 在監視器1(擴展屏幕)中編輯 VS Code 中的代碼
- 按下
Ctrl+Shift+B進行編譯 - 通過 Ctrl+鼠標左鍵 選中 Extender 中擴展前面的復選框來重新加載它(在監視器2中)
- 在 Burp 中使用擴展(監視器2)

使用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.
}
]
}
這個文件非常簡單,唯一重要的參數就是 hostname 和 port ,指向上面的調試端口(localhost:8000)。
再次開始調試,Windows 防火牆可能會彈出來。如果可以不是在調試一台遠程計算機,請按取消。如果防火牆對話框沒關掉但調試器已經超時了,就按 F5 重新調試。
待調試器被附加后,通過在復選框上 Ctrl+鼠標右擊 來重新加載擴展,然后能看到調試器成功斷在斷點處。

非常漂亮也超級有用。
將擴展的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包了。



調試擴展插件
右鍵項目點擊Configure Build Path

打開Libraries,點擊Add External JARS...:

打開burpsuite路徑,選擇burpsuite.jar,點擊Apply and Close

下斷點,點開burp下面的BurpExtender.java,雙擊第30行左側藍色區域:

開始debug,右鍵后點擊Debug Configurations...,配置好遠程監聽端口

運行burpsuite命令:
java -agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n -jar burpsuite_community_v2.1.07.jar
運行burpsuite后,再加載插件就進入調試模式了,調試快捷鍵F5、F6

學習小結
-
用 Java 創建一個簡單的 Burp 擴展
-
安裝 Gradle 和 編譯擴展
-
在 VS Code 中開啟 Java IntelliCode
-
在 VS Code 中調試 Java Burp 擴展
-
更改 jar 文件的存放路徑
