プライベートBurp Collaboratorサーバの配備

Burpはデフォルトで、PortSwiggerが提供するパブリックBurp Collaboratorサーバを使います。しかしさまざまな目的によっては、これが適していない場合があります。詳細は、メインのBurp Collaboratorドキュメントを参照してください。

必要に応じて、Burp Collaboratorサーバのプライベートインスタンスを配備できます。このドキュメントは、そのための手順と、次のトピックについても説明します:

閉じたネットワーク上での基本的なセットアップ

閉じたプライベートなネットワークでひとり(または少人数のチーム)で利用する方法が、プライベートCollaboratorサーバの一般的な利用方法です。インターネットアクセスがない閉じたネットワーク上のアプリケーションをテストする場合、デフォルトのCollaboratorサーバは使用できません。

このような状況では、設定ファイルは必要なく、インストールと実行にあるいずれかコマンドで、最小限のCollaboratorサーバのインスタンスを実行できます。Burpの設定で、Collaboratorサーバのアドレスに自分のマシンのIPアドレスを設定する必要があります。

このセットアップ方法では、DNS名前解決のカスタマイズや、信頼された有効なHTTPS接続はサポートしません。しかし、Collaboratorの最低限の機能を使用でき、外部にHTTP通信するような問題は検出できます。

一般的なセットアップ手順

プライベートBurp Collaboratorサーバを実行し、すべてのCollaborator機能を使用したり、インターネットからアクセスできるようにしたり、複数ユーザに対応するには、次の手順を行う必要があります:

インストールと実行

Burp Collaboratorサーバは、Burp Suite Professional自身と同じ実行ファイルに含まれています。独自のサーバインスタンスを実行するのに、ライセンスキーは必要ありません。サーバはコマンドラインから--collaborator-server引数を使って直接起動できます。例:

sudo java -jar /path/to/file.jar --collaborator-server

上記のコマンドは、デフォルトの設定ファイルを使用してCollaboratorサーバを起動します。カスタム設定を追加するには、次の引数を追加します:

--collaborator-config=myconfig.config

ただし、プライベートCollaboratorの使用状況によっては、さらに設定が必要になる場合があります。サーバのセットアップに必要な設定は前のセクションを、独自の設定ファイルを作成する方法の詳細はCollaborator設定ファイルのセクションを参照してください。

Collaboratorサーバのポートとファイアウォールルール

サービスを実行するのに必要なポートにバインドできない場合、サーバは起動に失敗します。これらのポートを使用している他のプロセスを停止する必要があります。Burp Collaboratorサーバはデフォルトで、次のポートをリッスンします:

ファイアウォールで、これらのポートに対する任意のネットワークからのインバウンド通信を許可する必要があります。テストしているアプリケーション(およびそれらのDNSサーバ)からもCollaboratorサーバにアクセスできる必要もあるので、ファイアウォールのルールを調整する必要があるでしょう。さらに、Unixベースのシステムでこれらのポートにバインドするためには、root権限でサーバを実行する必要があります。あるいは、非標準のポート上で実行するようサーバを設定し、ポートマッピングで元のポートへリダイレクトする方法もあります。

非標準ポートでの実行

Collaboratorサーバをroot以外のユーザとして実行する場合は、非標準のポート上で実行するように設定する必要があります。使用しているカスタムポートと標準ポートをマッピングするように、オペレーティングシステムを設定する必要もあります。通常、TCPとUDP接続の受信のためのマッピング設定が必要です。

Collaboratorサーバを標準ポート以外で使用するよう設定している場合、プロジェクトオプション > その他以下のBurp Collaboratorサーバオプションでそれらを指定する必要があります。

Collaboratorサーバが非標準ポートを使用するよう、設定ファイルで設定できます。例:

{ "serverDomain": "burpcollaborator.example.com", "eventCapture": { "http": { "ports": 8080 }, "https": { "ports": 8443 }, "smtp": { "ports": [ 8025, 8587 ] }, "smtps": { "ports": 8465 } }, "dns": { "ports": 8053 } }

"ports"の値には単一の数値が、または複数のポートでサービスのリッスンをしたい場合はポート番号の配列が指定できます。Collaboratorサーバはデフォルトで、SMTP通信用にポート25と587をリッスンします。

Collaboratorサーバのリソース

Burp Collaboratorサーバの起動時には、想定する使用方法に基づいて、JVMのメモリ処理とガベージコレクションの設定を推奨します。少人数での利用を想定してデスクトップマシンでCollaboratorサーバを実行する場合、JVMの使用するメモリ量を減らせます。次のコマンドは、ヒープを10から200MBの間で変動させ、JVMの5%の時間をガベレージコレクションに使用する設定で、通常あまりメモリを消費しません:

sudo java -Xms10m -Xmx200m -XX:GCTimeRatio=19 -jar /path/to/file.jar --collaborator-server

大人数で利用ができるよう専用マシン上でCollaboratorサーバを実行する場合、通常はOS、JVM、その他の実行プロセス用に1GBのメモリを残し、使用可能な物理メモリの量にヒープサイズを固定する設定が効率的です。例:

sudo java -Xmx3g -Xms3g -jar /path/to/file.jar --collaborator-server

サーバを頻繁に使用する予定で4GB以上の物理メモリがある場合は、ガベレージコレクション中に起こるJVMの一時停止を大幅に削減する、G1 ガベレージコレクタへの切り替えを推奨します。例:

sudo java -Xmx12g -Xms12g -XX:+UseG1GC -jar /path/to/file.jar --collaborator-server

Collaboratorサーバの機能をすべて使うには、通常は適切な設定ファイルを作る必要があります。

DNS設定

Burp Collaboratorはデフォルトで、指定したドメインのDNSサービスを実行します。これにはCollaboratorが使用する専用ドメインやサブドメインが必要です。DNS機能を省略し、IPアドレスのみでCollaboratorサーバにアクセスもできます; しかしこの設定は、さまざまな脆弱性の検出に効果的ではありません。

Burp Collaboratorをパブリックなインターネットで実行する場合、特定のドメイン(たとえばexample.com)を購入するか、既に所有し使用しているドメインのサブドメイン(たとえばburpcollaborator.example.com)が使用できます。制限された内部ネットワークの場合は、任意の専用内部ドメインを選択できます。

Collaboratorサーバが適切なDNSレコードを使用できるように、制御するドメインを知っている必要があります。これは、Collaborator設定ファイルの設定です。例:

{ "serverDomain": "burpcollaborator.example.com" }

DNS設定の詳細は、ドメインレジストラによって異なりますが、次のエントリが必要です:

設定ファイル内で指定されたドメインについて、そのドメインに対するすべてのクエリをCollaboratorサーバが名前解決するように権限を与えることが不可欠です。詳細な設定方法は、環境によって異なります。ほとんどのドメインレジストラは、ドメインの権威DNSサーバを設定するWebインタフェースを提供しています。

また、それぞれをCollaboratorサーバのIPアドレスに関連づけるグルーレコードを設定する必要があります。設定したDNSサーバそれぞれに異なるIPアドレスを指定するようドメインレジストラが要求する場合、Collaboratorサーバに2つのパブリックIPアドレスを設定する必要があるかもしれません。

テスト対象サーバのhostsファイルを編集するだけでは、Collaborator DNSサービスの使用は避けられません。テストでCollaboratorサーバを使用すると、メインに設定されたドメインの、ランダムに生成したサブドメインを使用します。hostsファイルはワイルドカードをサポートせず、よってランダムに生成されたサブドメインを検索する方法がありません。

Collaborator設定ファイル

Burp Collaboratorサーバのすべてのオプションは、設定ファイルを使用して制御します。デフォルトで、collaborator.configというファイルをカレントディレクトリ内で探します。--collaborator-configコマンドライン引数でこの場所を上書きできます。例:

sudo java -jar /path/to/file.jar --collaborator-server --collaborator-config=myconfig.config

設定ファイルはJSONフォーマットを使用し、コメントもサポートします。IPアドレスが必要な場所では、単一のアドレスまたはアドレスのリストを設定できます。たとえば、ネットワークインタフェースのローカルアドレスの設定に次のどちらも使用できます:

