2013年7月26日金曜日

AndroidのSSL通信をキャプチャする方法

Burp ProxyCharlesなどのリバースプロキシを使いましょう。

リバースプロキシとは、外部サーバーへの接続を肩代わりするプロキシサーバーです。

http通信ならば、これらのプログラムを立ち上げればそれで通信をキャプチャすることができますが、SSL通信では一手間必要です。サーバーとクライアント間でお互いに承認した乱数(マスターシークレット)を用いて暗号化するため、中間に入って通信を傍受することはできないからです。

そこでリバースプロキシのCA証明書を入手し、端末に信頼できるルートCAとして登録する必要があります。

Charlesの場合、FAQにiPhone用の証明書ファイルへのリンクがありますので、Androidのブラウザでアクセスしてインストールします。iPhone用と書いてありますが、Androidでも問題なく使えます。

Burp Proxyの場合、Burp Proxyが生成した証明書を取得する必要があります。

Androidの標準ブラウザやChoromeでは証明書の取得を行うことができないので、適当なデスクトップ用ブラウザを仕様します。Burp Proxyを起動->ブラウザ(OS)でプロキシサーバを設定->ブラウザでhttpsのサイトへアクセス->ルート証明書をエクスポート(firefoxの場合、「接続の安全性を確認できません」という警告が出るので、「危険性を理解した上で接続するには」->「例外を追加...」をクリックします。「セキュリティ例外の追加」ダイアログが表示されるので、証明書の状態の「表示(V)...」をクリックすると、証明書の詳細が表示されます。ここでルート証明書となっているBurp Suite PortSwiggerを選択し出力します。拡張子が付いていない場合.cerを付けます)で、証明書を取得することができます。あとは証明書をメール等でAndroid端末に送付してインストールします。

CA証明書のインストールは、SDカードのルートに保存(adb push hoge.cer /mnt/sdcard)して、「設定」->「セキュリティ」->「SDカードからのインストール」からでもできます。

CA証明書のインストールができたら、Macの設定から「インターネット共有」をONにしてWifiスポットにし、AndroidのWifi接続先をMacにします。そしてWifi接続の設定からプロキシを手動で追加し、Macのアドレスと8080番ポートを指定します。(同一のネットワークセグメントに接続されていれば、「インターネット共有」を使う必要はありません)

なおWifi接続の設定には、「HTTPプロキシはブラウザで使用されていますが、他のアプリでは使用できません」というような説明が書いてあるかと思いますが、実際には普通にアプリの通信でも有効です。(説明が間違っているのか、端末依存があるかどうかは分かりませんが、手元のAndroid4.0以降の端末だと可能です。httpClientのProxy設定を変更することでそれ以前のAndroidでも可能です)

---

リバースプロキシを使えば、通信内容をキャプチャするだけでなく、いろいろとやれます。
  • リクエスト内容を書き換える。
  • 特定の通信処理のみをInterceptすることができる。例えば「通信Aが成功したらその結果を使って通信Bを行う」といった処理で、通信Bが失敗したときの挙動を確実にテストできる(タイミングよくWifiを切る、とかそういう原始的な方法でテストしている人も世の中にはいるらしい)
  • CharlesのMap Localを使うと、レスポンスとしてローカルファイルを返すことができる。本番環境サーバーからデータを取得する処理を、ローカルファイルに切り替えることで、コードを変更せずにテストデータの変更を行える。

0 件のコメント:

コメントを投稿