2011-02
11
21:32:11
[改訂版] iPhoneアプリのSSL接続をパケットキャプチャする方法


前回記事のはてブコメントで教えてもらったんですが、Burp Proxyというプロキシー型キャプチャソフトがあるそうです。
で実際使ってみると、これいい!お手軽ですね。Fiddler2と違ってiPhoneアプリでも利用可能です。
ということで改訂版をまとめてみますよ。 一応再度のまとめにしますので前回と被る部分もありますがご了承下さい。

なおやはり再度の補足になりますが、セキュリティの向上や社会的に正当な目的の下で正しく使用されることを期待してこのエントリーを記載しています。筆者は利用の結果に対して全くの無責任・無保証ですので、あくまで自己責任でご利用下さい。

概要

前回と同じく、Man In The Middle(MiTM)と呼ばれる「第三者介入」方式によるキャプチャとなります。つまりSSL/TLSは本来ピア・ツー・ピアなので第三者が通信経路上で通信傍受して暗号を複合化することは無理なので、クライアント側(ブラウザやここではiPhoneアプリ)を騙して別のサーバーに接続させ暗号を解除し、そこでキャプチャを取るという方法です。
本来は攻撃手法の一種ですが、応用すると暗号化通信でもキャプチャできるようになる、ということです。

以下は概要図です。

  1. iPhoneではホストAをプロキシとして設定する
  2. ホストAはiPhoneからのSSL/TLSセッションの暗号化を一旦解除し、更にSSl/TLSクライアントとしてリクエストをターゲットサイトへ転送する。
  3. ターゲットサイトはレスポンスをホストAへ返答し更にホストAはターゲットサイトに成り代わりiPhoneへレスポンス
  4. ホストAにてキャプチャ

使用機材・ツール

まずは当然iPhone(もしくはiPad,  iPod touch)。iOSバージョンは問いません。
前回と異なりJailBreakは必要ありません。

またここでは以下のツールを利用します。

iPhone構成ユーティリティ (Windows版はこちら)
Burp Suite(Burp Proxy)

主役となるBurp Proxyは本来Burp Suiteというセキュリティツールの一機能のようです。Suiteは有償ですが、Proxyだけであればフリーで利用できます。JavaですのでWindows/Mac/Linuxで動作します。
SSL/TLSプロキシとして動作すると同時に、WireSharkのようなパケットキャプチャも同時に行えます。
SSL/TLSセッションの場合は内蔵のSSL/TLSサーバ機能によってターゲットサイトになりすまします。iPhoneではプロキシとして設定しているだけなのでターゲットサイトと直接ピア・ツー・ピアで通信していると誤認しますが、実際にはピア・ツー・ピアレベルではBurp Proxyと通信していることになります。
つまりL3では無く、L7プロキシ(アプリケーション・ゲートウェイ)として動作する訳です。

iPhone構成ユーティリティはMacまたはWindowsが必要です。

機材はBurp Proxyを稼働させるホストが1台必要です。

1. Burp Proxyの設定

まずBurp Proxyをダウンロードして起動しましょう。
Windowsではsuite.batを起動するだけでOKです。Macならburpsuite_vx.x.x.jarといったバージョンの付いた名称のjarファイルがあるのでこれを起動するだけです。

これで既に稼働している状態なのですが、初回起動直後はlocalhostからのセッションしか受け付けなくなっているのでこれを変更します。
[proxy]タブ – [option]を選択します。既にProxyの設定が1エントリーなされていますが、「loopback only」がチェックされているのでこれを外します。
エントリーを選択後[edit]ボタンを押し、下部で変更できるようになるので「listen on loopback interface only」のチェックを外し、[update]ボタンを押します。これでリストのエントリのチェックも外れるはずです。
デフォルトポートは8080ですが、上記の作業で変更することも出来ます。

また初期状態では[proxy] – [intercept]がONになっているかも知れません。このままでは通信が止まってしまうので、必ずOFFにしておいてください。

2. Burp ProxyのCA証明書の取得

Burp Proxyは独自のCA証明書からターゲットサイトになりすますための一時的なSSL証明書をアクセス時に発行するのですが(デフォルト時動作)、このCA証明書をiPhoneへインストールするためにまず取得(CA証明書の生成ではありません。既に存在している証明書をエクスポートするだけです)しないといけません。もしかするとBurp Proxyに設定があるのかも知れませんが、僕は分かりませんでした。そこで一般のブラウザでProxy設定をして一度ターゲットサイトへアクセスし、ブラウザ経由でBurp ProxyのCA証明書をダウンロードします。

