
Analisi del proxy HTTP per il reverse engineering delle comunicazioni di protocollo
Un proxy di intercettazione HTTP/HTTPS leggero e strumento di analisi del traffico scritto in Go, con un'interfaccia utente web per ispezionare, filtrare, colorare e annotare il traffico catturato in tempo reale.


HTTP Breakout Proxy funge sia da proxy HTTP e HTTPS MITM che da strumento di visualizzazione dal vivo.
Cattura richieste e risposte tra due componenti software, consentendo agli sviluppatori di:
Il proxy incorpora un'interfaccia utente completa accessibile da qualsiasi browser moderno, consentendo un'analisi immediata e in tempo reale senza strumenti esterni.
captures.json (o file specificato).status:4 status:5 → evidenzia errori HTTPurl:/api/ → evidenzia richieste API/\.css$/ → corrispondenza regex sull'URLmethod:GET, status:404, header:Content-Type=application/json)/login/)curl (formattato per terminale)python requests (rappresentazione JSON pulita)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
Questo produce un singolo eseguibile contenente il proxy compilato e le risorse dell'interfaccia utente incorporate.
# esegui con impostazioni predefinite (proxy + UI)
./http-breakout-proxy
Di default il binario si collega a 127.0.0.1:8080 per il proxy (e opzionalmente UI — vedere i flag CLI). Apri l'interfaccia utente in un browser per ispezionare le catture.
# invia una richiesta HTTPS tramite il proxy (il proxy ascolta su 127.0.0.1:8080)
curl -x http://127.0.0.1:8080 https://example.com
Il traffico catturato apparirà nell'interfaccia web.
| Flag | Predefinito | Descrizione |
|---|---|---|
-l | 127.0.0.1:8080 | Indirizzo su cui il proxy ascolta, oltre che per l'app UI. |
-mitm | true | Abilita la modalità di intercettazione HTTPS Man In The Middle (MITM) (genera una CA locale per intercettare TLS). |
-ca | ./ca | Directory in cui vengono memorizzati il certificato CA e la chiave generati quando MITM è abilitato e la persistenza è scelta. |
-f | ./captures.json | Percorso o directory opzionale per persistere le catture su disco (ad es., ./captures.json). |
-max-body | 1048576 | Numero massimo di byte (per corpo) da memorizzare/visualizzare; corpi più grandi vengono troncati con un segnaposto. |
-buffer-size | 1000 | Capacità del buffer circolare per le catture in memoria. |
-v | false | Abilita log dettagliati per debug. |
Usa
./http-breakout-proxy -hper elencare i flag disponibili e le descrizioni di utilizzo.
L'UI è ottimizzata per flussi di lavoro investigativi.
METHOD URL [STATUS] ma è possibile assegnare un nome personalizzato.curl, copia come Python requests, scarica corpo risposta, rinomina, elimina.method:, status:, host:, url:, body:, req.body:, resp.body:, header:, req.header:, resp.header:./pattern/flags (ad esempio /bearer\\s+\\S+/i).header:name=value dove name o value possono essere regex.Esempi:
method:POST status:2 host:api.example.com/token\\s*[:=]\\s*\\S+/ireq.header:authorization=/bearer/ibody:/\\"success\\"\\s*:\\s*true/iQuando la modalità Man In The Middle è abilitata:
-ca (default ./ca).ca.pem o simile) al trust store del client (o del sistema) che effettua le richieste. Su molte piattaforme ciò richiede privilegi amministrativi.Nota di sicurezza: Installare la CA solo in ambienti controllati. Non fidarsi di questa CA in sistemi in cui si legge traffico sensibile non correlato.
Se la persistenza è abilitata (tramite -f o percorso configurato):
captures.json).Gli elementi catturati vengono serializzati in JSON e contengono i seguenti campi (non esaustivi):
id — identificatore univoco di sequenzatime — timestamp (ISO 8601)method, urlrequest_headers, response_headersrequest_body, response_body — troncato a -max-body se necessarioresponse_status, duration_msname — etichetta utente opzionalenotes, deleted — metadati di controllo per eventi SSE e stato UIcurl sicuro per la shell includendo header e corpo (omette header hop-by-hop).requests con url, headers e data opzionale.Content-Type quando possibile.Considerazioni di progettazione:
Host, Content-Length, Connection) vengono omessi dai comandi di replay generati.GET /api/captures — elenca catture (array JSON).DELETE /api/captures — cancella tutte le catture.GET /api/captures/{id} — recupera una singola cattura.DELETE /api/captures/{id} — elimina una cattura specifica.PATCH /api/captures/{id} — aggiorna metadati della cattura; esempio corpo: { "name": "My label" }.GET /api/pause — restituisce { "paused": true|false }.POST /api/pause — imposta stato pausa; esempio corpo: { "paused": true }.GET /events — Stream di eventi inviati dal server (SSE) per notifiche di cattura in tempo reale ed eventi di controllo.//go:embed ui/* e fs.Sub per servire file statici. Questo produce un singolo artefatto distribuibile.Content-Encoding e tenta di decomprimere i corpi gzip e deflate prima della visualizzazione. I byte originali vengono mantenuti per la trasparenza del proxy.io.LimitReader per rilevare il troncamento e proteggere l'utilizzo della memoria.Modello di distribuzione consigliato:
CGO_ENABLED=0, -trimpath, -ldflags "-s -w")..tar.gz per Unix, .zip per Windows) e includere README.md e LICENSE.goreleaser per automatizzare build multipiattaforma e artefatti di release.Esempi di comandi di build:
# 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
Creare un plist in ~/Library/LaunchAgents e caricarlo con launchctl.
Il corpo catturato appare come rabbia binaria
Il corpo è compresso (ad es., gzip). Assicurarsi di eseguire una build che includa la decompressione automatica; l'UI mostra JSON/testo decompresso quando disponibile.
Il traffico HTTPS non viene visualizzato / errori di connessione
Il client non si fida della CA generata. Installare ca/ca.pem nel trust store del client/sistema e contrassegnarlo come attendibile per l'intercettazione TLS.
L'UI mostra una selezione obsoleta dopo aver cancellato le catture
Aggiornare a un client che cancelli selectedId sugli eventi SSE cleared o invocare l'endpoint GET /api/captures per aggiornare lo stato.
405 su DELETE /api/captures
Assicurarsi che il gestore del server accetti DELETE per /api/captures e che non si stia colpendo una mancata corrispondenza di slash finale.
Questo strumento esegue l'intercettazione TLS quando MITM è abilitato. Utilizzarlo solo in ambienti controllati in cui si ha esplicita autorizzazione a ispezionare il traffico. La CA generata è potente: trattare la sua chiave privata con la stessa riservatezza di qualsiasi altra chiave privata di CA radice. Non installare la CA in trust store condivisi o di produzione.
I contributi sono benvenuti. Si prega di aprire issue per bug o richieste di funzionalità. Per contributi di codice:
Questo progetto è distribuito sotto la Licenza MIT. Vedi LICENSE per i dettagli.
Autore: John Southerland (GitHub: jbsouthe)
Progetto: http-breakout-proxy — destinato a debug, sviluppo e apprendimento del comportamento HTTP.