"localAddress": "10.20.0.159" "localAddress": [ "10.20.0.159", "127.0.0.1" ]

Collaborator設定ファイルは、次のフィールドを使用します:

フィールド 意味
Your_Collaborator_Domain Collaboratorが権威を持つサーバドメインです。 somedomain.net
NS_record_label_1 サーバドメインのNSレコード内の最初のエントリのラベルです。 ns1 (somedomain.netのNSレコードにはns1.somedomain.netが含まれるでしょう)
NS_record_label_2 サーバドメインのNSレコード内の2番目のエントリのラベルです。 ns2 (somedomain.netのNSレコードにはns2.somedomain.netが含まれるでしょう)
External_IP_Nameserver_A_Record1 Aレコードエントリで指定されているCollaboratorサーバのパブリックIPアドレス。 ns1.somedomain.netのA(またはAAAA)レコードでしょう。
External_IP_Nameserver_A_Record2 Aレコードエントリで指定されているCollaboratorサーバのパブリックIPアドレス。 ns2.somedomain.netのA(またはAAAA)レコードでしょう。
Local_IP_1 Collaboratorサーバの実際のIPアドレス。 10.20.0.160
Local_IP_2 Collaboratorサーバの実際のIPアドレス。 10.20.0.161 (Local_IP_1とは異なるべきです)
Collaborator_External_IP Collaboratorサーバのパブリックアドレスの1つ。 10.20.0.162
path_to_key_file Collaboratorの秘密鍵のファイルパス。 /opt/collaborator/collaborator.key
path_to_certificate_file Collaboratorの証明書のファイルパス。 /opt/collaborator/collaborator.crt

設定ファイルのサンプルと、使用可能な各オプションの説明は次の通りです:

{ "serverDomain": "Your_Collaborator_Domain", "workerThreads": 10, "eventCapture": { "localAddress": "Local_IP", "publicAddress": "Collaborator_External_IP", "http": { "ports": 80 }, "https": { "ports": 443 }, "smtp": { "ports": [ 25, 587 ] }, "smtps": { "ports": 465 }, "ssl": { "certificateFiles": [ "path_to_key_file", "path_to_certificate_file" ] } }, "polling": { "localAddress": "Local_IP", "publicAddress": "Collaborator_External_IP", "http": { "port": 9090 }, "https": { "port": 9443 }, "ssl": { "certificateFiles": [ "path_to_key_file", "path_to_certificate_file" ] } }, "metrics": { "path": "url_to_metrics", "addressWhitelist": [ "21.10.23.0/24" ] }, "dns": { "interfaces": [ { "name": "NS_record_label_1", "localAddress": "Local_IP_1", "publicAddress": "External_IP_Nameserver_A_Record1" }, { "name": "NS_record_label_2", "localAddress": "Local_IP_2", "publicAddress": "External_IP_Nameserver_A_Record2" } ], "ports": 53 }, "logLevel": "INFO" }

設定ファイルでサポートされている定義は次の通りです:

