---
title: mitmproxy
description: "Intercepter, modifier et rejouer le trafic HTTP(S) avec le proxy MITM, en CLI ou en GUI."
category: network
kind: tool
tags: [proxy, tls, interception, http, replay]
level: intermediate
updated: 2026-11-04
order: 3
aliases: ["mitmweb", "intercepting proxy"]
---

## Démarrer

```bash
# Interface TUI
mitmproxy --listen-port 8080

# Interface web sur http://127.0.0.1:8081
mitmweb --listen-port 8080 --web-port 8081

# Écouter sur toutes les interfaces (lab uniquement)
mitmproxy --listen-host 0.0.0.0 --listen-port 8080

# Écrire les flux dans un fichier
mitmproxy -w flows.mitm --listen-port 8080
```

## Router le client

```bash
# curl
curl -x http://127.0.0.1:8080 -k https://target.test

# Variables d'environnement
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080

# Firefox : paramètres réseau → proxy manuel HTTP 127.0.0.1:8080
```

> [!TIP]
> Installe le certificat CA (`~/.mitmproxy/mitmproxy-ca-cert.pem`) sur l'appareil. Sur Android 7+, les certificats utilisateur sont ignorés par les apps : il faut un appareil rooté, un build patché ou Frida pour contourner le pinning.

## Mode transparent (Linux)

```bash
# Rediriger le trafic HTTP/HTTPS vers mitmproxy
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

sudo mitmproxy --mode transparent --listen-port 8080
```

## Interception et filtres

Dans la TUI, `i` active l'interception et ouvre un filtre :

```text
~u /api/           # URL contient /api/
~m POST            # méthode POST
~q                 # requêtes avec paramètres
~d example\.com    # domaine
~t application/json
~s                 # réponses
```

Raccourcis : `Enter` éditer, `a` accepter, `A` accepter tout, `r` rejouer, `e` éditer, `/` filtrer la vue, `f` suivre un flux, `z` vider.

## Rejouer et modifier

```bash
# Rejouer un fichier de flux
mitmproxy -r flows.mitm

# Replay serveur (réponses en cache, utile hors ligne)
mitmproxy --server-replay flows.mitm --server-replay-kill-extra

# Modifier une requête avec un script
mitmproxy -s tamper.py
```

```python
# tamper.py — ajoute un header et remplace une valeur
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    if "api.target.test" in flow.request.pretty_host:
        flow.request.headers["X-Forwarded-For"] = "127.0.0.1"
        if "role=user" in flow.request.get_text():
            flow.request.set_text(flow.request.get_text().replace("role=user", "role=admin"))
```

## Bonnes pratiques

- Utilise un profil navigateur dédié : les cookies de production n'ont rien à faire dans le proxy.
- `--set connection_strategy=lazy` aide avec les serveurs qui ferment les connexions.
- `--ignore-hosts` évite d'intercepter les domaines de télémétrie.
- Pour les WebSockets, mitmproxy les affiche comme des flux `websocket` : inspecte les frames avec `e`.

> [!WARNING]
> Un proxy MITM casse le certificat de nombreux clients (pinning, mTLS, QUIC). Si l'application refuse la connexion, vérifie d'abord le pinning avant de conclure à un bug réseau.
