Burp Suite拡張の作成を楽にするメモ With IntelliJ IDEA

ToC

はじめに

Burp Suiteの拡張用APIが変更になりmontoya-apiというものに変わっていたのでAPI移行のついでに開発環境を整えるかぁ〜となりましたが、予想外に四苦八苦したのでメモを残します。

そして流石にIDE使った方が便利かぁ?と思いIntelliJ IDEAでBurp拡張を作ることにしました。

正直Java + IDEAよくわかってないので改善点あれば教えてください。

IntelliJ IDEAのインストール

jetbrainsの公式ページからCommunity版をダウンロード

Community版のダウンロードリンクは下の方にあるので注意

www.jetbrains.com
www.jetbrains.com favicon https://www.jetbrains.com/ja-jp/idea/download/

プロジェクトの作成

Intellij IDEAで新規プロジェクトを作成する

Build system以外は基本デフォルトでOK

Build systemはGUI Designerを使うためIntelliJ IDEAを選択

2024/2月現在、montoya-apiでのBurp拡張開発はJDK17を使用しないと行けないっぽいのでJDKだけ注意

image

プロジェクトファイル構成設定

File -> Project Structure...

image

Modules -> + -> New module

image

親モジュールと同じ設定でOK

image

こんな感じのモジュール構成にしておく

モジュール -> srcフォルダ-> mainパッケージ -> javaパッケージ ->-> クラス

image

MontoyaApiインストール

BurpのMontoyaApiを使うためのライブラリをインポートする

File -> Project Structure...

image

Libraries -> + From Maven...

image

montoya-apiの最新版を選択

image

子モジュールに追加する(今回はburpモジュール)

image

BurpExtensionの実装

自動生成されているMainファイルを好きなファイル名・クラス名に変更し、そのクラスにBurpExtensionインターフェースを実装する

BurpExtensionインターフェースはMontoyaApiクラスを引数に取るinitializeメソッドがあればOK

image

この状態でビルドに通ればMontoyaApiのインポートはOK

image

Artifact生成の設定

前の手順でビルドしただけではBurpにロードするjarが生成されないので生成するように設定する

File -> Project Structure...

image

Artifact -> + -> JAR -> From modules with dependencies...

image

デフォルトでOK

image

Include in project build...をON

image

この状態でビルドするとjarが生成される

image

Burpが正常に拡張を読み込むことができるかテストするためにログコンソールに適当な文字列を出力させてみる

image

image

GUI Designerを使って楽にGUIを設計する

Burp拡張のGUI部分を自力で書いていたけど流石に辛すぎたのでIDEAの力を借りる

IDEAでSwingのGUIコンポーネントを作成するにはNew -> Swing UI Designer -> GUI Designer

image

命名以外はとりあえずデフォルトでOK

image

すると、ディレクトリとその直下にjavaクラスと.formファイルが生成される

.formファイルに関してはIDEAがいじるので基本的には触らない(が、細かいところの調整でたまに編集したりする)

image

.formをIDEAで開くとGUIでデザインができる

image

だが、このままだとGUIでデザインした結果がjavaクラスファイルの方に反映されないためBurp拡張のコードからSwingコンポーネントを触ることができない

そのため、GUIの設定をjavaクラスに吐き出させるようにIDEAを設定する

File -> Settings...

image

Editor -> GUI Designer -> Generate GUI intoをJava source codeに変更する

image

この状態でビルドするとJavaクラスにGUI Designerの結果が反映される

$$$setupUI$$$()や$$$getRootComponent$$$()などのメソッドが自動実装されていることがわかる

image

ただし、ビルドは成功しているがIDE上エラーが出ている状態になってしまっているので足りない依存関係を追加する

image

File -> Project Structure... -> Libraries -> + -> Java

image

IDEAのインストール先ディレクトリ以下のlib/forms_rt.jarをインポートする

image

子モジュールを選択

image

再ビルドすると依存関係が解決されエラーが解消される

image

自動生成されたクラスの使い方

自動生成されたクラスはコンストラクタに呼ばれる$$$setupUI$$$()によって自動で初期化される。

自動生成されたクラスは単純なものであれば以下のようにMontoyaApiに渡すことで使用できる

MontoyaApiのUI系のメソッドはjava.awt.Componentを要求する物が多いっぽい

GUI Designerによって自動生成されたクラスの$$$getRootComponent$$$()を呼ぶことでそのクラスの最上位のGUIコンポーネント(java.awt.Component)を取得することができる

image

montoyaApi.userInterface().registerSuiteTabでBurpに拡張用のタブを追加することができる

image

自動生成されたクラスの使い方(応用)

自動生成されたクラス内のコンポーネント(JPanelやJButtonなど)の初期化方法をカスタマイズしたい場合はGUI Designerからカスタマイズしたいコンポーネントを選択し、Custom createをONにする

image

すると、クラス内にcreateUIComponentメソッドが自動で定義されるためここに初期化処理を書いていく

image

この状態でビルドすると$$$setupUI$$$()の先頭にcreateUIComponentの呼び出しが追加される

image

注意点として、Custom createをONにしたコンポーネントをcreateUIComponent内で初期化することを忘れると実行時エラーになるので注意

下ではcreateUIComponent内で初期化していないpanel1のメソッドを呼び出そうとしているが特にエラーは出ない

image

外部ライブラリの使い方

Gsonなどのライブラリを使用しようとしてハマったのでメモ

(GsonはJsonシリアライズ・デシリアライズ用のライブラリ)

まず、普通に外部ライブラリをインポートしてビルドする手順

MontoyaApiをインポートしたときと同様の手順でインストールする

image

適当なクラスをJSON化してログコンソールに出力してみる

image

拡張をロードした時点でcom.google.gson.Gsonが見つからないというエラーが出る

image

恐らく実行時に当該ライブラリが見つからないと言っているようなのでライブラリをArtifactに含める

Artifact設定をしたときと同様にArtifact画面を開き、Available ElementsからGsonを右クリックし、Extract into Output Rootを選択すると

image

Output layoutにGsonが含まれるようになる

image

この状態で再ビルドし、Burpに読み込ませると正常にクラスをJSON化した文字列がログコンソールに表示される

image