Files
Stella/mitm-redirect-traffic.py
2025-05-15 18:29:54 -04:00

60 lines
2.2 KiB
Python

from mitmproxy import http, dns
import ipaddress
import logging
API_HOST = "localhost"
# 198.51.100.0/24 subnet reserved for documentation, so it will never be used for anything else
#We can black-hole this address because it will be discarded.
API_DNS_REDIRECT_HOST = ipaddress.IPv4Address("198.51.100.140")
DNS_TTL= 600
API_PORT = 8000
API_SCHEME = 'http'
MAGIC_DOMAIN_SUFFIX = ".mitm.it"
prefixes = ["/openapi", "/infodesk", "", '/patch']
# hostname: prefix_index
hosts = {
# openapi
"openapi-zinny3.game.kakao.com": 0,
"gc-openapi-zinny3.kakaogames.com": 0,
# infodesk
"gc-infodesk-zinny3.kakaogames.com": 1,
# na server
"na.wdfp.kakaogames.com": 2,
# patch
"patch.wdfp.kakaogames.com": 3
}
def dns_request(flow: dns.DNSFlow):
if not flow.request.query or flow.request.questions is None: return
logging.info(f"[INFO] DNS request for {flow.request.questions}")
for question in flow.request.questions:
name = question.name
prefix_type = hosts.get(name) if question.type == 1 else None
if prefix_type != None: #Type is 1 when asking for an A record
#logging.info(f"[INFO] Matched DNS request for {question.name}")
flow.response.answers = [answer for answer in flow.response.answers if answer.name != question.name]
domain_redirect = f'{question.name}{MAGIC_DOMAIN_SUFFIX}'
#TODO: Are the CNAME records still useful in this configuration? Might be better to remove them and the host_redirects altogether....
cname_rec = dns.ResourceRecord.CNAME(question.name, domain_redirect, ttl=DNS_TTL)
a_rec = dns.ResourceRecord.A(domain_redirect, API_DNS_REDIRECT_HOST, ttl=DNS_TTL)
flow.response.answers.append(cname_rec)
flow.response.answers.append(a_rec)
logging.info(f"[INFO] Answered with {flow.response.answers}")
def request(flow: http.HTTPFlow):
logging.info(f"[INFO] {flow.request.url}")
prefix_type = hosts.get(flow.request.pretty_host)
if prefix_type != None:
flow.request.host = API_HOST
flow.request.port = API_PORT
flow.request.scheme = API_SCHEME
prefix = prefixes[prefix_type]
if prefix != "":
flow.request.path = f"{prefix}{flow.request.path}"