ばぁど・うぉっちんぐ

セキュリティに強いWeb屋。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

BurpSuiteの拡張機能をPythonで作ってみたお話

どーも、ばぁどです。 BurpSuiteの拡張機能Pythonで書いてみました。

なぜやろうと思ったのか

BurpSuiteと仲良くなりたかったのことをよく知りたかったからです。

脆弱性診断にジョブチェンしてBurpSuiteというローカルプロキシツールに出会いました。 今までWebアプリケーション開発を生業にしていた筆者からしたら、あまり絡むことのなかったツールであり、要領を掴むのが大変でした。 とある日、会社のメンバーがPythonでButpSuiteの拡張機能を書いていることを知り、プログラマとしての経験を活かしながらBurpSuiteを知ることができると思い、拡張機能を書いてみた次第です。

実行結果

下図のように、BurpSuiteを中継してサーバーに飛ぶリクエストにオリジナルのヘッダーをつけることができます。

f:id:UltraBirdTech:20211002201702p:plain
OriginalHeader

下記のオリジナルのヘッダーが付与されていることがわかりますか?(赤枠部分)

X-Original-Header: UltraBird

リクエストにオリジナルヘッダーが付くイメージは下記のようなイメージです。 今回のオリジナルヘッダーを確認するためには、BurpSuiteを二つ立ち上げる必要があります。

f:id:UltraBirdTech:20211002203201p:plain

このサンプルを拡張機能として作ったからといって、何ができるかというと、別に何も影響はないのですが苦笑。今回のサンプルを用いながら、今後診断業務が便利になるコードを書いていきたい。

書いたコード

from burp import IBurpExtender
from burp import IHttpListener

class BurpExtender(IBurpExtender, IHttpListener):
    def __init__(self):
        self.new_header = "X-Original-Header: UltraBird"

    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        callbacks.setExtensionName("My Original Extension")
        callbacks.registerHttpListener(self)
        return

    def processHttpMessage(self, tool_flag, is_message_request, current_request):
        if not is_message_request:
            return

        request_info = self.get_request_info(current_request)

        header_list = self.get_header_from_current_request(request_info)
        body_info = self.get_body_from_current_request(current_request, request_info)

        new_request = self.create_new_request(header_list, body_info)
        current_request.setRequest(new_request)

        return

    def get_request_info(self, current_request):
        return self._helpers.analyzeRequest(current_request)

    def get_header_from_current_request(self, request_info):
        return list(request_info.getHeaders())

    def get_body_from_current_request(self, current_request, request_info):
        body_bytes = current_request.getRequest()[request_info.getBodyOffset():]
        return self._helpers.bytesToString(body_bytes)

    def create_new_request(self, header_list, body_info):
        header_list.append(self.new_header)
        return self._helpers.buildHttpMessage(header_list, body_info)

コードはBurpSuiteの公式リファレンスを参考にしつつ、インターネット上のものを参考にしながら作成させていただきました。 ユニットテストもそのうち追加したい。

portswigger.net

備忘録:BurpSuiteでPythonの拡張コードを読み込ませる方法

BurpSuiteは基本的にJavaで動いています。 BurpSuiteを動かすときにjarを利用することがあれば、拡張機能も大部分がjarで配布されており、jarファイルを読み込むことで拡張機能を使用することができます。

今回はPython拡張機能を書いたため、BurpSuiteでPythonを読み込めるようにする必要があります。

手順1. Jython ファイルを入手する

最初にJavaで動いているBurpSuiteにPythonを読み込ませるためのjarファイルをjythonの公式サイトから用意します。

www.jython.org

[Extender]→[Options]→[Python Environment]→[select File...]から、ダウンロードしたjarファイルを読み込ませます。

f:id:UltraBirdTech:20211002204030p:plain

対象ファイルを選択して[Open]をクリックするとjarファイルが読み込まれます。 f:id:UltraBirdTech:20211002204322p:plain

手順2. Pyhonを読み込む拡張機能を追加する

Python Scripter という拡張機能を読み込ませます。

github.com

[Extender]→[B App Store] →(検索ボックスで)[python scripter]と検索し、インストール。

f:id:UltraBirdTech:20211002204557p:plain

手順3. 作成したPythonコードを拡張機能として読み込ませる

[Extender]→[Extentions]→[Add] f:id:UltraBirdTech:20211002205007p:plain

[Java]を[Python]に変更し、[Select file...]をクリック。

f:id:UltraBirdTech:20211002205231p:plain

作成したPython ファイルを選択する。

f:id:UltraBirdTech:20211002205724p:plain

手順4. 読み込まれたことを確認して終了

もしPythonコードにエラーがあれば、この時点でエラーだとわかります。

f:id:UltraBirdTech:20211002205913p:plain

エラーが出なければ完了です。お疲れ様でした。

まとめ

まだBurpSuiteを触りきれていないので、どういったツール、拡張機能があれば便利なのかはわかっていないです。しかし今後脆弱性診断を続けて行くにつれて、そういった視野が開けて行くことに期待しております。