こんにちは、SSTでWeb脆弱性診断用のツール(スキャンツール)開発をしている坂本(Twitter, GitHub)です。
先日 iOS にBurpのHTTP Proxy設定をする機会がありました。 久しぶりなので改めて調べ直してみたところ、Burpの開発元である PortSwigger 社のサポートページに詳しい解説がありました。
- Configuring an iOS Device to Work With Burp - PortSwigger
- 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側の準備
- Burp の
Proxy
タブ →Options
タブ →Proxy Listeners
→Add
します。 - 既存の listener やサービスと重複しないポート番号を入力し、 "Bind to addresses" で "All interfaces" を選択して OK ボタンをクリックします。
- デフォルトの "Loopback only" では、ネットワーク上の他のPC/スマートフォンからProxy接続を受け付けることができません。
- "Specific addresses" で特定のイーサネットポート/WiFi接続からのみ受け付けるようにすると、よりセキュアです。
- 追加された listener にチェックを入れて、listenerを起動します。
Dashboard
タブのEvent log
で "Proxy service started on (設定したポート番号)" が記録されていれば成功です。
- Burp を起動したPC側で、コマンドプロンプトから
ipconfig
コマンドを実行し、PCのIPv4アドレスをメモしておきます。- iOSからWiFi経由で接続する場合、WiFi アダプタに割り振られた IPv4 アドレスをメモしてください。*2
- Burp を起動したPCの Firewall 設定で、追加した listener 用のポート番号について外部からのアクセス(inbound)を許可してください。*3
PortSwigger 社のサポートページでは、上記の通り Proxy Listener を追加する方法が紹介されていました。
一方で、既存の Proxy Listener Edit
から "Bind to address" を "All interfaces" にする方法もあります。
どちらでも問題ありませんが、追加する方法では、 Proxy
→ HTTP history
→ Filter
画面右下の Filter by listner
で特定のポート番号で受信したログだけに絞込めます。
iOS 専用のポート番号で Proxy Listener を追加することで、 iOS からの通信だけに絞り込めるのが利点と言えます。
iOS側の設定
- 「設定」→「WiFi」→ 接続中のWiFiの「丸囲いの "i" 」アイコンをタップ → 「HTTPプロキシ」 → 「プロキシを構成」 → 「手動」 → 以下の通り設定:
- 「サーバ」 : Burp側の準備でメモした IPv4 アドレス
- 「ポート」 : Burp側の準備で iOS 用に設定した Proxy Listener のポート番号
- iOSのバージョンによっては、設定後「保存」や「DONE」をタップしないと反映されないことがあります。
- 分かりづらいときは、PortSwigger社のサポートページのスクリーンショットなどを参考にしてみてください。
- iOS上の Safari などから
http://
始まりのURLにアクセスし、Burp側のProxy
→HTTP history
でHTTP通信ログを確認できるかチェックします。 https://
についてもHTTP通信ログを確認するには、Burp のCA証明書のインストールに進みます。
Burp の CA 証明書のインストール
https://
で始まるURLは、ブラウザとサーバ間の通信をTLS(Transport Layer Security)により暗号化します。
Burp で暗号化を解いて平文の通信内容を見るためには、Burp のCA*4 証明書をブラウザやOSにインストールする必要があります。
- iOS上のSafariから
http://burpsuite
にアクセス → "CA Certificate" リンクをクリックしてプロファイル(CA証明書)をダウンロード。 - 「設定」などからダウンロードしたプロファイルをインストールします。
- 警告が表示されますが、そのままインストールして大丈夫です。
- 「設定」を開き「情報」→「証明書信頼設定」 → 「ルート証明書を全面的に信頼する」で「PortSwigger CA」をONにします。
- iOS上の Safari などから
https://
始まりのURLにアクセスし、Burp側のProxy
→HTTP 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の仕組みや認証局、証明書の話は奥が深いです。 より詳しく知りたい・興味がある方向けに以下の書籍を推薦します。
CA証明書をインストールしてもHTTPS通信がエラーになるときは
Burp のCA証明書をインストールして信頼しても、iOS側でHTTPS通信がエラーになるケースがあります。
その時は Burp の Dashboard
→ Event 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 を再起動してください。
2020年~2021年7月時点の情報となりますが、Burp を動かしている Java 14 と iOS/Safari との間で、TLSv1.3 を使ったときの相性問題があるようです。 "Burp Suite User Forum" の以下のスレッドで報告されており、PortSwigger の人が TLSv1.3 の無効化を勧めていました。
always error Error Proxy [25] The client failed to negotiate a TLS connection with my iPhone - Burp Suite User Forum
まとめ
iOS 用の Burp のHTTP Proxy 設定の手順を簡単にまとめます。
- Burp の Proxy listener で "Bind to" を "All interfaces" に変更し、自分のPC以外からの接続を受け付けるようにします。
- ファイアウォールでのアクセス許可も忘れずに!
- iOS の WiFi 設定から Burp Proxy のIPアドレスとポート番号を手動設定します。
- ここまでで HTTP 通信は Burp を通るようになります。(Safari等でチェック)
- iOS の Safari から
http://burpsuite
にアクセス → "CA Certificate" リンクをクリックしてプロファイル(CA証明書: 「PortSwigger CA」)をダウンロードし、インストールします。 - 「設定」を開き「情報」→「証明書信頼設定」 → 「ルート証明書を全面的に信頼する」で「PortSwigger CA」をONにします。
- これでHTTPS通信も Burp を通るようになります。(Safari等でチェック)
- もしHTTPS通信でエラーが多発しているようであれば、Burp の Proxy listener の "TLS Protocols" で TLSv1.3 を無効化します。(念の為、無効化した listener は再起動)
本記事が iOS で Burp を Proxy 設定する人のお役に立てば幸いです。 また、技術的な内容は他の Proxy 製品でも変わりません。 Burp 以外の HTTP Proxy を使いたい場合にも参考にしてみてください。