Intercepting Proxy — bowire proxy
bowire proxy is an MITM (Man-In-The-Middle) HTTPS proxy that captures every request and response between a client and a server, then writes the flow into a Bowire recording. The captured .bwr is exactly the format bowire scan, bowire fuzz, and bowire mock read — capturing once turns into a vulnerability template, a fuzz baseline, or a mock fixture.
Quick start
Start the proxy listening on :8888 and let it generate its CA:
bowire proxy --port 8888 --out captured.bwr
Install the generated CA into the client's trust store (one-time per machine / browser):
- Linux / macOS — system trust store: copy
~/.bowire/proxy-ca.crtinto/usr/local/share/ca-certificates/and runupdate-ca-certificates. - Windows: double-click
~/.bowire/proxy-ca.pfxand import into "Trusted Root Certification Authorities". - Browser-specific: Firefox uses its own store — import
~/.bowire/proxy-ca.crtunder Settings → Privacy & Security → Certificates → Import. - Mobile app under test: drop the
.crtinto the app's debug certificate folder, or for iOS push it via a configuration profile.
Then point the client at the proxy (curl, browser HTTPS proxy setting, mobile-VPN profile, etc.):
HTTPS_PROXY=http://localhost:8888 curl https://api.example.com/users
Every call routes through Bowire; Ctrl+C stops the proxy and finalises the recording.
Flags
| Flag | Default | Notes |
|---|---|---|
--port, -p <port> |
8888 |
Proxy listen port. |
--out, -o <path> |
proxy.bwr |
Recording output file. |
--ca-dir <dir> |
~/.bowire/ |
Where the auto-generated CA + key live. |
--filter <host> |
none | Repeatable. Only record calls matching the host substring. |
--passthrough <host> |
none | Repeatable. Skip MITM for these hosts (e.g. captive-portal endpoints). |
--workbench |
off | Stream captured frames live to the workbench at /bowire/proxy for inline inspection. |
From capture to template
The workbench's Proxy view lists every captured flow with one-click actions:
- Send to recording — adds the flow to a named recording file. Subsequent runs against the same target append to the same file.
- Convert to vulnerability template — wraps the flow with
attack: true, prompts for avulnerability:block (CWE, severity, description), and writes a JSON file the scanner consumes as a template. - Convert to fuzz baseline — saves the request as the unmutated baseline
bowire fuzz --templatereads. - Convert to mock fixture — adds the response shape to a recording the mock server replays.
Every conversion is a regular file write — version-control the result alongside your other test fixtures.
CA storage
The auto-generated CA lives at ~/.bowire/proxy-ca.{pfx,crt}. Install it once into the client trust store; every subsequent bowire proxy run reuses the same CA so existing trust persists. Delete the files to force regeneration (e.g. when sharing the laptop or rotating dev creds).
The private key never leaves the local machine. If you commit the .bwr recording to a repo, the CA is not included — only the captured plaintext.
Scope
- HTTP/1.1 and HTTP/2 are intercepted natively.
- HTTP/3 / QUIC is currently passed through unmodified (UDP MITM with the same CA model is on the roadmap).
- WebSocket upgrade traffic is captured frame-by-frame the same way
bowire --url ws://…would. - gRPC over HTTP/2 capture works for both binary protobuf and JSON transcoded surfaces.
Related
bowire scan— replay captured templates as security probesbowire fuzz— use the captured baseline for field-level mutationbowire mock— replay the captured response shape as a mock endpoint- Recording format —
.bwrschema reference - Security-testing ADR