使用Visual Studio Code開發和調試Java Burp擴展


幾天前,我發布了Bug Diaries Burp擴展。這是一個Burp擴展程序,使社區(免費)版 Burp 擁有相似的issue功能 。由於某些原因,現在決定用Java重寫。這是我學習切換到Java系列文章的第一部分。

本部分討論如何設置環境以使用Visual Studio Code進行開發。諸如自動完成,Gradle構建以及最重要的調試之類的事情。

克隆存儲庫可以跳過博客中的某些步驟。如果不熟悉Gradle和Burp開發,我還是建議自己做一遍,克隆以下存儲庫:

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 的安裝程序。

  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 目錄下.
  2. src\burp 中創建一個名為 BurpExtender.java 的文件

    • 該文件將是擴展的入口點

Extension directory at this step

  1. 編輯 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 包中導入的接口。

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 擴展問題的解決方案。

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

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)

Extension loaded

使用VSCode調試擴展

這是本篇文章最重要的一部分,我將討論如何在 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 測試通過的錯誤,忽略它

使用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

非常漂亮也超級有用。

將擴展的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

學習小結

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM