2015年09月20日

お手軽にMITM環境を構築するCloudFormation

自分に中間者攻撃したい

デバッグや技術的興味を目的として、アプリの通信内容を見たいと思うことがあります。ネットワーク環境を組めば実現可能なのですが、環境構築に手間がかかるので、それを少額のお金で解決しよう、というはなしです。

中間者攻撃の仕組みと環境構築

中間者攻撃とは
image002.pngネットワークの経路を偽装して、ユーザの通信を攻撃者経由にさせる「中間者攻撃」(man-in-the-middle attack)と呼ばれる手法の攻撃があります。攻撃者はこれにより、ユーザの通信内容を傍受したり、改ざんしたりする事ができます。
image004.png スマートフォンは端末上でユーザが持てる権限が制限されており、単体では通信内容を把握することができません。アプリのデバッグや勉強のためにスマートフォンの通信内容を見ようとした場合、中間者攻撃と似た手法を使い、通信経路を開発用PCに向ける必要があります。
image006.png 最も簡単にこれを実現する方法としては開発用PCをWiFiのアクセスポイントにする方法があります。(WindowsのHosted Network機能が利用できます。)
平文の通信であればこれだけで内容を見ることができますが、SSLで暗号化されている場合、暗号通信は端末とサーバ間で行われるため、開発用PCは暗号文の中継のみとなり、中身を見ることはできません。
image008.png 中間者攻撃でSSLを傍受するには、暗号通信を「端末・開発用PC」「開発用PC・サーバ」の2段階に分けさせる必要があります。
どのように中間者攻撃を実現するか
開発用PCで一旦暗号文を解読するためのソフトウェアとして、Burp Suite・Fiddler・WebScarabなどがあります。(少し手間を掛ければ、Wiresharkでも可能ですが。)
iPhoneとWindowsPCを用意し、iPhoneとサーバ間のSSL通信を傍受するまでの手順は、
1.PC上に中間者攻撃用ソフトウェアをインストールする
2.PCをWifiルータ化する
3.iPhoneをPCにWifi接続する
4.iPhoneのプロキシを設定する
となります。

VPNを利用した中間者攻撃環境の構築

面倒な点
上記の中間者攻撃環境はWifi化などのネットワーク環境構築が面倒なことに加え、プロキシを設定しているため、アプリによっては想定した経路で通信してくれないことが問題になります。
VPNと透過型プロキシによる解決
image010.png 中間者攻撃専用のサーバを構築し、VPN接続と透過型プロキシを構成することで、開発用PC周辺でのネットワークを複雑にすることなく、環境の構築ができます。
まず、iPhoneからVPN接続を確立し、その経路でインターネット接続できるサーバ環境を構築します。L2TPを使用したVPN環境はstrongSwanで比較的簡単に構築が可能です。
iPhoneからの通信はサーバからそのままインターネットに回さず、下記のようなiptables設定により、中間者攻撃用のソフトウェアにリダイレクトさせます。(SSHなどで使うポートを塞がないため、80番以降としています。)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --dport 80:65535 --to-port 8080
これによりVPNを確立した手元のiPhoneからの通信は、すべてサーバへ向かい、サーバ上で中間者攻撃用のソフトウェアを経由したあと、インターネットへと出て行く環境が構築可能です。
CloudFormationテンプレート
もともと環境構築の煩雑さを解消することが目的ですので、この環境を簡単に構築できるCloudFormation用テンプレートを作成しました。これにより、30秒程度の作業と、3分ほどの待ち時間で上記の環境構築が可能です https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/new?stackName=mitm-vpn&templateURL=https:%2F%2Fs3-ap-northeast-1.amazonaws.com%2Fmichitomo-cloudformation-templates%2Fmitm.json

