Burp拡張機能 作成入門・後編
はじめに
前回の投稿の続きで、本稿でも引き続き、Burp 拡張機能の作成方法について解説します。
前回は環境構築からリクエストのフックまで解説しました。
今回の投稿ではより実践的な拡張機能を見据え、リクエストの編集と、設定の保存、GUI の作成を解説しようと思います。
リクエストの編集
前回の投稿時点で参照はできたので、今度はちょっとリクエストの編集をしてみたいと思います。
編集とはいえ、burp のデフォルトの機能で、Match and replace rule を使えば大抵の置換はできてしまうので、その辺の機能では実現できない、リクエストのハイライトを試してみたいと思います。burp は proxy タブのリクエストを右クリックして色を変えることができるのですが、これを自動でする方法はデフォルトの機能ではできないと思います。
今回は、実際の診断業務を見据えて、リクエストの listener port で色分けしてハイライトしてみます。
(WEB 診断では複数のブラウザを使い分けて脆弱性の検査を実施しています。ブラウザごとに burp のリスナーポートを変えてログを取ったりするのですが、一目で判断しづらいため、ハイライトでわかりやすくしよう、という魂胆です。)
SampleExtension.javaと同じディレクトリにProxyHandler.javaを作成し、以下内容を記述します。
前回のリクエストのフックとやってることはあまり変わらないです。
ProxyRequestHandlerを実装したクラスを作成し、それぞれリクエストを受け取った時の処理とレスポンスを受け取ったときの処理とリクエストをプロキシから送る時の処理を記載しています。
今回はリクエストを受け取った時に、リスナーポートに応じて 4 色に色分けしてみました。
先ほどと少し違うのはcontinueWithメソッドの時に第二引数を与えているところですね。continueWithメソッドの第二引数にAnnotationsを与えることで、comment や highlight を操作できます。
ところで、RequestHandler.javaでも上記の処理は書けそうな気がします。なぜわざわざProxyRequestHandlerを実装したクラスを作成したかというと、HttpHandler を実装したクラスのhandleHttpRequestToBeSentメソッドが受け取るリクエストにはポート番号の情報がないからです。
burp のリクエストの処理のフローとして、プロキシタブやリピータタブで発生したリクエストが最終的に向かうのがHttpHandler(を実装したクラス)になっている様子です。プロキシリスナーはあくまでプロキシ機能内の情報なので HttpHandler に渡される前に情報が落ちてしまう、ということのようです。
最後にSampleExtension.javaのinitializeメソッドの末尾に一行追加してビルド、burp に適用してみます。ビルドコマンドは前回とまったく同じなので省略です。
さて、複数のブラウザでそれぞれ宛先ポートを変えてアクセスしてみます。
問題なくポート番号で色分けできていますね。
ちなみに、ログにはポート番号 →URL の順番でログが出力されています。先ほども言ったとおり、ProxyRequestHandler→ProxyHandlerの順番で処理が行われていることがわかります。
UI の作成と設定の保存
最後に UI の作成方法と設定の保存方法を紹介します。
やはり、ポート番号をソースコードにハードコーディングするのはいろいろ残念ですよね。
今回は簡単な UI を実装して、ポートを設定、保存できる仕組みを作ってみたいと思います。
ProxyRequestHandler.javaを次のように編集します。
長くなりましたが、burp拡張機能開発として重要な部分はコンストラクタ内のPersistedList.persistedStringList()メソッドとdata.setStringList(...)で永続化の準備をしている部分と、UI作成のためのapi.userInterface().registerSuiteTab(...)だけです。
PersistedList.persistedStringList()は新たにpersistedList<String>を作成するメソッドです。
ここで作成したオブジェクトをsetStringListで拡張機能のPersistedObjectにKey-Valueで保存しています。
GUIについてはregisterSuiteTabメソッドで第二引数にjava.awt.Componentを渡してやることで、任意のタブを作成可能です。Componentはswing等で作れます。
新しく追加したconstructPreferenceEditorメソッドとインナークラスのDataModelは内部でburpのPersistedListを使っていますが、特殊なことはしていません。
swingの使い方の解説は他にわかりやすいものがあると思うので、ここでは割愛させていただきます。
コンパイルをいつも通りして、拡張機能を読み込むと次のようにタブが追加されています。
テーブルの下のテキストフィールドにポート番号を入力し、プルダウンで色を選択後、Addボタンを押下すると設定が追加される仕組みです。(画像はもう操作済みです。)
ではブラウザで適当にアクセスしてみます。
設定したとおりにハイライトが適用されました。
UIの作成は正直Burp拡張機能作成のノウハウとは関係ないところがあります。自分しか使わない、ということであれば、必要最低限でいいと思います。
おわりに
本稿ではburpの拡張機能についてHello Worldからリクエストの取得、編集、設定の保存、UIの作成方法などを解説しました。
まだMontoya APIの利用方法についての日本語の解説記事は少なく、なかなか手を出すハードルは高いかもしれません。
しかし、触ってみると意外と難しくない、という印象を受けました。(むしろswingでUIを作る方が時間がかかると思います。)
作成にあたっては、公式リファレンスと、公式が出しているMontoya APIの使用例が大変参考になりました。
まだまだ筆者もBurp拡張機能初心者ではありますが、今後も拡張機能を作成することで業務効率化を図り、ひいては診断の品質向上に貢献できればよいなと考えています。