serverDomain Collaboratorサーバが制御するドメインまたはサブドメイン。この設定は、DNS機能に必須です。
workerThreads Collaboratorが受信リクエストの処理に使用するスレッド数。
eventCapture.localAddress デフォルトで、通信イベントをキャプチャするためにすべてのローカルインタフェースをリッスンします。指定した場合、設定したインタフェースのみリッスンします。
eventCapture.publicAddress 通信イベントのキャプチャに使用するパブリックIPアドレス。
eventCapture.http.ports HTTP通信イベントをリッスンするポート。ポート80が転送されている場合のみデフォルトから変更する必要があります。
eventCapture.https.ports HTTPS通信イベントをリッスンするポート。ポート443が転送されている場合のみデフォルトから変更する必要があります。
eventCapture.smtp.ports SMTP通信イベントをリッスンするポート。ポート25と587が転送されている場合のみデフォルトから変更する必要があります。
eventCapture.smtps.ports SMTPS通信イベントをリッスンするポート。ポート465が転送されている場合のみデフォルトから変更する必要があります。
eventCapture.https.hostname 自己署名証明書を生成する際に使用されます。詳細は、TLS設定を参照してください。
polling.localAddress Collaboratorはデフォルトで、通信イベントのキャプチャとポーリングリクエストに、同じネットワークインタフェースを使用します。指定した場合、ポーリングリクエストに別のインタフェースが使用されます。
polling.publicAddress ポーリングリクエストに使用するパブリックアドレス。
polling.http.port HTTP経由のポーリングに使用するポート。標準ではないポートに設定できますが、Burp Suiteがそれを使用するように設定する必要があります。
polling.https.port HTTPS経由のポーリングに使用するポート。標準ではないポートに設定できますが、Burp Suiteがそれを使用するように設定する必要があります。
polling.https.hostname 自己署名証明書を生成する際に使用されます。詳細は、TLS設定を参照してください。
metrics.path メトリクスページにアクセスするためのURLパス。
metrics.whitelist メトリクスページにアクセスを許可するクライアントIPアドレスのホワイトリスト。
dns.ports DNSクエリのリッスンポート。53 番ポートを転送している場合のみデフォルトから変更する必要があります。
dns.interfaces DNSクエリをリッスンするローカルインタフェースのリスト。各権威ネームサーバに異なるIPアドレスを設定するようレジストラが要求する場合、複数のネットワークインタフェースを使用し、それらの場所をこのオプションで設定できます。
dns.interfaces.name このインタフェースで実行するネームサーバのホスト名(FQDNではありません)。FQDNは、この値にserverDomainに付けて生成されます。たとえば、ns1の場合、ns1.burpcollaborator.example.comになります。各ネームサーバに異なるホスト名を使用してください。
dns.interfaces.localAddress このネームサーバにバインドするローカルアドレス。
dns.interfaces.publicAddress 設定されたローカルアドレスに対応するパブリックIPアドレス。通常、ドメインのDNSレコードに、設定されたホスト名とパブリックIPアドレスを使用する必要があります。
logLevel 標準出力に表示するログ出力レベル。
customDnsRecords.label カスタムDNSレコードのDNSラベル(例: _acme-challenge)。
customDnsRecords.record ラベルに対応するカスタムDNSレコード。
customDnsRecords.type カスタムDNSレコードのタイプ。現在のところ、TXTまたはCNAMEのいずれか。
customDnsRecords.ttl レコードの生存時間(秒単位)。
customHttpContent.path カスタムHTTPコンテンツのパス。
customHttpContent.contentType カスタムコンテンツのレスポンスヘッダに追加するMIMEタイプ。
customHttpContent.base64content BASE64でエンコードされたコンテンツ。パスがリクエストされるとデコードして返される。

TLS設定

Burp Collaboratorは、テスト対象システムからの通信キャプチャと、Burp Suiteによるポーリングリクエストを提供するために、HTTPSとSMTPSサービスを実行します。通常は、Collaboratorが使用しているドメイン名のワイルドカードTLS証明書が設定されている場合のみ、CollaboratorサーバへのTLS接続は成功します。Collaboratorの設定ファイルでTLS証明書を設定できます。

ドメインに対する有効なワイルドカードTLS証明書を持っていない場合、Burp Collaboratorは自己署名の証明書を生成できます。たとえば、次の設定で *.burpcollaborator.example.com の自己署名ワイルドカード証明書が作成されます:

"ssl": { "hostname": "burpcollaborator.example.com" }

テスト対象のサーバで信頼する証明書にインストールできるか、対象アプリケーションがTLS証明書の検証を行わない場合は、自己署名証明書で十分でしょう。

ドメイン用の有効なワイルドカードTLS証明書を購入していれば、認証局(CA)から証明書を取得し、Collaboratorサーバにインストールできます。この例では、OpenSSLで証明書署名要求(CSR)を作成し、CAは証明書と中間証明書を提供しています。

OpenSSLの秘密鍵のデフォルトフォーマットは、伝統的なSSLeayフォーマットになっています。Collaboratorサーバにインストールする前に、これらをPKCS8に変換する必要があります。この変換を行うOpenSSLコマンドは次の通りです:

