Open15

モバイルアプリ内の確立したWebソケットのテキスト送受信を、プロキシーで改竄したり遅延させたりしたい

ころむにーころむにー

そういうことができるツールがあるか探す。

CharlesはWebソケットのテキスト送受信を傍受することはできるが、改ざんや遅延は出来なさそう。

ころむにーころむにー

Androidの WebSocketClient がCharlesのSOCKSプロキシモードのみで通信傍受できるが、それ以外で全くできない。iOSは普通にできるので、プロトコルが対応していないのか?

AndroidのWebソケットライブラリをOkHttpに変更すると、CharlesのHTTPモードやmitmproxyのHTTPモードなどで通信傍受できた。

Androidアプリのコード

https://github.com/shotaIDE/web-socket-test/commit/9b1f1ed60d1da8cabcdb03fb8c7376773bda64e4

ころむにーころむにー

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起動中でも上書き保存すれば即時反映される。