[iOS] Burp Suiteを使用した、SSL通信のデバッグ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

Burp Suiteは、Webの脆弱性診断を行う製品です。 XSSや、その他の脆弱性であるreflectedやstoredのDOMベースの検査パターンを有しています。

今回は、この製品の機能のうちの一つである、「プロキシー機能」を使用して、iPhoneからのSSL通信をモニターする要領を紹介します。 なお、「プロキシー機能」だけであれば、無料で提供されている「Free Edition」でも利用が可能です。

通信を行うアプリを作成する場合、サーバとの間の通信を見れると、非常に作業効率が上がると思います。 HTTP通信であれば、パケットモニター(Wiresharkなど)で簡単に見ることが出来ますが、HTTPSの通信は、通信が暗号化されているため、通常のパケットモニタでは、その内容を確認することは出来ません。

2 MITM

はじめに、Burp Suiteが、SSL通信をモニターする方法と、通常のSSL通信との違いを整理して事後の作業の手助けとします。

次の図は、通常のSSL通信(図中のA)と、MITM(ここではBurp Suite)を経由した通信(図中のC)の違いを示したものです。

赤色の部分が平文で、青色が暗号化されている部分です。SSL通信で暗号化できるのは、エンドポイントまでなので、中間で平文化してモニターするためには、エンドポイントを改めて形成する必要があります。

また、SSL通信では、サーバ証明書が必要ですが、MITMでは、自前で用意した証明書を使用しています。

Burp Suiteでは、クライアントのプロキシー設定を変更して、自分宛に通信を向けさせますが、通常のプロキシーサーバ(図中のB)は、暗号化したままのパケットを橋渡しするだけなので、そのURLさえ見ることはできません。

025

図を見れば分かるように、本来の通信と違っているのは、クライアントがSSL通信で使用しているサーバ証明書だけですので、そこをクリアする必要があることが分かります。

本物のサーバ証明書と、偽物の証明書を見分ける対策は、Public Key Pinningとして存在しており、この対策を実装したアプリ(Chromeなど)では、このBurp Suiteによるモニターはできません。

3 インストール

(1) ダウンロード

下記のページから、Downloadのリンクを辿ります。
https://portswigger.net/index.html

001

Free WditionDownlocad nowを選択すると無料のバージョンが取得できます。

002

003

(2) 実行

Burp Suiteは、1.6以降のJavaがインストールされている必要があります。

$Java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

コマンドラインから、下記の要領で起動することができます。 (ヒープにMAX2GBを指定して、JVMを起動しています。)

$ java -jar -Xmx2G burpsuite_free_v1.6.32.jar

4 表示設定

設定により、次の2つのフォント設定が可能です。

(1) メニュー・タブキャプション・ボタン等

メニュー等のフォントは、Option - Display - User Interfaceで設定できます。 再起動後に、設定が反映されます。

009

(2) テキスト

テキストのフォントは、Option - Display - HTTP Message Display - Change font...で設定できます。 こちらは、再起動は必要なく、ただちに反映されます。

010

011

5 プロキシーリスナー

Proxy - Option - Proxy Listenersで、プロキシーとして待受けるインターフェースとポートを指定します。

デフォルトで、ローカルアドレスからの8080ポートしか受け付けないようになっていますので、それ以外からの通信を受け付ける場合は、Addボタンで追加する必要があります。

005

下記は、あらゆるインターフェースからの8080番を待ち受けに追加している様子です。

006

007

6 クライアントのプロキシー設定

ここまでの設定で、クライアント(iPhone)のプロキシー設定を、サーバ(Burp Suiteのアドレス)、ポート(8080)に設定することで、通信をモニタできます。

026

Proxy - HTTP historyをページを開くと、とりあえず通信がモニタできていることを確認できます。
※現時点では、SSL通信はモニター出来ません。

012

7 インターセプト

