Python addon Mimproxyにバインド


概要


シリーズの前半では、MimproxyがPythonコードと一緒に実行できるのが大きな魅力だと説明していました.今回はpythonを使用してCustom Addonを作成し、Mimproxyにバインドしてみました.

Pythonを使用してAddonコードを記述


テストのためにコードを作成しました.作成されたコードは、HTTP/Sのrequest pathが/bizlog/v1/gateway/reportsと一致する場合、content_listcontent_list_dataの値がコンソールログに書き込まれる.
# mitmproxy_test/main.py
import json

from mitmproxy import ctx


def byte_to_json(byte):
    """ byte 응답을 json 형태로 변환 """
    fix_byte_value = byte.replace(b"'", b'"')
    convert_json = json.loads(fix_byte_value)
    return convert_json


class LogCheck:

    def __init__(self):
        pass

    def request(self, flow):
        """ requset header의 path가 bizlog 일 때 컨텐트 출력 """

        if flow.request.path == "/bizlog/v1/gateway/reports":
            payload = flow.request.content # 바이트
            convert_payload = byte_to_json(payload) # 배열

            i = 0
            while i < len(convert_payload):
                a = json.loads(convert_payload[i])

                content_list = ["screen_name", "event_type", "event_name"]
                content_list_data = ["ref_url", "item_kind", "item_name", "item_id"]

                for b in content_list:
                    if b in a:
                        ctx.log.info("                " + str(b) + " : " + a[b])
                    else:
                        pass

                for c in content_list_data:
                    if c in a["data"]:
                        ctx.log.info("                    " + str(c) + " : " + str(a["data"][c]))
                    else:
                        pass

                i = i + 1


addons = [LogCheck()]

クリープ


連動は簡単です.mimporxy実行命令で-sオプションを使用してPythonコードパスを渡すだけです.
# 파이썬 연동하여 실행
$ mitmproxy -s /Users/taekyeong.jung/PycharmProjects/mitmproxy_test/main.py --set block_global=false

検査結果


下に添付された画像から、Python Custom AddonでMimproxyコンソールで撮影したログがよく撮れていることがわかります.(Mimporxyに:console.view.eventlogと入力するとコンソールログが表示されます.)
このように、MimproxyはPythonコードを使ってリクエストやレスポンスを勝手に変更する機能を超えて、さまざまな用途に使用できます.