mitmproxy에 python addon 연동

정태경·2022년 2월 13일
0
post-thumbnail
post-custom-banner

개요

시리즈 초반부에 mitmproxy은 python 코드와 함께 실행 가능한 것이 매우 큰 매력이라고 서술한 적이 있었다. 이번에는 python으로 Custom Addon을 만들고 mitmproxy에 연동해 보려 한다.

Python으로 Addon 코드 작성

테스트를 위해 하나의 코드를 작성해 보았다. 작성한 코드는 HTTP/S의 request path가 /bizlog/v1/gateway/reports와 일치하면 content_list, content_list_data value를 콘솔 로그를 기록하도록 작성하였다.

# 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()]

mitmproxy 연동

연동은 간단하다. mitmporxy 실행 명령어에 -s 옵션으로 파이썬 코드 경로만 넘겨주면 된다.

# 파이썬 연동하여 실행
$ mitmproxy -s /Users/taekyeong.jung/PycharmProjects/mitmproxy_test/main.py --set block_global=false

결과 확인

아래 첨부한 이미지를 보면 mitmproxy 콘솔에 Python Custom Addon을 통해 찍어놓은 로그가 잘 찍히는 것을 볼 수 있다. (mitmporxy에서 :console.view.eventlog를 입력하면 콘솔 로그를 확인할 수 있다.)

이처럼 mitmproxy는 Python 코드와 연동하여 Request, Response 등을 임의로 변경하는 것을 넘어서 매우 다양한 용도로 활용이 가능할 듯하다.

profile
두나무 업비트 QA 엔지니어
post-custom-banner

0개의 댓글