image011.png 上記リンクをクリックすると、CloudFormationのテンプレート選択画面が表示されます。テンプレートURLが入力済みの状態になっているはずですので、そのままNextをクリックします。すでに同じ名前のスタックが存在する場合(このテンプレートを使ってVPNサーバを複数立てようとする場合)には、Stackの名前を変更してください。標準では東京リージョンにとなっていますが、それ以外のリージョンを経由させたい場合は変更が可能です。
image012.png Parametersの設定ではKeyNameが必須項目です。手元にあるEC2用のキーを選択してください。(EC2でSSHログインできる環境が必須)
InstanceTypeはt1.microでも実行可能ですが、mitmproxyをCUIで実行して通信内容を見る場合、ある程度のメモリ領域があったほうが安心なのでm1.smallをおすすめしています。m1.small(RAM 1.7GB)では1時間6〜8円程度のコストがかかります。mitmdumpによるダンプを見るだけならt1.microでも問題ありません。もしストリーミングアプリの解析など、通信料が多くなる可能性がある場合、より大きなインスタンスも選べます。(なお、CloudFormationでVPCを組むのが面倒なため、現在のところ旧世代インスタンスのみの対応となっています。)
SSHLocationにはSSH接続を許可するIPアドレスを入力できます。セキュリティを高めたい場合は指定できますが、鍵認証なので基本的にはどこからでもSSH接続可能な設定の、デフォルト値のままで問題ありません。
VPNPassword欄に入れる値が、iPhoneでVPN接続する際のパスワードになります。同様に、VPNSecretがシークレット、VPNUserがユーザ名です。変更しなくても良いですが、そのままだと長いと感じられる場合、短くしても問題ありません。(使用中は通信内容を監視し、使用後はすぐに終了する運用を想定していますし…。)これらの値は後でコンソールから見えてしまうので、普段使っているパスワードは設定しないでください。
image013.png 次ページのOptionsで設定できる項目は特にありませんので、そのままNextを押します。
最後まで進むとStackの作成が始まります。CREATE_IN_PROGRESSがCREATE_COMPLETEになったら、画面下部に3つ並んでいるアイコンの真ん中のものをクリックします。
image014.png
image015.png
image016.png
image017.png OutputsタブのPublicIPを確認します。なお、実際にインスタンス側の設定が完了するまで、この画面が出てからさらに1分ほどかかります。
image019.jpg 続いて、画面に出ている設定情報を元に、iPhoneのVPNを画像のように設定します。
設定が完了したら、VPN接続が可能です。前述したとおり、このVPNはSSL通信をすべて中間者攻撃により傍受しているため、このままのだと証明書エラーが発生します。
iPhoneでmitm.itへアクセスします。mitm.itの接続先は今起動したmitmproxyとなっており、Appleをクリックすることで起動時に自動生成された認証局の証明書をインストールすることができます。証明書に関する警告が出るので、内容を確認してインストールを完了させてください。
この状態で、VPNサーバのインスタンスにSSH接続します。
$ ssh -i key.pem ubuntu@54.168.117.39
接続後、/tmp/dumpにある通信内容のダンプから解析が可能です。
$ tail -f /tmp/dump
mitmproxyによるCUIの利用
上記まででmitmdumpによるデータの傍受を行えましたが、データが多く見づらかったり、gzipされているものはコンソールで圧縮されたものしか見ることができなかったり、多少不都合です。解析も同時に行う場合、mitmdumpを止め、mitmproxyを利用することで、多少使いやすくなります。
まず、サーバ側のコンソールでmitmdumpを停止させます。
$ sudo killall mitmdump
続いて、mitmproxyを透過型プロキシモードで起動します。
$ mitmproxy -T
この時、サーバ側のオレオレ認証局証明書が再生成されるため、再度mitm.itへアクセスし、認証局証明書のインストールを行ってください。
もともとmitmdumpを使用する必要が無い場合、最初の証明書インストールは行わず、mitmdump停止とmitmproxyの起動後、iPhone側の設定を行うことも可能です。
使った後はシャットダウン
当然ながらAWSでは停止まで料金が発生し続けますので、使用後は忘れずにStackをDeleteします。CloudFormation Managerから、先ほどのStackをチェックし、Delete Stackをクリックすると、Stackと関連するインスタンスが停止され、以後料金が発生しなくなります。
補足
image022.jpg ちなみに、ChromeではSSL証明書検証が行われ、サイトを表示することができません。よく出来てますね…。
Michitomo - 2015年09月20日 9時00分 | コメント0匹 | トラックバック0羽 | 日記
この記事は | | | |
この記事へのコメント
コメントを書く
お名前:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。