スマホからの接続に使えるhttps対応プロキシmitmproxy(mitmdump)の設定

ALL
スポンサーリンク

https対応プロキシでは、通信内容のチェックのために一旦暗号化を解除して内容チェックし、 プロキシサーバ用に用意した証明書で再暗号化をしますが、一部のアプリでは、ピン留め/Pinningと呼ばれる、アプリが規定した証明書でしか受け付けない動作をするものがあり、プロキシサーバの再暗号化で使用した証明書ではエラーとなります。

プロキシでhttps通信内容をチェックする場合、Androidアプリで動作できないものがある | パソコン鳥のブログ

このようなアプリのhttps通信はプロキシサーバで処理させず、そのままスルーさせる必要があります。
証明書はドメイン単位なので、アプリで規定しているドメインを事前に調べてプロキシ処理の除外リストに加えればいいのですが、実質難しいです。

mitmdump ( mitmproxy のコマンドラインインタフェースです )の場合は本記事の方法で自動化できます。アプリが行うTLS通信でのエラーを検出するとプロキシサーバで処理させず、そのままスルーして https通信をやり直し、2回目以降は プロキシサーバ で処理せずに、そのままダイレクトに通信させます。

ここでは、CentOSを対象に、次のサイトで説明されている画像圧縮処理に、 上記の処理を加えてみます。

mitmproxyでhttps対応Data Compression Proxyを作る – Qiita

スポンサーリンク

サーバーでの準備

必要パッケージをインストールします。

yum -y groupinstall "Development Tools"
yum -y install python3
yum -y install zlib-devel libjpeg-devel python3-devel python3-pip libwebp-devel

ディレクトリ /opt/mitmproxy を作成し、その下に mitmdump をインストールします。
Virtualenv 環境で設定し、既存環境には影響しないようにします。

mkdir /opt/mitmproxy
pip3 install virtualenv
/usr/local/bin/virtualenv -p python3.6 /opt/mitmproxy/env
. /opt/mitmproxy/env/bin/activate
pip3 install --upgrade pip
CC="cc -mavx2" pip3 install -U --force-reinstall pillow-simd --global-option="build_ext" --global-option="--enable-webp"
pip3 install mitmdump
deactivate

tls_passthrough.py をダウンロードします。
このスクリプトによって、 アプリでのTLS通信のエラーを検出すると、プロキシサーバで処理させず、そのままスルーして https通信をやり直し、2回目以降はプロキシサーバ で処理せずに、そのままダイレクトに通信させます。

cd /opt/mitmproxy
wget https://raw.githubusercontent.com/mitmproxy/mitmproxy/main/examples/contrib/tls_passthrough.py

tls_passthrough.py の末尾に、mitmproxyでhttps対応Data Compression Proxyを作る – Qiita の flows.py の中身を追加します。

サーバーでmitmdump の実行

mitmdump を実行します。
下記2行を実行してください。
8081 は待ち受けポート番号です。サーバのファイアウォールでこのポート番号の接続を許可しておいてください。

killall -9 mitmdump
/opt/mitmproxy/env/bin/mitmdump --listen-port 8081 --ssl-insecure --set stream_large_bodies=10m --set flow_detail=1 --se
t http2=false --showhost --rawtcp --set block_global=false -s tls_passthrough.py > /opt/
mitmproxy/mitmdump.log &

上記では、プロキシ認証も無しにプロキシ接続できます。
Androidスマホのプロキシ設定の箇所では、認証用のユーザ名・パスワードを設定できないので、プロキシ認証を使えない為です。
このままではグローバルネットワークからアクセス可能なので、可能ならサーバーへVPN経由等で接続するほうが安全です。

VPNサーバの設定については、下記を参照してください。
CentOS8でVPN(L2TP/IPsec)サーバの設定(strongswan使用) | パソコン鳥のブログ
VPN(L2TP/IPsec)サーバの設定(strongswan使用) | パソコン鳥のブログ

VPN経由の場合は、 mitmdump を次のように実行します。
透過型プロキシとして動作します。

killall -9 mitmdump
/opt/mitmproxy/env/bin/mitmdump --listen-port 8081 --ssl-insecure --set stream_large_bodies=10m --set flow_detail=1 --set http2=false --showhost --rawtcp --set block_global=true --mode transparent -s tls_passthrough.py > /opt/mitmproxy/mitmdump.log &

また、iptablesで次のようにWEB通信( 80,443番ポート)を 8081番( mitmdump で指定したポート番号)に転送します。
192.168.11.0/24 の部分は、VPNサーバの設定に合わせて修正してください。

iptables -t nat -A PREROUTING -s 192.168.11.0/24 -p tcp -m multiport --dport 80,443 -j REDIRECT --to-port 8081

クライアント(PC/スマホ)での準備

クライアント のスマホ/PCで、プロキシ接続できるように設定してください。
サーバに mitmdump を実行したサーバ・ポート番号を指定します。
または、先の手順「 サーバーでmitmdump の実行 」で、 VPN経由の場合 の設定を行った場合は、 スマホ/PCで プロキシサーバへの接続は行わずに、VPNに接続します。VPN接続後は、 プロキシサーバ mitmdump を経由して通信します。

プロキシ設定またはVPN接続ができたら、http://mitm.it/ にアクセスします。

「If you can see this, traffic is not passing through mitmproxy.」と表示された場合は、mitmdumpにアクセスできていません。
プロキシ設定またはVPN接続できているか、確認してください。

正しくアクセスできれば、次の画面になります。
緑色の箇所のボタンを押して、mitmproxy(mitmdump)で使用する証明書をインポートしてください。

クライアント(PC/スマホ)からの接続(動作確認)

次のページにアクセスして動作確認します。

https://horobi.com/Saiteika/

うまく動作していれば、

NG : 「最適化」されているようです… ダウンロードしたJPEG画像データは元データと一致しませんでした。

と表示されます。

「 サーバーでの準備 」の手順で、 tls_passthrough.py の末尾に追加した mitmproxyでhttps対応Data Compression Proxyを作る – Qiita の flows.py の処理によって画像が圧縮されているので、画像の圧縮率が表示されます。
わたしの環境では16%ほどになりました。

注意事項

rootkit検知ツール chkrootkit を導入している場合、Linux.Xor.DDoS の感染を誤検知します。
tls_passthrough.py が /tmp下に実行可能形式のファイルを生成しますが、chkrootkit は/tmp 下の実行可能形式のファイルを無条件に Linux.Xor.DDoS として検出しますので、 誤検知となります。

chkrootkit の Linux.Xor.DDoS誤検知 | パソコン鳥のブログ

参考

mitmproxy & python – ignore all hosts with https/ssl – Stack Overflow
mitmproxy&python-https / sslを持つすべてのホストを無視します – Kejisen
mitmproxyでhttps対応Data Compression Proxyを作る – Qiita

コメント