Burp Suiteでは、クライアントからの通信を受けた際に、一旦止めて、編集等してから、サーバに送信する機能があります。

Proxy - Interceptのページで、intercepy onになっていたら、通信が止まっていますので、流すためには、intercept offにしてください。

008

8 証明書

(1) 2種類の証明書

最初の図で示したように、Burp Suiteは、自分自身を接続先のサーバに見せかけるために、サーバ証明書を自前で用意します。そして、その証明書は、まず、自己の中にルート証明書を持ち、そこから、ホスト毎に証明書を発行して使用しています。

ここで、クライアントであるiPhoneは、SSL通信する場合に、そのサーバ証明書を信頼する必要があるのですが、その方法には、次の2つがあります。

  • ホスト毎にサーバ証明書を信頼する
  • Burp Suiteのルート証明書を信頼する

最初を方法をとる場合、ホストが変わるたびに、毎回、証明書の信頼を行う必要が有りますが、2つ目の方法をとった場合、1回ルート証明書を信頼すれば、それに基づいて発行される証明書は、自動的に全部信頼することになります。

(2) 個別のサーバ証明書の信頼

最初の方法をとる場合、iPhoneでSSL通信した際、次の画面が表示されます。

そして、この画面から、「詳細」を選択し、続いて「信頼」を選択することで、この証明書を信頼したことになります。

014

(3) ルート証明書の信頼

ルート証明書を信頼するには、まず、クライアントで、Burp Suiteのアドレス+ポート(例では、http://192.168.0.105:8080/)にアクセスします。すると次のような画面が表示されますので、ここでCA certificateを選択します。 (この作業は、Safariで行います) 017

すると、次のような画面になりますので、「インストール」を選択して進めると、そのルート証明書を信頼します。

021 022

インストールされた、ルート証明書は、「設定」ー「一般」ー「プロファイル」で確認できます。また同メニューで削除することも出来ます。

ルート証明書を信頼すると、それを元に発行した証明書は、全て黙って信頼してしまうので、このような「オレオレ証明書」のインストールは、慎重に行ってください。作業が終わったら、確実に削除することをお勧めします。

023 024

9 ATS

Burp SuiteでiOS9のアプリの通信をモニターしようとすると、ATSの制限に抵触する可能性があります。

ATSについての詳しい情報は、下記をご参照ください。
[iOS 9] iOS 9 で追加された App Transport Security の概要

ATSは、Info.plistで、その設定を無効にすることまで含めて、自由に変更可能ですが、デフォルト値で、幾つかの制限があります。そして、これに対応するためには、Burp Suiteで設定を確認する必要があります。

(1) TLSバージョン及び暗号スイート

iOS9のATSでは、デフォルトで、TLSバージョン 1.2 以上が要求されます。また、暗号スイートの組み合わせも、下記の組み合わせに制限されています。

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

この制限に対応するため、Burp Suiteでは、Option** - SSL のタブで、その設定を確認する必要があります。

018

(2) 証明書

証明書については、デフォルトで、2048ビット以上のRSAキー、もしくは、256ビット以上のECCキーが要求されますが、ドキュメントによるとBurp Suiteでは、当初1024ビットの証明書が生成されているようです。

別に証明書を用意して、それをセットするには、Proxy - Option - Import / export CA certificateのメニューを使用します。

試験用のオレオレ証明書の作成方法などについては、下記をご参照ください。


OpenSSL Certificate Authority - Create the root pair

019 開かれたダイアログでImport側にチェックを入れて、証明書をインポートします。

020

10 最後に

今回、Burp Suiteでプロキシーを構成し、アプリの通信をモニターする要領を紹介しました。 通信の暗号化が、ほとんど常識となっている今では、SSL通信をモニターする環境を準備しておく事は重要だと思います。

11 参考資料


https://portswigger.net/index.html
不正なSSL証明書を見破るPublic Key Pinningを試すAdd Starboyasanmkt
Burp and iOS 9 App Transport Security