SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

iOSにおけるBurpのHTTP Proxy設定(2021版)

こんにちは、SSTでWeb脆弱性診断用のツール(スキャンツール)開発をしている坂本(Twitter, GitHub)です。

先日 iOS にBurpのHTTP Proxy設定をする機会がありました。 久しぶりなので改めて調べ直してみたところ、Burpの開発元である PortSwigger 社のサポートページに詳しい解説がありました。

  1. Configuring an iOS Device to Work With Burp - PortSwigger
  2. Installing Burp's CA Certificate in an iOS Device - PortSwigger

今回はこれを元に、ポイントを簡潔に紹介したいと思います。 Burp や iOS の実際の設定画面については、上記サポートページを参照してください。

動作確認バージョン:

  • Burp Suite Community Edition v2021.5.1
  • iPad (iOS 12.5.4)*1

Burp側の準備

  1. Burp の Proxy タブ → Options タブ → Proxy ListenersAdd します。
  2. 既存の listener やサービスと重複しないポート番号を入力し、 "Bind to addresses" で "All interfaces" を選択して OK ボタンをクリックします。
    • デフォルトの "Loopback only" では、ネットワーク上の他のPC/スマートフォンからProxy接続を受け付けることができません。
    • "Specific addresses" で特定のイーサネットポート/WiFi接続からのみ受け付けるようにすると、よりセキュアです。
  3. 追加された listener にチェックを入れて、listenerを起動します。
    • Dashboard タブの Event log で "Proxy service started on (設定したポート番号)" が記録されていれば成功です。
  4. Burp を起動したPC側で、コマンドプロンプトから ipconfig コマンドを実行し、PCのIPv4アドレスをメモしておきます。
    • iOSからWiFi経由で接続する場合、WiFi アダプタに割り振られた IPv4 アドレスをメモしてください。*2
  5. Burp を起動したPCの Firewall 設定で、追加した listener 用のポート番号について外部からのアクセス(inbound)を許可してください。*3

PortSwigger 社のサポートページでは、上記の通り Proxy Listener を追加する方法が紹介されていました。 一方で、既存の Proxy Listener Edit から "Bind to address" を "All interfaces" にする方法もあります。 どちらでも問題ありませんが、追加する方法では、 ProxyHTTP historyFilter 画面右下の Filter by listner で特定のポート番号で受信したログだけに絞込めます。 iOS 専用のポート番号で Proxy Listener を追加することで、 iOS からの通信だけに絞り込めるのが利点と言えます。

iOS側の設定

  1. 「設定」→「WiFi」→ 接続中のWiFiの「丸囲いの "i" 」アイコンをタップ → 「HTTPプロキシ」 → 「プロキシを構成」 → 「手動」 → 以下の通り設定:
    • 「サーバ」 : Burp側の準備でメモした IPv4 アドレス
    • 「ポート」 : Burp側の準備で iOS 用に設定した Proxy Listener のポート番号
    • iOSのバージョンによっては、設定後「保存」や「DONE」をタップしないと反映されないことがあります。
    • 分かりづらいときは、PortSwigger社のサポートページのスクリーンショットなどを参考にしてみてください。
  2. iOS上の Safari などから http:// 始まりのURLにアクセスし、Burp側の ProxyHTTP history でHTTP通信ログを確認できるかチェックします。
  3. https:// についてもHTTP通信ログを確認するには、Burp のCA証明書のインストールに進みます。

Burp の CA 証明書のインストール

https:// で始まるURLは、ブラウザとサーバ間の通信をTLS(Transport Layer Security)により暗号化します。 Burp で暗号化を解いて平文の通信内容を見るためには、Burp のCA*4 証明書をブラウザやOSにインストールする必要があります。

  1. iOS上のSafariから http://burpsuite にアクセス → "CA Certificate" リンクをクリックしてプロファイル(CA証明書)をダウンロード。
  2. 「設定」などからダウンロードしたプロファイルをインストールします。
    • 警告が表示されますが、そのままインストールして大丈夫です。
  3. 「設定」を開き「情報」→「証明書信頼設定」 → 「ルート証明書を全面的に信頼する」で「PortSwigger CA」をONにします。
  4. iOS上の Safari などから https:// 始まりのURLにアクセスし、Burp側の ProxyHTTP history でHTTP通信ログを確認できるかチェックします。

Burp が HTTPS 通信の内容(平文)を見れる仕組みとCA証明書の関係

https:// のTLS通信はブラウザとサーバ間で暗号化されており、本来なら暗号化する前の平文を通信経路で見ることはできません。 Burp は Proxy という性質を利用し、自らが接続先のWebサーバとして振る舞います。 まず Burp自身が一度暗号通信を復号し、平文のHTTP通信ログを記録します。 記録した後は本来のWebサーバに接続し、もう一度HTTP通信をTLSで暗号化して中継しています。