最近のIEではそもそも接続が出来ませんので、Firefoxなど他のブラウザを使って下さい。
Firefoxでは[オプション] – [詳細] – [ネットワーク]からSSLプロキシとしてホストAを、ポートとして8080(デフォルトの場合)を設定して、ターゲットサイトのURLへアクセスします。当然これはHTTPSです。
すると「接続の安全性を確認できません」と表示されそのままではアクセスできないはずです。これはSSLサーバーとしてBurp ProxyがなりすましているためSSL証明書の検証に失敗しているからです。
本来行うべきではありませんが、ここでは「危険性を理解した上で接続するには」を選び「例外」を押下します。すると「証明書」の表示ボタンがあるのでこれを押して証明書の詳細を「表示」します。
証明書ビューアが表示されるので[詳細]タブを選ぶと、証明書の信頼チェーンが表示されます。ここで一番上位にある「PortSwigger CA」を選択して「エクスポート」ボタンを押します。これでBurp ProxyのCA証明書がダウンロードできますので、どこかへ保存しておきます。

なお上記のように元々組み込みのCA証明書を利用する方法の他、前回のようにOpenSSLなどで生成したオリジナルのCA証明書をBurp Proxyにインポートして利用する方法もあるようですが、試していません(特に今回の目的では意味がありません)。

3. iPhoneへCA証明書の組み込み

ここが今回の話題の最大のポイントになります。
iPhone構成ユーティリティは主に企業内部でiPhoneを配布するために様々な設定をプロファイルという単位でまとめてiPhoneに直接設定しておくことが出来ます。このプロファイルのインストールとあるいはアンインストールも構成ユーティリティからしか行えません。
このプロファイルには企業の内部CAの証明書をインストールして信頼させる機能があるのでこれを利用します。

  1. まず構成ユーティリティを起動してiPhoneを接続します。
  2. [構成プロファイル]-[資格情報]を選択します
  3. 構成ボタンを押して、3で取得したBurp ProxyのCA証明書を追加します。Macでキーチェーンに追加していない場合には「信頼されていない証明書」というアラートが出ますが問題ありません。
  4. [デバイス]からiPhoneを選択して今設定したプロファイルをインストールします。

4. iPhoneでのプロキシ設定

WiFi接続が前提になります。
[設定]から[Wi-Fi]を選択し現在接続中のアクセスポイントの詳細を表示します。
一番下の方に[HTTPプロキシ] の設定がありますので手動を選び、[サーバ]にはホストAを、[ポート]には8080(デフォルト時)を設定します。

5. キャプチャを行う

これで準備は完了です。実際にiPhoneからアプリを起動して動作するかどうか確認してみましょう。正常に動作するなら、Burp Proxyの[proxy]タブ – [history]にキャプチャ結果が表示されるはずです。
Burp Proxyのキャプチャ機能は確かにWireSharkあたりと比べると見劣りしますが、例えばiPhoneアプリがどんな情報を送信しているかなどを簡単に確認するには十分でしょう。
とかくiPhoneアプリ(iPhoneに限らずモバイルアプリはそうでしょうが)は「内部が何をやっているか分かりにくい」ことが問題視されたり不安を呼んでいる面も多いように思います。こうした方法などで少しでも安心感が得られるならよいですね。

