HTTP interception proxy with a terminal-first TUI.
Project description
HexProxy
HexProxy es un proxy HTTP/HTTPS orientado a terminal, escrito en Python y diseñado para trabajar completamente desde una TUI. Su objetivo es ofrecer un flujo de trabajo estilo Burp Suite, pero centrado en consola: captura, interceptación, edición, repetición, exportación de evidencia, persistencia de sesiones y extensibilidad mediante plugins.
- Repositorio: https://github.com/Secure-Hex/HexProxy
- Documentación: https://hexproxy.securehex.cl
Resumen
HexProxy ya cubre un flujo operativo real para análisis de tráfico:
- proxy HTTP funcional con captura de requests y responses
- interceptación de
request,responseo ambas fases - inspección HTTPS mediante MITM local cuando el cliente confía la CA de HexProxy
Repeater,Sitemap,Match/Replace,Export,Scope,Filters,SettingsyKeybindings- workspace HTTP unificado con
RequestyResponsevisibles en la misma pantalla - proyectos persistentes con autosave
- exportación a snippets de desarrollo y transcript HTTP limpio para evidencia
- plugins Python cargables desde archivos locales
- themes globales, incluyendo colores nombrados y colores hex
Características Principales
Flowsen tiempo real con navegación por teclado- visualización simultánea de
RequestyResponsepara el flow seleccionado - detección de tipo de contenido,
raw/pretty, syntax highlighting básico,word wrapy scroll horizontal - decodificación de
chunked,gzip,deflateybrcuando es posible Interceptcon historial persistente en la sesión y resolución fuera de ordenRepeatercon múltiples sesiones y múltiples envíos por sesiónSitemappor host y rutaMatch/Replacepersistente con builder guiado dentro de la TUIScopecon inclusiones y exclusiones explícitas- filtros para limpiar
FlowsySitemap - copia al clipboard desde
Export - documentación de plugins y themes dentro de
Settings
Instalación
Requisitos
- Python
3.12+ opensslenPATHpara generar la CA local y certificados por host- terminal compatible con
curses - (opcional) clipboard en Linux:
wl-copy(Wayland) oxclip/xsel(X11)
Recomendado (PyPI)
pip install hexproxy
hexproxy --listen-port 8080
Opcionales:
- Brotli (decodificación
br):pip install "hexproxy[brotli]"
Linux / macOS
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
hexproxy --listen-port 8080
Windows
py -m venv .venv
.venv\Scripts\Activate.ps1
pip install -e .
hexproxy --listen-port 8080
Notas de instalación:
- En Windows,
windows-cursesse instala como dependencia del proyecto. - Para MITM HTTPS en Windows también necesitas
openssl.exeaccesible desdePATH. - Para decodificar
brotli, instala opcionalmentebrotlio usa extras:pip install "hexproxy[brotli]"- en desarrollo:
pip install -e ".[brotli]"
También puedes ejecutar el módulo directamente:
PYTHONPATH=src python3 -m hexproxy --listen-port 8080
Inicio Rápido
Levantar el proxy:
hexproxy --listen-port 8080
Levantar el proxy con proyecto persistente:
hexproxy --listen-port 8080 --project projects/demo.hexproxy.json
Cargar plugins adicionales:
hexproxy --plugin-dir plugins --plugin-dir /ruta/a/plugins-extra
Si el puerto solicitado está ocupado, HexProxy intenta puertos cercanos y muestra el puerto final dentro de la TUI.
Opciones CLI
--listen-host: interfaz de escucha--listen-port: puerto del proxy--project: archivo de proyecto para cargar y autosalvar sesiones--plugin-dir: directorio adicional de plugins; se puede repetir--cert-dir: directorio de certificados; por defecto usa una ruta global estable--config-file: archivo de configuración global
Workspaces
1. Overview
Vista principal con la lista de Flows capturados y detalles generales del item seleccionado.
2. Intercept
Permite interceptar:
offrequestresponseboth
Características:
- cola de interceptación resoluble fuera de orden
- historial retenido después de reenviar o descartar
- edición validada de request y response
3. Repeater
Permite cargar un flow, editar el request y reenviarlo manualmente.
Incluye:
- múltiples sesiones
- múltiples envíos por sesión
- historial por sesión
- request editable
- response visible y reutilizable para export
Limitaciones actuales:
- no soporta
CONNECT - no soporta upgrades
WebSocket
4. Sitemap
Construye un árbol por host y ruta usando el tráfico visible actualmente.
Incluye:
- árbol por host
- request y response del item seleccionado
- integración con
Repeater - integración con
ScopeyFilters
5. Match/Replace
Gestiona reglas persistentes para modificar requests y responses.
Incluye:
- builder guiado dentro de la TUI
- edición de reglas existentes
- eliminación de reglas
- soporte
literalyregex - scope de regla
request,responseoboth
6 y 7. HTTP Workspace
Los atajos 6 y 7 abren el mismo workspace HTTP:
6: abre el workspace con foco enRequest7: abre el mismo workspace con foco enResponse
La pantalla muestra al mismo tiempo:
Flowsa la izquierdaRequestarriba a la derechaResponseabajo a la derecha
La distribución de paneles se calcula con proporciones en lugar de tamaños fijos, de modo que al redimensionar la terminal las relaciones entre las áreas se respetan automáticamente y los paneles nunca caen por debajo de un mínimo legible. Todos los workspaces multi-panel (Overview, Intercept, HTTP, Repeater, Sitemap, Match/Replace, Settings, Export, Scope, Filters, Keybindings, Rule Builder, Theme Builder, Findings y los workspaces de plugin) comparten este modelo y admiten >/< para ajustar la anchura de la columna principal y {/} para reequilibrar los paneles apilados en la columna derecha, manteniendo la relación deseada aunque cambies el tamaño de la terminal.
Interacción con el mouse
La capa mouse mantiene el enfoque keyboard-first pero dibuja regiones clicables para cada lista y botón, de forma que un clic reproduce exactamente la acción del atajo correspondiente: se resalta el elemento en hover y, al soltar el botón izquierdo, se ejecuta el mismo flujo que si se pulsase su tecla (flujos, intercept, footer, menús de Settings/Scope/Filters/Keybindings/Rule Builder/Theme Builder/Export/plugins, etc.). El manejador de eventos ignora BUTTON1_PRESSED y sólo procesa BUTTON1_RELEASED —evita que un clic se dobleinterprete— y se sigue reusando _execute_bound_action para que las pulsaciones mouse/teclado compartan el mismo backend.
Para inspección detallada, un double click en los paneles Request o Response abre la vista expandida en Inspect usando exactamente la misma acción que el atajo R.
El mismo sistema proporcional rige los workspaces Repeater y Sitemap, de forma que sus paneles (historia/árbol/detalle y request/response) conservan proporciones constantes cuando se redimensiona el terminal o se reabre la aplicación.
Cada panel soporta:
- scroll vertical
- scroll horizontal cuando
word wrapestá apagado raw/pretty- syntax highlighting básico
Tipos soportados por el viewer:
JSONXMLHTMLapplication/x-www-form-urlencodedJavaScriptCSS- texto plano
- binarios en
hexdump
8. Export
Genera snippets y transcripts desde el flow, item interceptado o sesión de repeater actual.
Formatos disponibles:
HTTP request + responsePython requestscurl (bash)curl (windows)Node.js fetchGo net/httpPHP cURLRust reqwest
También soporta:
- copia directa al clipboard
word wrap- scroll horizontal
- syntax highlighting básico
Cuando el origen es un hallazgo de Findings, aparecen formatos adicionales:
Findings (text)Findings (JSON)Findings (HTML)Findings (XML)
9. Findings
Workspace de análisis de seguridad en tiempo real. Escanea cada flow por:
- encabezados críticos ausentes (
X-Frame-Options,Content-Security-Policy,HSTS) - cookies sin
Secure/HttpOnly - cabeceras CORS permisivas (
Access-Control-Allow-Origin: *) - JSON con comentarios no estándar
- fingerprinting de librerías comunes y correlación con versiones detectadas
El panel izquierdo resume:
- conteos por severidad (critical/warning/info)
- indicación de flows marcados como riesgo crítico (asterisco
*) - atajos:
9abre este workspace,mmarca/desmarca un flow como riesgo crítico,8abre el panel de export para reportar rápidamente
El panel derecho muestra:
- descripción completa del hallazgo
- recomendaciones sugeridas
- identificación de versiones de librerías expuestas y hallazgos relacionados
- estado de marcado
Flagged as critical risk
Todos los marcados se resaltan en la lista y permiten exportar/reportar en un solo click gracias a open_export.
Inspect
Workspace dedicado a inspección expandida de Request/Response sin las limitaciones del layout compacto. Se abre desde:
- teclado:
R(expand) sobre el panelRequestoResponseque esté[active] - mouse: double click sobre los paneles
Request/Response(HTTP/Sitemap/Repeater) - atajo directo:
I(abre Inspect; útil para volver a la última inspección)
Controles:
B: volver al workspace anteriorR: alternar entreRequestyResponse(dentro de Inspect)PgUp/PgDn,Home/End: scroll rápido dentro del contenido expandido- pan horizontal (
H/L) cuandoword wrapestá apagado
Settings
Settings está organizado por secciones:
AppearanceExtensionsTLSTrafficControls
Desde ahí puedes abrir o ejecutar:
ThemesPluginsPlugin Developer Docs- generar o regenerar certificados
ScopeFiltersKeybindings
Scope
Workspace interactivo para gestionar:
- patrones in-scope
- patrones out-of-scope
- altas, edición y borrado sin salir de la TUI
Filters
Workspace interactivo para controlar qué aparece en Flows y Sitemap.
Filtros actuales:
- mostrar u ocultar tráfico fuera de scope
- requests con query, sin query o ambos
- tráfico con body, sin body o ambos
- fallos: todos, solo fallos, ocultar fallos,
4xx,5xx, errores de conexión - allowlist de métodos HTTP
- denylist de métodos HTTP
- extensiones ocultas como
jpg,png,js,css,woff, etc.
Keybindings
Workspace interactivo para editar atajos globales.
Características:
- bindings persistentes para toda la aplicación
- secuencias de uno o dos caracteres
- validación contra duplicados
- validación contra combinaciones ambiguas
HTTPS, Certificados Y Navegadores
HexProxy puede inspeccionar HTTPS mediante MITM local.
Flujo:
- HexProxy genera una CA local
- el cliente debe confiar esa CA
- el navegador o cliente debe usar HexProxy como proxy HTTP explícito
La CA puede:
- generarse o regenerarse desde
Settings - descargarse desde la página local servida por HexProxy
Rutas útiles:
http://127.0.0.1:PUERTO/http://localhost:PUERTO/http://hexproxy/cuando el navegador ya usa HexProxy como proxyhttp://127.0.0.1:PUERTO/cert
Ubicación por defecto de certificados:
- Linux/macOS:
~/.config/hexproxy/certs/ - Windows:
%APPDATA%\hexproxy\certs\
Notas importantes:
- si regeneras la CA, debes volver a importarla en el cliente
- Firefox debe configurarse como
HTTP Proxy, noHTTPS Proxy - si el cliente no confía la CA, el MITM HTTPS fallará
Scope
El scope controla qué hosts quedan permitidos para interceptación.
Comportamiento:
- si el scope está vacío, toda la captura puede entrar al interceptor
- si el scope tiene entradas, solo los hosts permitidos se interceptan
- el tráfico fuera de scope puede seguir mostrándose o ocultarse desde
Filters
Patrones soportados:
example.com: coincide conexample.comy subdominios*.example.com: coincide solo con subdominios!test.example.com: excluye un host concreto!*.internal.example.com: excluye subdominios concretos*: coincide con todo
También puedes añadir el host actual al scope desde:
FlowsSitemap- el workspace HTTP
Proyectos Y Persistencia
Si usas --project, HexProxy persiste:
- flows capturados
- requests y responses
- reglas de
Match/Replace - scope
- filtros de vista
Comportamiento:
- si el archivo existe, se carga
- si no existe, se crea uno nuevo
- cada cambio importante se autosalva
- puedes forzar guardado manual
- si no iniciaste con
--project, HexProxy puede pedir nombre o ruta al guardar
Keybindings Por Defecto
Workspaces:
1:Overview2:Intercept3:Repeater4:Sitemap5:Match/Replace6:HTTPcon foco en request7:HTTPcon foco en response8:Export9:FindingsI:Inspectw:Settings0:Keybindings
Acciones principales:
a: enviar enInterceptyRepeater, o copiar enExporte: editar item actualx: descartar, borrar o cancelar según el workspacey: mandar el flow actual aRepeaterA: agregar host actual al scopep: alternarraw/prettyz: alternarword wrapo: alternar visibilidad fuera de scopeR: expandir el panelRequest/Responseque esté[active]haciaInspectB: volver desdeInspectal workspace anterior
Themes
HexProxy incluye themes built-in y soporta themes personalizados.
Themes incorporados:
defaultamberoceanforestmono
Ubicación de themes custom:
- Linux/macOS:
~/.config/hexproxy/themes/ - Windows:
%APPDATA%\hexproxy\themes\
Formato JSON:
{
"name": "sunset",
"description": "Warm custom palette",
"extends": "default",
"colors": {
"chrome": { "fg": "#1d3557", "bg": "#f1c40f" },
"accent": { "fg": "red", "bg": "default" },
"keyword": { "fg": "#ff8800", "bg": "default" }
}
}
Claves soportadas:
name: nombre único del themedescription: descripción opcionalextends: theme base, por defectodefaultcolors: overrides por rol
Roles soportados:
chromeselectionsuccesserrorwarningaccentkeywordinfo
Valores de color soportados:
defaultblackredgreenyellowbluemagentacyanwhite#RGB#RRGGBB
Notas sobre hex:
- HexProxy acepta hex colors en el JSON.
- En runtime, la TUI los aproxima al color de terminal más cercano soportado por
curses. - Esto mantiene compatibilidad con terminales básicas sin perder expresividad en la definición del theme.
Plugins
HexProxy carga plugins Python desde:
- la subcarpeta
plugins/dentro del directorio de configuración global (por defecto~/.config/hexproxy/pluginsen Linux/macOS o%APPDATA%\hexproxy\plugins/%LOCALAPPDATA%\hexproxy\pluginsen Windows; el mismo directorio que contiene--config-fileo la ruta indicada porHEXPROXY_CONFIG). HexProxy crea esta carpeta automáticamente y copia ahí el pluginhexproxy/plugins/jwt_inspector.pyincluido. - cualquier directorio indicado con
--plugin-dir
Reglas del loader:
- se cargan archivos
*.py - archivos que comienzan con
_se ignoran - el módulo puede exportar
register(api),register(),PLUGINocontribute(api)
Capacidades de la API v2:
- hooks de tráfico para request/response/error
- workspaces propios
- paneles dentro de workspaces propios y paneles en workspaces integrados
- exporters adicionales
- keybindings configurables
- analyzers
- metadata visible en la TUI
- campos en
Settings - estado global y por proyecto para plugins
Ejemplo:
def register(api):
api.add_workspace("demo_workspace", "Demo", "Workspace de plugin", shortcut="dw")
api.add_panel(
"demo_workspace",
"summary",
"Summary",
render_lines=lambda context: ["Plugin workspace activo"],
)
return DemoPlugin()
Referencias:
Nota de runtime:
- la metadata de plugins persistida por flow se almacena como strings
- para guardar estructuras debes usar
json.dumps(...)al escribir yjson.loads(...)al leer
MCP (Model Context Protocol) (no habilitado)
El código de un servidor MCP existe en el repositorio, pero actualmente no forma parte del producto “habilitado” (no está integrado al flujo principal de la TUI ni se considera estable).
Si quieres probarlo en desarrollo bajo tu propio riesgo:
PYTHONPATH=src python -m hexproxy.mcp --help
Notas:
- La interfaz y capacidades pueden cambiar o eliminarse sin aviso.
- La documentación oficial/estable para usuarios finales no asume MCP por ahora.
Configuración (global)
Archivo de configuración global:
- Linux/macOS:
~/.config/hexproxy/config.json - Windows:
%APPDATA%\hexproxy\config.json
Variables de entorno:
HEXPROXY_CONFIG: ruta del archivo de configuración global (sobrescribe la ruta por defecto)HEXPROXY_SKIP_UPDATE_CHECK=1: desactiva el prompt de auto-actualización desde PyPI
Seguridad y alcance
HexProxy está diseñado para pruebas autorizadas. El modo MITM requiere instalar y confiar una CA local: úsalo únicamente en entornos bajo tu control.
Compatibilidad De Plataforma
HexProxy ya contempla:
- rutas globales por plataforma para config, themes y certificados
- instalación de
windows-cursesen Windows - integración de clipboard para Linux, macOS y Windows
Aun así, el flujo más validado sigue siendo Unix-like. En Windows el soporte está presente en la base del proyecto, pero conviene validar terminal, openssl y clipboard en tu entorno real.
Limitaciones Actuales
- soporte
WebSocketlimitado al túnel tras101 Switching Protocols Repeaterno soportaCONNECT- el rendering y clipboard dependen de lo que soporte tu terminal
Contribuir
Este repo sigue Conventional Commits (ver CI → "Commit message policy") y usa semantic-release para versionado/publicación.
Flujo de trabajo:
- antes de iniciar cambios, asegúrate de estar en
developy actualizado - crea una branch por cambio (
feature/...,fix/..., etc.) siempre desdedevelop - evita trabajar directo sobre
main(cambios sólo con autorización explícita) - no hagas merge a
developsin revisión/aprobación - no hagas commits hasta que tu reviewer/maintainer confirme que el cambio está OK para commitear (y usa Conventional Commits)
Desarrollo
Instalar dependencias de desarrollo:
pip install -e ".[dev]"
Ejecutar tests:
pytest -q
Alternativa (runner estándar de Python):
PYTHONPATH=src python -m unittest discover -s tests -v
Verificación rápida de sintaxis:
python3 -m compileall src tests
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hexproxy-0.6.0.tar.gz.
File metadata
- Download URL: hexproxy-0.6.0.tar.gz
- Upload date:
- Size: 187.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f31ce7b180f78f7468e3dd7549010f0764c8878297db240437b76b007050e1a
|
|
| MD5 |
a095d507abc2a7401acaf67129aa7258
|
|
| BLAKE2b-256 |
35f23764d0ea136d93d44fd750d4041493be7b19f7c3b0175c31f821538a7a4d
|
Provenance
The following attestation bundles were made for hexproxy-0.6.0.tar.gz:
Publisher:
release.yml on Secure-Hex/HexProxy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hexproxy-0.6.0.tar.gz -
Subject digest:
9f31ce7b180f78f7468e3dd7549010f0764c8878297db240437b76b007050e1a - Sigstore transparency entry: 1326278230
- Sigstore integration time:
-
Permalink:
Secure-Hex/HexProxy@f504b61d3eb7aa33d904431f31311283d8cdf194 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Secure-Hex
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f504b61d3eb7aa33d904431f31311283d8cdf194 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hexproxy-0.6.0-py3-none-any.whl.
File metadata
- Download URL: hexproxy-0.6.0-py3-none-any.whl
- Upload date:
- Size: 164.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea133c4fc0fcf650375b342d96c73e2a84493581db05a43d6a6b853fb4e118f5
|
|
| MD5 |
1b0817ee3d50fa377fc9e47c60a9fd23
|
|
| BLAKE2b-256 |
b39c9a0120a7f0a7b7aa25a93fff1ab022672b908630540605c759c42038d948
|
Provenance
The following attestation bundles were made for hexproxy-0.6.0-py3-none-any.whl:
Publisher:
release.yml on Secure-Hex/HexProxy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hexproxy-0.6.0-py3-none-any.whl -
Subject digest:
ea133c4fc0fcf650375b342d96c73e2a84493581db05a43d6a6b853fb4e118f5 - Sigstore transparency entry: 1326278389
- Sigstore integration time:
-
Permalink:
Secure-Hex/HexProxy@f504b61d3eb7aa33d904431f31311283d8cdf194 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Secure-Hex
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f504b61d3eb7aa33d904431f31311283d8cdf194 -
Trigger Event:
push
-
Statement type: