はじめに
こんにちは、Cy-PSIRTのアルバイトの西谷(@no1zy_sec)です。
Cy-PSIRTでは、脆弱性診断にBurp Suite Professionalを使用しています。
今回、私が診断時に困ったことを解決するためにBurp Suite のExtensionを開発しましたので紹介します。
Burp SuiteにはSession Handling Rulesという機能があり、非常に便利な機能の一つです。 例えば、HTTPレスポンスからCSRFトークンを自動で取得してリクエストにセットすることが可能です。 詳しくはこちらのスライドをご覧ください。
※掲載の許可を頂いています。
www.slideshare.net
診断対象のサービスでは、クライアントとサーバーとの通信にWebAPIが用られることが多いです。 そしてその多くのリクエストボディがJSONフォーマットです。しかし、Session Handling Rulesは取得したパラメータの値をJSONの値としてセットする事をサポートしていないようでした。*1
そこで、リクエストボディがJSONの場合でも、取得したパラメータの値をそのJSONの値としてセットする事を可能にしたのが私が開発したExtensionです。
Custom-Request-Handlerとは
Custom-Request-Handler(以下、CRH)は次の機能を持っています。
HTTPレスポンスから値を抽出してJSONやリクエストヘッダーの値にセットすることができます。
ファイルからペイロードを読み込み、指定したパラメータに渡すことができます。これは、IntruderのSimple Listのような機能です。
CRHを使用することでJSONの値にCSRFトークンを含めないといけない場合でもCSRFトークンを自動取得することが可能になります。
また、ファイルからパラメータを読み込んで指定したパラメータに渡すことができます。この機能は値をインクリメントしてリクエストを送信したい時に有効です。
インストール方法
CRHはPythonで実装しているのでJythonをダウンロードして、Python Environmentで設定する必要があります。
Jythonの設定
- Jythonをダウンロードします。(jython-standalone-2.7.0.jarで動作確認済み)
- Burp Suiteを開きます。
- [Extender] > [Options]タブを開きます。
- [Python Enviroment]の[Location Jython standalone JAR file]に手順1でダウンロードしたファイルを設定します。
Extensionのインストール
- GitHub - No1zy/custom-request-handler をgit cloneします。
- [Extender] > [Extensions]のAddをクリックします。
- [Extension Details]の設定を以下のように変更します。
- Extension type: Python
- Extension file : /path/to/custom-request-handler.py
※手順1でcloneしたフォルダの中にあるcustom-request-handler.pyを指定します。
- nextをクリックします。
CRHを使った診断
診断対象
2つのページを使ってデモを行います。
- アクセスすると2つのランダムな文字列をJSONで表示するWebAPI
- 送信されてきたJSONの値を全て表示するWebページ どちらも一度アクセスして、リクエストをRepeaterに送っておきます。
マクロの登録
- [Macros]の[Add]をクリックします。
- [Macro Recoder]から取得したい値があるリクエストを選択します。
- [OK]をクリックします。
- マクロを保存します。
Session Handling Rulesの登録
- [Project options] > [Sessions] > [Session Handling Rules] の [Add] をクリックします。
- [Rule Actions]の[Add]をクリックします。
- [Run a macro]をクリックします。
- [Select macro]で保存したマクロを選択します。
- [After running the macro. invoke a Burp extension handler]にチェックを入れます。
- ドロップダウンメニューから[custom request handler]を選択します。
- [OK]をクリックします。
- [Scope] > [URL Scope]で適用したいスコープを入力します。
- [OK]をクリックします。
パラメータの抽出、セット
- 自動取得したい値があるレスポンスを右クリックします。
- 共通設定の手順2で設定したマクロの最後のレスポンスと一緒にする必要があります。
- [Send to CRH]をクリックします。
- 対象のタイプ(JSON/Header)を選択します。
- 書き換えたいパラメータ名を入力します。
- 取得したい値をドラッグします。
- Extract regex from groupにチェックを入れることで正規表現で記述することも可能です
- [Add]をクリックします。タブ右側のテーブルにレコードが追加されます。
- 対象のリクエストを送信します。
- 指定した値を取得して、上書きできているか確認します。 まず、送信前のリクエストです。
- [Go]をクリックしてリクエストを送信します。
正常にパラメータが上書きされることが確認できました。 これでリクエストがJSONフォーマットであってもSession Handling機能のような使い方をすることができます。
ペイロードのセット
今回は以下のペイロードのリストを使用します。
user+0@example.com user+1@example.com user+2@example.com user+3@example.com user+4@example.com user+5@example.com user+6@example.com user+7@example.com user+8@example.com user+9@example.com user+10@example.com user+11@example.com user+12@example.com user+13@example.com user+14@example.com user+15@example.com user+16@example.com user+17@example.com user+18@example.com user+19@example.com user+20@example.com
- [Payload Sets]のタイプ(JSON/Header)を選択します。
- 書き換えたいパラメータ名を入力します。
- [Load]をクリックして、読み込みたいファイルを選択します。
- 対象のリクエストを送信します。
- ロードしたファイルのペイロードを順番読み取り、指定した値を書き換えているかどうか確認します。まずはリクエストの送信前です。
- リクエストを送信します。
- もう一度リクエストを送信して、次の値が読み込まれるか確認します。
正常にロードしたファイルのペイロードを順番読み取り、指定した値を書き換えていることが確認できました。 Repeaterでこれで値をインクリメントしたい時などで便利になります。
まとめ
今回はBurp SuiteでJSONフォーマットのWebAPIにCSRFトークンが含まれていてもスムーズに診断ができるようなBurp Suite Extensionを紹介させていただきました。 このExtensionでJSONの診断に少しでも貢献できればと思います。