mitmproxy

Proxy HTTP interactif interceptant le SSL, avec scripting Python. Inspecter, modifier, rejouer et scripter le trafic HTTP/HTTPS via terminal, interface web ou API Python. Interactive SSL-capable intercepting HTTP proxy with Python scripting. Inspect, modify, replay, and script HTTP/HTTPS traffic via terminal, web UI, or Python API.

↗ https://mitmproxy.org

Overview

mitmproxy is an open-source HTTPS proxy with three interfaces: mitmproxy (interactive TUI), mitmweb (browser-based GUI), and mitmdump (non-interactive, like tcpdump for HTTP). It supports certificate pinning bypass, WebSocket inspection, HTTP/2, and extensive scripting.

Starting mitmproxy

Interactive TUI

mitmproxy

Web GUI (browser-based)

mitmweb

→ Access at: http://127.0.0.1:8081

Non-interactive (dump to terminal)

mitmdump

Specify listen port (default: 8080)

mitmproxy -p 8888

Bind to all interfaces

mitmproxy --listen-host 0.0.0.0

Client Configuration

# Configure browser/device to proxy through 127.0.0.1:8080

# Install CA certificate (for HTTPS interception):
# 1. Browse to http://mitm.it while proxy is running
# 2. Download and install the CA cert for your OS/browser
# Or: use the cert at ~/.mitmproxy/mitmproxy-ca-cert.pem

mitmproxy TUI Keys

q          Quit
f          Set filter
/          Search flows
r          Replay request
e          Edit request/response
d          Delete flow
Enter      View flow detail
i          Intercept mode toggle
a          Accept intercepted flow
b          Edit body
h/j/k/l    Navigate

Filters

Filter flows by host

~d target.com

Filter by URL path

~u /api/

Filter by method

~m POST

Filter by status code

~s 200

Filter by body content

~b "password"

Combine filters

~d target.com & ~m POST

Negation

!~d google.com

mitmdump (Scripting & Capture)

Capture all flows to file

mitmdump -w capture.flows

Read and display saved flows

mitmdump -r capture.flows

Filter while dumping

mitmdump -r capture.flows --flow-detail 2

Output request/response bodies

mitmdump -r capture.flows -s show_body.py

Python Scripting

# addon_script.py — intercept and modify traffic
from mitmproxy import http

class Interceptor:
    def request(self, flow: http.HTTPFlow) -> None:
        # Modify request headers
        flow.request.headers["X-Custom"] = "injected"
        
        # Log all POST bodies
        if flow.request.method == "POST":
            print(flow.request.get_text())
    
    def response(self, flow: http.HTTPFlow) -> None:
        # Modify response
        if "password" in flow.response.get_text():
            print(f"[!] Password found in response: {flow.request.url}")

addons = [Interceptor()]
# Run with script
mitmproxy -s addon_script.py
mitmdump -s addon_script.py

Common Use Cases

Strip HSTS headers (prevent forced HTTPS redirect)

mitmdump -s strip_hsts.py

Intercept mobile app traffic 1. Set phone’s proxy to attacker’s IP:8080 2. Install mitmproxy CA cert on phone

mitmproxy --listen-host 0.0.0.0
# SSL kill switch / cert pinning bypass
# Use Frida or objection on the mobile app to disable pinning first

# Replay a request
# In TUI: select flow → r → modify if needed → r again

Tips

  • mitmweb is more user-friendly for beginners than the TUI
  • For mobile apps with certificate pinning, use Frida/objection to bypass pinning first
  • --mode upstream:http://burp:8080 chains mitmproxy before Burp Suite
  • Scripts run as addons — much cleaner than Burp’s Java/Python extender API
Key CLI options
mitmproxy / mitmweb / mitmdump [options]

-p PORT           Listen port (default: 8080)
--listen-host IP  Listen address
-s SCRIPT         Load addon script
-q                Quiet mode
-v                Verbose

SSL:
--ssl-insecure     Skip SSL verification upstream
--cert SPEC        Custom certificate
--modify-headers   Header modification

Modes:
--mode regular    Standard proxy (default)
--mode transparent  Transparent proxy
--mode socks5     SOCKS5 proxy
--mode upstream:URL  Upstream proxy

I/O:
-r FILE           Read saved flows
-w FILE           Write flows to file
--save-stream-file  Save raw stream

Vue d’ensemble

mitmproxy est un proxy HTTPS open source avec trois interfaces : mitmproxy (TUI interactive), mitmweb (interface graphique dans le navigateur) et mitmdump (non interactif, comme tcpdump pour HTTP). Il prend en charge le contournement du certificate pinning, l’inspection des WebSocket, HTTP/2 et un système de scripting complet.

