まったり技術ブログ

Technology is power.

Burp Suite拡張プラグイン作成入門 その4 - リクエスト送信 編

f:id:motikan2010:20180225073424p:plain
 今回は拡張プラグイン内からリクエストを送信し、レスポンス内容の表示までできるようにします。
具体的には、プロキシ等でキャプチャしたIHttpRequestResponseクラス内に定義されているリクエストを再送します。

完成物

f:id:motikan2010:20180225073435p:plain
 機能としては、送信ボタンを押下すると、Enableにチェックが付いているリクエストが上から順に送信されるようになっています。
 送信したリクエストと受信したレスポンスは、右部分のテキストエリアに表示されるようになっています。

開発

 前回の実装をベースに開発を進めていくため、今回はその差分を中心に説明をしていきます。
列の追加、レイアウトの変更については特筆していません。

「その3 - 新規UI(タブ)追加 編」との差分

Comparing d0fda8f27e9863f49105fc9b75f182f2c4aad081...0621544ec03ca355b520b6e7f3da41d45c7ab618 · motikan2010/Burp-Suite-Learning-Chapter03 · GitHub

完成リポジトリ

github.com

RequestTableManager.java

 1つのメソッドを追加しています。 このメソッドを呼び出すことで、Listクラス内に定義されている、IHttpRequestResponseインスタンスを返すようになっています。

public List<IHttpRequestResponse> getRequestResponseList() {
    List<RequestResponseEntity> requestResponseEntityList = this.model.getRequestResponseEntityList();
    return requestResponseEntityList.stream()
            .filter(RequestResponseEntity::isEnabled) // 列項目「Enable」にチェックが付いている行を対象
            .map(RequestResponseEntity::getRequestResponse).collect(Collectors.toList());
}
SampleTab.java

 下記のメソッドを使用することで、HTTP通信を行うことができます。
第1引数のIHttpServiceのインスタンスは、IHttpRequestResponse.getHttpService()で取得することができます。
 IHttpRequestResponseのインスタンスは、前回の章で独自クラスであるRequestResponseEntityクラス内に保存しているため、そちらを使用しています。

IHttpRequestResponse makeHttpRequest(IHttpService httpService, byte[] request)

IBurpExtenderCallbacks

// ◆「送信」ボタン押下時に発火
ExecutorService executor = Executors.newSingleThreadExecutor();
sendButton.addActionListener(e -> executor.submit(() ->
        // requestResponseEntityList(テーブル内のデータ)に格納されているリクエストを一行ずつ送信
        requestTableManager.getRequestResponseList().stream().forEach(iHttpRequestResponse -> {
            // リクエストをテキストエリアに追加
            requestResponseTextArea.append(requestResponseUtils.showRequest(iHttpRequestResponse) // リクエスト情報
                    + requestResponseUtils.getNewLine() + requestResponseUtils.getNewLine());

            // リクエストの送信
            IHttpRequestResponse response = BurpExtender.getCallbacks().makeHttpRequest(iHttpRequestResponse.getHttpService(), iHttpRequestResponse.getRequest());

            // レスポンスをテキストエリアに追加
            requestResponseTextArea.append(requestResponseUtils.showResponse(response) // レスポンス情報
                    + requestResponseUtils.getNewLine() + requestResponseUtils.getNewLine() + requestResponseUtils.getNewLine()); 
        })
));

 取得したレスポンス情報は、ウィンドウの右部分のテキストエリアに追記しています。

まとめ

 今回は差分ということもあり、内容が短くなってしまいましたが、IHttpRequestResponseのインスタンスがあれば簡単に同一のリクエストを送信することができることが分かりました。
 次回は、同一のリクエストではなく、リクエスト内容を改変して送信する方法を説明してきます。