ところで、TLS通信には「その接続先は本物のサーバか」、サーバ証明書で検証する仕組みがあります。 ブラウザはTLS通信の初期化フェーズ*5でサーバが提示してきた証明書を検証します。 本物のWebサーバであれば、一般的な認証局で署名・発行されたサーバ証明書を提示します。 ブラウザはそれにより検証成功と判断し、その後の暗号化通信を処理します。

BurpがWebサーバとして代わりに振る舞うとなると、Burp自身がサーバ証明書を提示する必要があります。 Burpは独自の認証局を内蔵しており、アクセスしてきたホスト名に応じて動的にサーバ証明書を生成しています。 つまり Burp が提示するサーバ証明書は、Burp 独自の認証局により署名・発行されたものになります。

このサーバ証明書をブラウザ側で検証成功とするためには、Burp 独自の認証局をブラウザが知っていて、かつ信頼している必要があります。 これが Burp の CA証明書をインストールする理由です。

Burp の CA証明書をインストールしていないと、ブラウザからすると「見ず知らずの認証局により発行されたサーバ証明書が提示された・・・怪しいな、これ本当に接続先のWebサーバかな?」となり、そこで通信を打ち切ります。 結果としてブラウザ上ではエラー画面が表示され、 https:// のWebサイトを利用できなくなります。

TLSの仕組みや認証局、証明書の話は奥が深いです。 より詳しく知りたい・興味がある方向けに以下の書籍を推薦します。

  1. 暗号技術入門 第3版 秘密の国のアリス, 結城浩
  2. プロフェッショナルSSL/TLS, Ivan Ristić 著、齋藤孝道 監訳

CA証明書をインストールしてもHTTPS通信がエラーになるときは

Burp のCA証明書をインストールして信頼しても、iOS側でHTTPS通信がエラーになるケースがあります。 その時は Burp の DashboardEvent log を確認してください。 そこで The client failed to negotiate a TLS connection to xxxxx.com 443 エラーが発生している時は、Proxy listener の設定で TLSv1.3 を無効にするとエラーが解消することがあります。

Proxy タブ → Options タブ → Proxy Listeners から listener を選択して "Edit" ボタンをクリックし、TLS Protocols タブ → "Use custom protocols" を選択、TLSv1.3 のチェックを外します。 念の為 listener 一覧からチェックをOFF → ON して listener を再起動してください。

f:id:msakamoto-sf:20210729185013p:plain

2020年~2021年7月時点の情報となりますが、Burp を動かしている Java 14 と iOS/Safari との間で、TLSv1.3 を使ったときの相性問題があるようです。 "Burp Suite User Forum" の以下のスレッドで報告されており、PortSwigger の人が TLSv1.3 の無効化を勧めていました。

まとめ

iOS 用の Burp のHTTP Proxy 設定の手順を簡単にまとめます。

  1. Burp の Proxy listener で "Bind to" を "All interfaces" に変更し、自分のPC以外からの接続を受け付けるようにします。
    • ファイアウォールでのアクセス許可も忘れずに!
  2. iOS の WiFi 設定から Burp Proxy のIPアドレスとポート番号を手動設定します。
    • ここまでで HTTP 通信は Burp を通るようになります。(Safari等でチェック)
  3. iOS の Safari から http://burpsuite にアクセス → "CA Certificate" リンクをクリックしてプロファイル(CA証明書: 「PortSwigger CA」)をダウンロードし、インストールします。
  4. 「設定」を開き「情報」→「証明書信頼設定」 → 「ルート証明書を全面的に信頼する」で「PortSwigger CA」をONにします。
    • これでHTTPS通信も Burp を通るようになります。(Safari等でチェック)
  5. もしHTTPS通信でエラーが多発しているようであれば、Burp の Proxy listener の "TLS Protocols" で TLSv1.3 を無効化します。(念の為、無効化した listener は再起動)

本記事が iOS で Burp を Proxy 設定する人のお役に立てば幸いです。 また、技術的な内容は他の Proxy 製品でも変わりません。 Burp 以外の HTTP Proxy を使いたい場合にも参考にしてみてください。

*1:バージョンが古いのは、たまたま筆者の手元にあった個人用 iPad が古いせいで、特別な意図はありません。

*2:iOSからPCにアクセスするときのIPv4アドレスを確認しておくのがポイントです。

*3:すべての外部ホストからのアクセスを許可するのではなく、iOSが接続されているWiFi ネットワークからのアクセスのみを許可すると、よりセキュリティが向上します。

*4:CA : Certificate Authority, 認証局の略称

*5:ネゴシエーション, negotiation とも呼ぶ