先日 iPhone のアプリが https で通信している内容を覗いてみようと HTTP プロキシに OWSAP ZAP を指定して覗いてみました。 OWASP ZAP が動的に証明書を発行してくれるので、その発行元となる CA を iPhone に登録しておけば HTTPS 通信も中身を覗くことができます。(アプリで Certificate Pinning とかされていなければ)
Pinning といえば CAA (Certificate Authority Authorization) っていう DNS レコードもありますね。(余談)
で、今回やりたいことは HTTP に限らず iPhone の通信の中身を覗きたいということです
ルーターとかで packet をキャプチャするとか mirror port を使うとかいう手もありますが、ググってみると mac と Lightling ケーブルで接続すれば簡単に tcpdump や wireshark で覗けるようです
XCode のインストール
rvictl というコマンドを実行する必要があるのですが、これが XCode に含まれているため XCode がインストールされていない場合は Apple のサイト からダウンロードしてインストールします
/Library/Apple/usr/bin/rvictl
にインストールされました
System Integrity Protection (SIP) を無効にする
今回の環境は次の通り
- Intel 版 MacBook Pro (16-inch, 2019)
- macOS Monterey (12.6)
- iPhone SE2 (iOS 16)
この環境では System Integrity Protection とやらを無効にしないと仮想ネットワークデバイスの作成ができませんでした
- mac をリカバリモードで起動する (起動時に
Command + R
) - Utilities メニューから Terminal を起動する
csrutil disable
コマンドを実行- OS 再起動
Disabling and Enabling System Integrity Protection
iPhone の UUID 確認
iPhone を mac と接続したら Finder を開き 場所
にある iPhone を開き、iPhone の名前が表示されている下の部分
iPhone のモデル名とかストレージ容量などが表示されている場所をクリックします、クリックする度に表示内容が切り替わります
UUID が表示されたら二本指タップで UUID をコピー
を選択します
仮想 Network Device を作成する
先ほど確認した UUID を rvictl -s の引数で指定して実行することで
$ rvictl -s 00001234-0123456789ABCDEF
次のように出力されれば成功です
Starting device 00001234-0123456789ABCDEF [SUCCEEDED] with interface rvi0
インターフェースの確認
$ rvictl -l
Current Active Devices:
[1] 00001234-0123456789ABCDEF with interface rvi0
$ ifconfig rvi0
rvi0: flags=3005<UP,DEBUG,LINK0,LINK1> mtu 0
tcpdump で確認
tcpdump で確認できます
sudo tcpdump -i rvi0
仮想 Network Device の削除
rvictl -x 00001234-0123456789ABCDEF
System Integrity Protection (SIP) を有効に戻す
無効にしたのと同じ手順で csrutil enable
を実行する