135 lines
3.9 KiB
Python
135 lines
3.9 KiB
Python
from models.example import AddonExampleDocument
|
|
|
|
DOCS_EXAMPLES_URL = "https://docs.mitmproxy.org/stable/addons/examples/"
|
|
|
|
BUILTIN_EXAMPLES = [
|
|
AddonExampleDocument(
|
|
id="http-add-response-header",
|
|
name="HTTP add response header",
|
|
description=(
|
|
"Injects a fixed response header on every HTTP response so you can "
|
|
"verify that traffic is passing through the proxy response path."
|
|
),
|
|
category="http",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""from mitmproxy import http
|
|
|
|
|
|
def response(flow: http.HTTPFlow) -> None:
|
|
flow.response.headers["x-theplug"] = "enabled"
|
|
""",
|
|
),
|
|
AddonExampleDocument(
|
|
id="http-modify-query",
|
|
name="HTTP modify query",
|
|
description=(
|
|
"Adds or overwrites a query parameter before each request is "
|
|
"forwarded upstream. Useful for forced debug or feature flags."
|
|
),
|
|
category="http",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""from mitmproxy import http
|
|
|
|
|
|
def request(flow: http.HTTPFlow) -> None:
|
|
flow.request.query["debug"] = "1"
|
|
""",
|
|
),
|
|
AddonExampleDocument(
|
|
id="http-reply-from-proxy",
|
|
name="HTTP reply from proxy",
|
|
description=(
|
|
"Serves a local HTTP response for a selected path without touching "
|
|
"the upstream service. Useful for probes, maintenance, or stubs."
|
|
),
|
|
category="http",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""from mitmproxy import http
|
|
|
|
|
|
def request(flow: http.HTTPFlow) -> None:
|
|
if flow.request.path == "/healthz":
|
|
flow.response = http.Response.make(
|
|
200,
|
|
b"ok",
|
|
{"content-type": "text/plain"},
|
|
)
|
|
""",
|
|
),
|
|
AddonExampleDocument(
|
|
id="websocket-rewrite",
|
|
name="WebSocket rewrite",
|
|
description=(
|
|
"Rewrites matching bytes inside live WebSocket frames to alter "
|
|
"runtime flags or payload markers in transit."
|
|
),
|
|
category="websocket",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""from mitmproxy import http
|
|
|
|
|
|
def websocket_message(flow: http.HTTPFlow) -> None:
|
|
if flow.websocket is None:
|
|
return
|
|
message = flow.websocket.messages[-1]
|
|
message.content = message.content.replace(b"debug=false", b"debug=true")
|
|
""",
|
|
),
|
|
AddonExampleDocument(
|
|
id="tcp-log-messages",
|
|
name="TCP log messages",
|
|
description=(
|
|
"Logs raw TCP message direction and size for each frame so you can "
|
|
"observe binary traffic without altering it."
|
|
),
|
|
category="tcp",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""import logging
|
|
|
|
from mitmproxy import tcp
|
|
|
|
|
|
def tcp_message(flow: tcp.TCPFlow) -> None:
|
|
message = flow.messages[-1]
|
|
direction = "client" if message.from_client else "server"
|
|
logging.info("%s sent %d bytes", direction, len(message.content))
|
|
""",
|
|
),
|
|
AddonExampleDocument(
|
|
id="dns-spoof-a-record",
|
|
name="DNS spoof A record",
|
|
description=(
|
|
"Overrides one DNS A record while forwarding every other query "
|
|
"unchanged. Useful for selective service redirection."
|
|
),
|
|
category="dns",
|
|
source_url=DOCS_EXAMPLES_URL,
|
|
built_in=True,
|
|
code="""import ipaddress
|
|
|
|
from mitmproxy import dns
|
|
|
|
|
|
def dns_request(flow: dns.DNSFlow) -> None:
|
|
question = flow.request.question
|
|
if question and question.name == "target.local" and question.type == dns.types.A:
|
|
flow.response = flow.request.succeed(
|
|
[
|
|
dns.ResourceRecord(
|
|
name="target.local",
|
|
type=dns.types.A,
|
|
class_=dns.classes.IN,
|
|
ttl=60,
|
|
data=ipaddress.ip_address("127.0.0.1").packed,
|
|
)
|
|
]
|
|
)
|
|
""",
|
|
),
|
|
]
|