備忘録

備忘録

mitmproxyとarpspoofを利用してスマートフォン(Android/iOS)のHTTP(s)通信を見る方法

Ⅰ. はじめに

タイトルの通り「mitmproxyとarpspoofを利用してスマートフォン(Android/iOS)のHTTP(s)通信を見る方法」です。

Ⅲ. やり方

1. IPフォワードを有効にする
echo 1 > /proc/sys/net/ipv4/ip_forward
2. ルーティングを変更する

HTTP(80), HTTPS(443)にきたパケットを全てmitmproxy(8080)にリダイレクトします。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
3. ARPスプーフィングを行う
ターゲット(スマートフォン 192.168.0.7
デフォルトゲートウェイ 192.168.0.1

この環境の場合以下のコマンドになります。

arpspoof -t 192.168.0.7 192.168.0.1
4. mitmproxyを透過型として起動する
mitmproxy -T --host --ignore 'crashlytics\.com:443'
5. ルート証明書(mitmproxy-ca-cert.pem)をスマートフォンにインストールする

http://mitm.it にアクセスするとルート証明書のインストール画面が表示されます。

6. ログがmitmproxyの画面に表示される


Ⅳ. Android 7以降について

Android 7(Nougat)以降はセキュリティの為ユーザが任意でインストールした証明書がデフォルトで読み込まれなくなりました。

自作アプリケーションの場合

android:networkSecurityConfig をAndroidManifest.xml で設定するとユーザの証明書が読み込まれるようになります。

その他アプリケーションの場合

APKを逆コンパイルし、AndroidManifest.xmlに変更を加える事でユーザの証明書が読み込まれるようになります。
また、root権限が使える場合は以下のコマンドを実行する事によりユーザー証明書ではなくシステム証明書として認識させる事で回避可能です。

cp /data/misc/user/0/cacerts-added/* /system/etc/security/cacerts/

また、これを自動化したMagisk用モジュールが公開されています。
https://github.com/NVISO-BE/MagiskTrustUserCerts

※Magiskモジュールに関する注意点
Magisk Hide使用時は本記事のようなMITMとして利用する場合期待する動作になりません。
手動でシステム証明書として認識させる事を推奨します。
Magiskモジュールは以下のようにMagiskの特殊な領域に証明書をコピーしています。

# https://github.com/NVISOsecurity/MagiskTrustUserCerts/blob/9c8b955e4b91237becb9ee3b15c15ce5ead97e8e/post-fs-data.sh#L8
cp -f /data/misc/user/0/cacerts-added/* $MODDIR/system/etc/security/cacerts/

実際の/system/etc/security/cacerts/にはコピーされていない為Magisk Hide有効時はルート証明書が期待する形で読み取られません。

その他

Proxy設定
adb shell settings put global http_proxy 192.168.0.2:8008
Proxy設定解除
adb shell settings put global http_proxy :0