시리즈 초반부에 mitmproxy은 python 코드와 함께 실행 가능한 것이 매우 큰 매력이라고 서술한 적이 있었다. 이번에는 python으로 Custom Addon을 만들고 mitmproxy에 연동해 보려 한다.
테스트를 위해 하나의 코드를 작성해 보았다. 작성한 코드는 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()]
연동은 간단하다. 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 등을 임의로 변경하는 것을 넘어서 매우 다양한 용도로 활용이 가능할 듯하다.