[改訂版] iPhoneアプリのSSL接続をパケットキャプチャする方法」への12件のフィードバック

  1. ピンバック: ORBIT SPACE
  2. はじめまして。この度このページの情報を参考にiPhoneでパケットキャプチャをやらせていただいたにゃんこと申します。
    掲載されていた情報通りに進めると、何点か不明点があったので、役立つか?当たり前なのか?分かりませんが補足させていただきます。

    ①まず使用するburpsuiteですが、バージョンによってインターフェイスが異なっています。
    Ver1.1なら記載されている通り『[proxy]タブ – [option] → 「loopback only」がチェックされているのでこれを外します。』であっています。
    Ver1.5(2013/5/12)では[proxy]タブ – [option] には、「loopback only」という項目がありません。
    この場合は、みうさんのコメントにある通り(以下転記)になります。
    >>Burp suiteでの設定ですが、Proxy→Optionsと辿り、Proxy Listenersの127.0.0.1:80を選択した状態で、Editをクリックします。
    初期ではLoopback onlyが選択されている状態だと思いますが、Specific addressの部分を選択し、私の場合ですが192.xxx.x.x(ポートは8080)に変更しています。

    ②CA証明書の取得後~iPhoneへCA証明書の組み込みまで
    CA証明書取得後、『「PortSwigger CA」を選択して「エクスポート」ボタンを押します。これでBurp ProxyのCA証明書がダウンロードできますので、どこかへ保存しておきます。』と記載されていますが、ダウンロード後に証明書をWクリックして「証明された発行元」などにインポートしておかないと、
    iPhone構成ユーティリティの[構成プロファイル]-[資格情報]を選択後に出てくる項目内に「PortSwigger CA」が出てこないので、インポートする必要があります。

    ③iPhone構成ユーティリティについて
    iPhoneパケットをみるためのサイトなので特に細かく記載されていなかったのだと思いますが、iPhone構成ユーティリティ起動後、恐らくライブラリ内の「一般」 → 識別子の記入は必須です。ここを空欄のままいきなり「資格情報」にいき証明書設定→iPhoneインストールすると不具合があるのでは?と・・・(てか出来ないのでは)

    ※あと自分の使用しているWi-Fi環境は、モデム→PC→無線発信USBでWi-Fi発信→iPhone受信 なので、本文記載のネット環境とは違ったのか、「一般」 → 識別子 & 「資格情報」 → CA証明書設定 後に、iPhoneへインストールしてWi-Fi手動でホスト&ポート設定してもSafariでは通信エラーと出ました。
    なのでiPhone構成ユーティリティのライブラリ内にある「Wi-Fi」にSSID(iPhoneがWI-Fi接続する時に出てくる名前)やプロキシ設定を[手動]にして
    サーバー&ポートを入力してiPhoneにインストールした所、無事にSafariに接続出来ました。

      1. CA証明書を取得するのに使ったブラウザは、記述の通り「Firefox」を使い取得しました。

        iPhoneでのインターネット画面を開く際に使ったブラウザはSafariです。

  3. ばかばかしい質問かもしれませんが気が向いたらへんじおねがいします(´・ω・`)
    僕は、Windows7 64ビット のpcをつかっています、
    それで、burpsuite_free_v1.5.jarをひらいてポートの設定とかをいじるのは
    すぐ終わったんですけどパケットがProxyのInterceptにいってもまったく
    ひょうじされないんですがこれはなにがいけないんですか?

    あとiphoneの設定内のプロファイルには PortSwigger CA というのを一様DLできたんですが
    DLするのはこのファイルでもんだいないですよね?

    こんな初歩的な質問こんなところでするもんじゃないと思うんですけど
    いくらググっても調べ方が悪いのか全然分らなくてお手上げ状態なので質問しました

    説明不足かも知れませんがよろしくおねがいします(´・ω・`)

    1. 「1. Burp Proxyの設定」での設定や注意点は全て確認されていますか。
      最近触っていないので、もしここの問題で無いとすると私もよく分からないですが。。

      1. 回答ありがとうございました 
         
        なんかいやってもよく分らなかったのでほかのサイトとかを参考にもうちょっとしらべてみます

        ありがとうございました。

  4. Nitro238さん、通りすがりのものですが、証明書やhosts云々ではなく、ただ単に設定が間違っている為ではないでしょうか?
    ちなみにJailBreakも一切必要ありません。

    iPhone構成ユーティリティで証明書をインストールまで完了した前提でお話で説明させていただきます。

    Burp suiteでの設定ですが、Proxy→Optionsと辿り、Proxy Listenersの127.0.0.1:80を選択した状態で、Editをクリックします。
    初期ではLoopback onlyが選択されている状態だと思いますが、Specific addressの部分を選択し、私の場合ですが192.xxx.x.x(ポートは8080)に変更しています。

    iPhone側は設定→Wifi→お使いのアクセスポイント名→HTTPプロキシへと進み、手動にてサーバー欄に先程の192.xxx.x.xを入力、ポートに8080を設定したら、これで完了だと思います。

    もしこの設定をしてもまだiPhone側で通信エラーが出る場合は、Burp SuiteのProxy→InterceptまたはProxy→OptionsのInterceptにチェックが入っているのではないでしょうか?
    チェックを入れている場合はProxy→Interceptタブの部分で、リクエストもしくはレスポンスが表示される度にForwardボタンをクリックしてやる事で通信可能ではないかと思われます!

  5. はじめまして。この度このページの情報を参考にiPhoneでパケットキャプチャをやらせていただいたNitro238と申します

    キャプチャしたいアプリには機能が限定的ながらもブラウザ版もあり、ブラウザ版のhttpsパケットキャプチャには成功したのですが、

    アプリのパケットキャプチャを行おうとするとアプリがインターネットに接続できませんでした

    と出てきてしまい、キャプチャすることができなくて困っております。

    ブラウザの場合、アクセスしたとき、「この証明書はなんかあれですが それでも接続しますか」的なダイアログが出て続行ボタンを押せば接続できるのですが、

    アプリの場合そういった類のものが一切出なくて、証明書が合わないと切断される設計になっているためか、失敗します

    知り合いに、アプリとブラウザで接続できる、できない の違いがでるのは、ブラウザで使っているProxy関連の設定とアプリで使っている設定が違うためだ、と言われました。

    その後使わなくなったiPhoneをJailBreakしてetc/hostsファイルとやらを書き換えても見たのですが、現状に変化はありませんでした

    何か、よい方法がありましたら、アドバイスいただけたらと思います。

    もしどんなアプリ名かわからなければ具体的な回答ができない、というのであれば、アプリ名を開示したいと思います。

    以上、お忙しいとは思いますが、よろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)