
Analyse de proxy HTTP pour la rétro-ingénierie de la communication protocolaire
Un proxy d'interception HTTP/HTTPS léger et un outil d'analyse de trafic écrit en Go, avec une interface utilisateur web pour inspecter, filtrer, colorer et annoter le trafic capturé en temps réel.


HTTP Breakout Proxy agit à la fois comme un proxy MITM HTTP et HTTPS et comme un outil de visualisation en direct.
Il capture les requêtes et réponses entre deux composants logiciels, permettant aux développeurs de :
Le proxy intègre une interface utilisateur complète accessible depuis n'importe quel navigateur web moderne, permettant une analyse immédiate et en temps réel sans outils externes.
captures.json (ou un fichier spécifié).status:4 status:5 → surligne les erreurs HTTPurl:/api/ → surligne les requêtes API/\.css$/ → correspondance regex sur l'URLmethod:GET, status:404, header:Content-Type=application/json)/login/)curl (formatée pour le terminal)python requests (représentation JSON propre)httpbreakout -l 127.0.0.1:8080
git clone https://github.com/jbsouthe/http-breakout-proxy.git
cd http-breakout-proxy
go build -o http-breakout-proxy
Cela produit un exécutable unique contenant le proxy compilé et les ressources de l'interface utilisateur embarquée.
# exécution avec les valeurs par défaut (proxy + interface)
./http-breakout-proxy
Par défaut, le binaire écoute sur 127.0.0.1:8080 pour le proxy (et optionnellement l'interface — voir les options CLI). Ouvrez l'interface dans un navigateur pour inspecter les captures.
# envoi d'une requête HTTPS via le proxy (le proxy écoute sur 127.0.0.1:8080)
curl -x http://127.0.0.1:8080 https://example.com
Le trafic capturé apparaîtra dans l'interface web.
| Indicateur | Valeur par défaut | Description |
|---|---|---|
-l | 127.0.0.1:8080 | Adresse d'écoute pour le proxy ainsi que l'interface utilisateur. |
-mitm | true | Active le mode d'interception Homme du Milieu (MITM) HTTPS (génère une autorité de certification locale pour intercepter TLS). |
-ca | ./ca | Répertoire dans lequel le certificat et la clé de l'autorité de certification générée sont stockés lorsque MITM est activé et la persistance choisie. |
-f | ./captures.json | Chemin ou répertoire optionnel pour persister les captures sur le disque (par exemple ./captures.json). |
-max-body | 1048576 | Nombre maximal d'octets (par corps) à stocker/afficher ; les corps plus volumineux sont tronqués avec un indicateur. |
-buffer-size | 1000 | Capacité du tampon circulaire pour les captures en mémoire. |
-v | false | Active la journalisation détaillée pour le débogage. |
Utilisez
./http-breakout-proxy -hpour lister les options disponibles et les descriptions d'utilisation.
L'interface est optimisée pour les flux de travail d'investigation.
METHODE URL [STATUS] mais un nom personnalisé peut être attribué.curl, copier en tant que requests Python, télécharger le corps de la réponse, renommer, supprimer.method:, status:, host:, url:, body:, req.body:, resp.body:, header:, req.header:, resp.header:./motif/drapeaux (par exemple /bearer\\s+\\S+/i).header:nom=valeur où nom ou valeur peuvent être des regex.Exemples :
method:POST status:2 host:api.example.com/token\\s*[:=]\\s*\\S+/ireq.header:authorization=/bearer/ibody:/\\"success\\"\\s*:\\s*true/iLorsque le mode Homme du Milieu est activé :
-ca (par défaut ./ca).ca.pem ou similaire) au magasin de confiance du client (ou du système) émettant les requêtes. Sur de nombreuses plateformes, cela nécessite des privilèges administratifs.Note de sécurité : Installez l'autorité de certification uniquement dans des environnements contrôlés. Ne faites pas confiance à cette autorité de certification dans des systèmes où vous lisez du trafic sensible non lié.
Si la persistance est activée (via -f ou un chemin configuré) :
captures.json).Les éléments capturés sont sérialisés en JSON et contiennent les champs suivants (liste non exhaustive) :
id — identifiant unique de séquencetime — horodatage (ISO 8601)method, urlrequest_headers, response_headersrequest_body, response_body — tronqués à -max-body si nécessaireresponse_status, duration_msname — étiquette utilisateur optionnellenotes, deleted — métadonnées de contrôle pour les événements SSE et l'état de l'interfacecurl sécurisée pour le shell, incluant les en-têtes et le corps (omet les en-têtes saut-par-saut).requests avec url, headers, et éventuellement data.Content-Type lorsque c'est possible.Considérations de conception :
Host, Content-Length, Connection) sont omis des commandes de relecture générées.GET /api/captures — lister les captures (tableau JSON).DELETE /api/captures — effacer toutes les captures.GET /api/captures/{id} — récupérer une capture spécifique.DELETE /api/captures/{id} — supprimer une capture spécifique.PATCH /api/captures/{id} — mettre à jour les métadonnées d'une capture ; exemple de corps : { "name": "Mon étiquette" }.GET /api/pause — renvoie { "paused": true|false }.POST /api/pause — définir l'état de pause ; exemple de corps : { "paused": true }.GET /events — flux d'événements envoyés par le serveur (SSE) pour les notifications de capture en direct et les événements de contrôle.//go:embed ui/* et fs.Sub pour servir les fichiers statiques. Cela produit un artefact déployable unique.Content-Encoding et tente de décompresser les corps gzip et deflate avant l'affichage. Les octets originaux sont conservés pour la transparence du proxy.io.LimitReader pour détecter la troncature et protéger l'utilisation de la mémoire.Modèle de distribution recommandé :
CGO_ENABLED=0, -trimpath, -ldflags "-s -w")..tar.gz pour Unix, .zip pour Windows) et inclure README.md et LICENSE.goreleaser pour automatiser les constructions multiplateformes et les artefacts de version.Exemples de commandes de construction :
# Linux x86_64
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-linux-amd64 .
# macOS (arm64)
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-darwin-arm64 .
[Unit]
Description=HTTP Breakout Proxy
After=network.target
[Service]
ExecStart=/opt/http-breakout-proxy/http-breakout-proxy -l 0.0.0.0:8080
Restart=on-failure
User=proxy
Group=proxy
[Install]
WantedBy=multi-user.target
Créez un plist dans ~/Library/LaunchAgents et chargez-le avec launchctl.
Le corps capturé apparaît comme du charabia binaire
Le corps est compressé (par exemple gzip). Assurez-vous d'exécuter une version qui inclut la décompression automatique ; l'interface affiche le JSON/texte décompressé lorsqu'il est disponible.
Le trafic HTTPS ne s'affiche pas / erreurs de connexion
Le client ne fait pas confiance à l'autorité de certification générée. Installez ca/ca.pem dans le magasin de confiance du client/système et marquez-le comme approuvé pour l'interception TLS.
L'interface affiche une sélection obsolète après avoir effacé les captures
Mettez à niveau vers un client qui efface selectedId lors des événements SSE cleared ou invoquez le point de terminaison GET /api/captures pour rafraîchir l'état.
405 sur DELETE /api/captures
Assurez-vous que le gestionnaire de serveur accepte DELETE pour /api/captures et que vous ne rencontrez pas de problème de barre oblique finale.
Cet outil effectue une interception TLS lorsque le mode MITM est activé. Utilisez-le uniquement dans des environnements contrôlés où vous êtes explicitement autorisé à inspecter le trafic. L'autorité de certification générée est puissante : traitez sa clé privée avec la même confidentialité que toute autre clé privée d'autorité de certification racine. N'installez pas l'autorité de certification dans les magasins de confiance partagés ou de production.
Les contributions sont les bienvenues. Veuillez ouvrir des tickets pour les bogues ou les demandes de fonctionnalités. Pour les contributions de code :
Ce projet est distribué sous la licence MIT. Voir LICENSE pour plus de détails.
Auteur : John Southerland (GitHub : jbsouthe)
Projet : http-breakout-proxy — destiné au débogage, au développement et à l'apprentissage du comportement HTTP.