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.orgOverview
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
mitmwebis 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:8080chains 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
mitmwebest 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:8080chaî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