モバイルアプリ内の確立したWebソケットのテキスト送受信を、プロキシーで改竄したり遅延させたりしたい
そういうことができるツールがあるか探す。
CharlesはWebソケットのテキスト送受信を傍受することはできるが、改ざんや遅延は出来なさそう。
Burp Suiteというセキュリティのツールがありできそうな気配がしたが、Webサイト専用ツールだった。
Proxyman Appはそういう機能がまだ実装されていなさそう。
mitmproxyというツールはスクリプトによりできるかもしれない。試してみる
mitmproxyはアドオン機能で結構簡単にリクエストの改ざんができそう。
mitmproxy、若干プロキシーとしての動作速度が遅いかな・・・?
類似ツールで参考になるページ
AndroidのWebソケットをmitmproxyに通すことができず、一旦挫折
mitmproxyのHTTPS通信を傍受するための証明書等。
FiddlerでWebソケット通信を傍受する方法。
Androidの WebSocketClient
がCharlesのSOCKSプロキシモードのみで通信傍受できるが、それ以外で全くできない。iOSは普通にできるので、プロトコルが対応していないのか?
以下あたりが参考になるかもしれない
Androidの WebSocketClient がCharlesのSOCKSプロキシモードのみで通信傍受できるが、それ以外で全くできない。iOSは普通にできるので、プロトコルが対応していないのか?
AndroidのWebソケットライブラリをOkHttpに変更すると、CharlesのHTTPモードやmitmproxyのHTTPモードなどで通信傍受できた。
Androidアプリのコード
Webソケットにおけるサーバーからの応答を遅延させるスクリプトは以下が成功した。
import asyncio
import logging
from mitmproxy import http
from mitmproxy import ctx
async def websocket_message(flow: http.HTTPFlow):
assert flow.websocket is not None # make type checker happy
# Get the latest message
latest_message = flow.websocket.messages[-1]
# Was the message sent from the server and response to the client message?
if not latest_message.from_client:
latest_message.drop()
logging.info(f"Delay message from the server for 1 seconds: {latest_message.text}")
# delay response for 1 second
await asyncio.sleep(1)
ctx.master.commands.call(
"inject.websocket", flow, latest_message.from_client, latest_message.text.encode()
)
実行コマンド
mitmproxy -s anatomy.py
logging
の内容を見るには以下が良い。
mitmdump -s anatomy.py
mitmproxyのPythonスクリプトの内容は、mitmproxy起動中でも上書き保存すれば即時反映される。