openssl pkcs8 -topk8 -inform PEM -in keys/burpcollaborator.example.com.key -outform PEM -out keys/burpcollaborator.example.com.key.pkcs8 -nocrypt

Collaboratorの設定ファイルでTLS証明書を設定できます。次の設定ファイルの例では、秘密鍵、証明書、中間証明書を読み込む方法を示しています。

"ssl": { "certificateFiles": [ "keys/burpcollaborator.example.com.key.pkcs8", "keys/burpcollaborator.example.com.crt", "keys/intermediate.crt" ] }

証明書ファイルは正しい順序(秘密鍵、証明書、中間証明書)で指定する必要があります:

また、Java keytoolを使用してCSRを生成し、結果として得られる証明書をサーバのJavaキーストアにインポートできます。この場合、次の設定で証明書をCollaboratorサーバに読み込みます:

"ssl": { "keystore": { "path": "myKeystore.jks", "password": "myPassword" }

通信イベントとポーリングを個別のネットワークインタフェースに設定した場合、インタフェースごとに個別のTLS設定が必要です。

通信イベントとポーリング

Collaboratorサーバは、クライアントからの2種類の受信通信をサポートします。

Collaboratorサーバはデフォルトで、通信イベントとポーリングリクエストの両方の通信を、同じネットワークインタフェースで処理します。必要に応じて、ポーリングリクエストに異なるインタフェース(またはポート)を使用するように設定できます。この機能は、ファイアウォール制限の回避や、ポーリング機能をネットワーク層でアクセス制御する場合に使用できます。

Collaboratorの設定ファイルの"polling"オプションセクションで、個別のポーリングインタフェースを設定できます。

"polling": { "publicAddress": "<外部IP>" },

このポーリングインタフェースの例では、カスタムポート、HTTPS、自己署名証明書を使用しています:

"polling": { "localAddress": "<ローカルIP>", "publicAddress": "<外部IP>", "http": { "port": 9090 }, "https": { "port": 9443 }, "ssl": { "hostname": "collaboratorpolling.example.com" } },

通信用とポーリング用インタフェースに、同じワイルドカードTLS証明書も使用できます。その場合、CollaboratorサーバのDNSサービスでポーリングリクエストが正しいインタフェースに向くよう設定してください。

CollaboratorサーバのDNSサービスにリクエストを誘導するには、プロジェクトオプション > その他以下のBurp Collaboratorサーバオプションでサーバの場所を設定する必要があります。Burp Suiteはポーリングリクエストを行うときに自動的に、サーバドメインの前にpolling.を追加します。

CollaboratorのDNSサービスはポーリングサブドメインを、分離したポーリングインタフェースのパブリックIPアドレスに名前解決します。これにより、Burpクライアントで複雑な設定を行わなくても、通信用とポーリング用に別々のインタフェースを使用できます。

次のポーリングインタフェースの例では、カスタムポート、HTTPS、CA発行の証明書を使用しています:

"polling": { "localAddress": "<Local_IP>", "publicAddress": "<External_IP>", "http": { "port": 9090 }, "https": { "port": 9443 }, "ssl": { "certificateFiles": [ "path_to_key_file", "path_to_certificate_file" ] } },

内部CAに署名された証明書を使用している場合は、Javaのトラストストアに正しい証明書があるか確認する必要があります。

メトリクス

Collaboratorサーバは、管理者がサーバのパフォーマンスや負荷を監視するためのさまざまな使用率のメトリクスを収集します。Collaboratorのマシンがその使用レベルに十分耐えうるかを確認するためにこれらのメトリクスが有用です。通信イベントやポーリングリクエストから抽出されたデータは、このメトリクスにはまったく含まれていない点に留意してください。

Collaboratorサーバのポーリングインタフェース経由でメトリクスデータにアクセスでき、共有秘密URLとクライアントIPアドレスのホワイトリストでアクセスを制御できます。メトリクスはデフォルトで無効で、Collaborator設定ファイルの"metrics"オプションセクションを使用すると有効になります。例:

"metrics": { "path": "jnaicmez8", "addressWhitelist": [ "21.10.23.0/24" ] },

この設定では、21.10.23.0/24ネットワーク上のクライアントが次のURLにアクセスすると利用できます:

https://10.20.0.159/jnaicmez8/metrics

Collaboratorのログ出力

設定ファイルで、標準出力へのログ出力レベルを設定できます。使用可能な値は次の通りです:

インストールのテスト

サーバを配備したとき、Burp Suite Professionalを使用して、正しく動作しているか確認できます。Burp Suiteで、Burp Collaborator Serverオプションの詳細を設定し、ヘルスチェックを実行してください。するとBurpはCollaboratorの各機能を順番にテストしていきます。

カスタムHTTPコンテンツの追加

プライベートCollaboratorサーバ上のほとんどのURLはデフォルトで、Burp Collaboratorに関する基本的な情報を提供する単純なページを表示します。しかし、カスタムURLを定義して、カスタムコンテンツも返せます。たとえば、組織やサービスの目的を示す独自のインデックスページを作成できます。

またこの機能を使用して、任意のURLでファイルも返せます。たとえば、TLS証明書要求を検証する際に、ドメインを所有していることを証明するために特定のURLにファイルを置くようCAが要求する場合があります。カスタムrobots.txtファイルやcrossdomain.xmlファイルの配置も可能です。

カスタムURLを定義するには、設定ファイルのトップレベルに配列 customHttpContentを追加します。この配列では、定義したいURLごとにオブジェクトを作成します。各オブジェクトに、次のプロパティを指定する必要があります:

たとえば、次の設定を追加すると、カスタムインデックスページがルートパスに設定され、/info/readme.txtreadmeファイルが追加されます:

"customHttpContent": [ { "path": "/", "contentType": "text/html", "base64Content": "PCFkb2N0eXBlIGh0bWw+Cgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8dGl0bGU+RXhhbXBsZSBQYWdlPC90aXRsZT4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvbXlzdHlsZXNoZWV0LmNzcyI+CjwvaGVhZD4KPGJvZHk+CjxoMT5XZWxjb21lIHRvIG15IGV4YW1wbGUgcGFnZTwvaDE+CjxwPlRoYW5rcyBmb3IgdmlzaXRpbmcgbXkgZXhhbXBsZSBwYWdlLjwvcD4KPC9ib2R5Pgo8L2h0bWw+" }, { "path": "/info/readme.txt", "contentType": "text/plain", "base64Content": "VGhpcyBpcyB0aGUgcmVhZG1lIGZpbGUgZm9yIG15IGNvbGxhYm9yYXRvciBzZXJ2ZXIu" } ]

カスタムDNSレコードの追加

TXTとCNAMEのカスタムDNSレコードを追加できます。これはドメイン検証の際にDNSチャレンジが行われる場合にCollaboratorサーバが対応できることを目的としています。1つのラベルに複数のTXTレコードを指定できますが、CNAMEレコードは1つだけです。設定例は次の通りです:

labelの値は、問合せの対象になるサブドメインです。recordの値は、サーバが応答する値です。

"customDnsRecords": [ { "label": "_acme-challenge", "record": "275fe5b909adb10e41c78066e9485f7d", "type": "TXT", "ttl": 60 }, { "label": "queried_subdomain", "record": "reponse", "type": "TXT" }, { "label": "queried_subdomain", "record": "response", "type": "CNAME" } ]

ttlの値はオプションで、秒単位です。

たとえばこのエントリーをburpcollaborator.example.comの設定ファイルに追加し、ネームサーバへ_acme-challenge.burpcollaborator.example.comのTXTタイプを問い合わせると、275fe5b909adb10e41c78066e9485f7dが返ってきます。

customDnsRecords.label カスタムDNSレコードのDNSラベル(例: _acme-challenge)。
customDnsRecords.record ラベルに対応するカスタムDNSレコード。
customDnsRecords.type カスタムDNSレコードのタイプ。現在のところ、TXTまたはCNAMEのいずれか。
customDnsRecords.ttl レコードの生存時間(秒単位)。

サーバのトラブルシューティング

Collaboratorサーバに問題がある場合は、次を試してください: