
Análisis de Proxy HTTP para ingeniería inversa de comunicación de protocolo
Un proxy de intercepción HTTP/HTTPS ligero y herramienta de análisis de tráfico escrito en Go, con una interfaz de usuario basada en web para inspeccionar, filtrar, colorear y anotar el tráfico capturado en tiempo real.


HTTP Breakout Proxy funciona como un proxy MITM HTTP y HTTPS y una herramienta de visualización en vivo.
Captura solicitudes y respuestas entre dos componentes de software, permitiendo a los desarrolladores:
El proxy incluye una interfaz de usuario completa accesible desde cualquier navegador web moderno, permitiendo un análisis inmediato en tiempo real sin herramientas externas.
captures.json (o archivo especificado).status:4 status:5 → resalta errores HTTPurl:/api/ → resalta solicitudes de API/\.css$/ → coincidencia regex en URLmethod:GET, status:404, header:Content-Type=application/json)/login/)curl (formateado para terminal)python requests (representación JSON limpia)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
Esto produce un único ejecutable que contiene el proxy compilado y los activos de UI integrados.
# ejecutar con valores predeterminados (proxy + UI)
./http-breakout-proxy
Por defecto, el binario se vincula a 127.0.0.1:8080 para proxy (y opcionalmente UI — ver banderas CLI). Abra la UI en un navegador para inspeccionar capturas.
# enviar una solicitud HTTPS a través del proxy (el proxy escucha en 127.0.0.1:8080)
curl -x http://127.0.0.1:8080 https://example.com
El tráfico capturado aparecerá en la interfaz web.
| Banda | Predeterminado | Descripción |
|---|---|---|
-l | 127.0.0.1:8080 | Dirección de escucha del proxy y de la aplicación UI. |
-mitm | true | Habilitar el modo de intercepción HTTPS Man In The Middle (MITM) (genera una CA local para interceptar TLS). |
-ca | ./ca | Directorio donde se almacenan el certificado CA y la clave generados cuando MITM está habilitado y se elige la persistencia. |
-f | ./captures.json | Ruta o directorio opcional para persistir las capturas en disco (por ejemplo, ./captures.json). |
-max-body | 1048576 | Número máximo de bytes (por cuerpo) a almacenar/mostrar; los cuerpos más grandes se truncan con un centinela. |
-buffer-size | 1000 | Capacidad del búfer circular para capturas en memoria. |
-v | false | Habilitar registro detallado para depuración. |
Use
./http-breakout-proxy -hpara listar las banderas disponibles y descripciones de uso.
La UI está optimizada para flujos de trabajo de investigación.
MÉTODO URL [ESTADO] pero se puede asignar un nombre personalizado.curl, copiar como Python requests, descargar cuerpo de respuesta, renombrar, eliminar.method:, status:, host:, url:, body:, req.body:, resp.body:, header:, req.header:, resp.header:./patrón/banderas (por ejemplo /bearer\\s+\\S+/i).header:nombre=valor donde nombre o valor pueden ser regex.Ejemplos:
method:POST status:2 host:api.example.com/token\\s*[:=]\\s*\\S+/ireq.header:authorization=/bearer/ibody:/\\"success\\"\\s*:\\s*true/iCuando el modo Man In The Middle está habilitado:
-ca (por defecto ./ca).ca.pem o similar) al almacén de confianza del cliente (o sistema) que realiza las solicitudes. En muchas plataformas esto requiere privilegios administrativos.Nota de seguridad: Instale la CA solo en entornos controlados. No confíe en esta CA en sistemas donde lea tráfico sensible no relacionado.
Si la persistencia está habilitada (a través de -f o ruta configurada):
captures.json).Los elementos capturados se serializan a JSON y contienen los siguientes campos (no exhaustivo):
id — identificador de secuencia únicotime — marca de tiempo (ISO 8601)method, urlrequest_headers, response_headersrequest_body, response_body — truncados a -max-body si es necesarioresponse_status, duration_msname — etiqueta opcional del usuarionotes, deleted — metadatos de control para eventos SSE y estado de la UIcurl seguro para shell que incluye cabeceras y cuerpo (omite cabeceras hop-by-hop).requests con url, headers y opcionalmente data.Content-Type cuando es posible.Consideraciones de diseño:
Host, Content-Length, Connection) se omiten de los comandos de reproducción generados.GET /api/captures — listar capturas (array JSON).DELETE /api/captures — borrar todas las capturas.GET /api/captures/{id} — recuperar una sola captura.DELETE /api/captures/{id} — eliminar una captura específica.PATCH /api/captures/{id} — actualizar metadatos de captura; ejemplo de cuerpo: { "name": "Mi etiqueta" }.GET /api/pause — devuelve { "paused": true|false }.POST /api/pause — establecer estado de pausa; ejemplo de cuerpo: { "paused": true }.GET /events — flujo de Eventos Enviados por el Servidor (SSE) para notificaciones de captura en vivo y eventos de control.//go:embed ui/* y fs.Sub para servir archivos estáticos. Esto produce un único artefacto desplegable.Content-Encoding e intenta descomprimir cuerpos gzip y deflate antes de mostrarlos. Los bytes originales se conservan para transparencia del proxy.io.LimitReader para detectar truncamiento y proteger el uso de memoria.Modelo de distribución recomendado:
CGO_ENABLED=0, -trimpath, -ldflags "-s -w")..tar.gz para Unix, .zip para Windows) e incluir README.md y LICENSE.goreleaser para automatizar compilaciones multiplataforma y artefactos de lanzamiento.Ejemplos de comandos de compilación:
# 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
Cree un plist en ~/Library/LaunchAgents y cárguelo con launchctl.
El cuerpo capturado aparece como galimatías binario
El cuerpo está comprimido (por ejemplo, gzip). Asegúrese de estar ejecutando una compilación que incluya descompresión automática; la UI muestra JSON/texto descomprimido cuando está disponible.
El tráfico HTTPS no se muestra / errores de conexión
El cliente no confía en la CA generada. Instale ca/ca.pem en el almacén de confianza del cliente/sistema y márquelo como confiable para la intercepción TLS.
La UI muestra una selección obsoleta después de borrar capturas
Actualice a un cliente que borre selectedId en eventos SSE cleared o invoque el endpoint GET /api/captures para refrescar el estado.
405 en DELETE /api/captures
Asegúrese de que el manejador del servidor acepte DELETE para /api/captures y que no esté golpeando una discrepancia de barra final.
Esta herramienta realiza intercepción TLS cuando MITM está habilitado. Úsela solo en entornos controlados donde tenga autorización explícita para inspeccionar tráfico. La CA generada es poderosa: trate su clave privada con la misma confidencialidad que cualquier otra clave privada de CA raíz. No instale la CA en almacenes de confianza compartidos o de producción.
Las contribuciones son bienvenidas. Por favor, abra issues para errores o solicitudes de características. Para contribuciones de código:
Este proyecto se distribuye bajo la Licencia MIT. Consulte LICENSE para más detalles.
Autor: John Southerland (GitHub: jbsouthe)
Proyecto: http-breakout-proxy — destinado a depuración, desarrollo y aprendizaje sobre el comportamiento HTTP.