Démarrer mitmproxy

# TUI interactive
mitmproxy

# Interface web (dans le navigateur), accessible sur http://127.0.0.1:8081
mitmweb

# Non interactif (dump dans le terminal)
mitmdump

# Spécifier le port d'écoute (par défaut : 8080)
mitmproxy -p 8888

# Écouter sur toutes les interfaces
mitmproxy --listen-host 0.0.0.0

Configuration du client

# Configurer le navigateur/l'appareil pour utiliser le proxy 127.0.0.1:8080

# Installer le certificat CA (pour l'interception HTTPS) :
# 1. Naviguer vers http://mitm.it pendant que le proxy tourne
# 2. Télécharger et installer le certificat CA pour son OS/navigateur
# Ou : utiliser le certificat situé dans ~/.mitmproxy/mitmproxy-ca-cert.pem

Raccourcis clavier de la TUI mitmproxy

q          Quitter
f          Définir un filtre
/          Rechercher dans les flows
r          Rejouer la requête
e          Modifier la requête/réponse
d          Supprimer le flow
Enter      Voir le détail du flow
i          Basculer le mode interception
a          Accepter le flow intercepté
b          Modifier le corps
h/j/k/l    Navigation

Filtres

# Filtrer les flows par hôte
~d target.com

# Filtrer par chemin d'URL
~u /api/

# Filtrer par méthode
~m POST

# Filtrer par code de statut
~s 200

# Filtrer par contenu du corps
~b "password"

# Combiner des filtres
~d target.com & ~m POST

# Négation
!~d google.com

mitmdump (scripting et capture)

# Capturer tous les flows dans un fichier
mitmdump -w capture.flows

# Lire et afficher les flows sauvegardés
mitmdump -r capture.flows

# Filtrer pendant le dump
mitmdump -r capture.flows --flow-detail 2

# Afficher les corps de requêtes/réponses
mitmdump -r capture.flows -s show_body.py

Scripting Python

# addon_script.py : intercepte et modifie le trafic
from mitmproxy import http

class Interceptor:
    def request(self, flow: http.HTTPFlow) -> None:
        # Modifier les en-têtes de la requête
        flow.request.headers["X-Custom"] = "injected"
        
        # Journaliser tous les corps des requêtes POST
        if flow.request.method == "POST":
            print(flow.request.get_text())
    
    def response(self, flow: http.HTTPFlow) -> None:
        # Modifier la réponse
        if "password" in flow.response.get_text():
            print(f"[!] Password found in response: {flow.request.url}")

addons = [Interceptor()]
# Lancer avec le script
mitmproxy -s addon_script.py
mitmdump -s addon_script.py

Cas d’usage courants

# Supprimer les en-têtes HSTS (empêcher la redirection forcée en HTTPS)
mitmdump -s strip_hsts.py

# Intercepter le trafic d'une application mobile :
# 1. Configurer le proxy du téléphone sur l'IP:port de l'attaquant
# 2. Installer le certificat CA mitmproxy sur le téléphone
mitmproxy --listen-host 0.0.0.0

# SSL kill switch / contournement du cert pinning
# Utiliser Frida ou objection sur l'application mobile pour désactiver le pinning au préalable

# Rejouer une requête
# Dans la TUI : sélectionner le flow → r → modifier si besoin → r à nouveau

Conseils

  • mitmweb est plus accessible pour les débutants que la TUI
  • Pour les applications mobiles avec certificate pinning, utiliser Frida/objection pour contourner le pinning au préalable
  • --mode upstream:http://burp:8080 chaîne mitmproxy avant Burp Suite
  • Les scripts s’exécutent en tant qu’addons, bien plus propre que l’API extender Java/Python de Burp
Options CLI principales
mitmproxy / mitmweb / mitmdump [options]

-p PORT           Listen port (default: 8080)
--listen-host IP  Listen address
-s SCRIPT         Load addon script
-q                Quiet mode
-v                Verbose

SSL:
--ssl-insecure     Skip SSL verification upstream
--cert SPEC        Custom certificate
--modify-headers   Header modification

Modes:
--mode regular    Standard proxy (default)
--mode transparent  Transparent proxy
--mode socks5     SOCKS5 proxy
--mode upstream:URL  Upstream proxy

I/O:
-r FILE           Read saved flows
-w FILE           Write flows to file
--save-stream-file  Save raw stream