Burp Suite extension + port-based highlighter: dedupes proxy history into a live unique-request feed and color-codes attacker/victim traffic by listener port (PwnFox-style). Features Live Share — the first-ever real-time peer-to-peer request sharing inside Burp Suite — plus Magic Cookie, Match & Replace, Caido-style filter palette, inline Repeater, AI bridge, and .http export for Claude Code.
Industry-first: No other Burp extension lets two testers share captured HTTP requests live, directly inside Burp. Host a server, connect to a friend, and every unique request you capture appears instantly on their screen — color-coded, deduplicated, and ready to test.
| Mode | How it works | Best for |
|---|---|---|
| Direct TCP | Host a server on any port; peers connect directly via host:port | Same network, VPN |
| SSH Tunnel | Auto-tunnels through serveo.net for a public address | Behind NAT, no port forwarding |
| HTTP Relay | Self-host the relay with Docker (relay-server/); peers join by room ID |
Both peers behind NAT/firewall |
| UPnP | Automatic router port mapping | Home/office networks with UPnP-enabled routers |
Live Share — server on port 9999 with client connected, sharing requests in real time
Received shared requests — double-click any entry to open in Repeater
What makes it unique:
- Requests arrive already deduplicated — only
[YENTRA] UNIQUEentries are shared - Auto-share mode: every new unique is forwarded to all connected peers in real time
- Re-issue received → Proxy history: replay received requests through your local proxy listener to add role tags (attacker/victim)
- Room-based relay with random 8-char IDs — drop-in, no registration
- Magenta highlights distinguish shared requests in your Yentra Live feed
- Installation
- 🌐 Live Share — Peer Collaboration
- Architecture Overview
- Yentra Config Tab
- Yentra Live Tab
- Bambda-Style Filter
- IDOR / BOLA Tools
- Right-Click Actions
- Remove from Scope
- Yentra Share (Live Share)
- AI Bridge (Live Export)
- Attacker / Victim Port Highlighting
- Body Only (Pretty JSON) Editor
- Keyboard Shortcuts
- Build
- Acknowledgements
- Burp → Extensions → Installed → Add
- Extension type: Java
- Download the JAR from the latest release and select it
- Three tabs appear: Yentra, Yentra Live, Yentra Share
Yentra is built around a request pipeline that flows from capture to distribution:
Proxy Traffic → YentraEngine → [YENTRA] Stamp → Yentra Live Feed → 🌐 Live Share → Peers
↓ ↓
HTTP History AI Bridge (.http)
Core components:
| Component | Role |
|---|---|
| YentraEngine | Thread-safe deduplication engine — computes 128-bit SHA-256 signatures from configurable request parts; ConcurrentHashMap<Signature, AtomicInteger> seen-set |
| YentraProxyHandler | Intercepts every proxy response, classifies it (unique/dupe/skip/overflow), stamps Notes, highlights rows, pushes uniques to the live feed |
| Yentra Live Feed | In-memory push feed — every UNIQUE is streamed directly to the Yentra Live tab without re-reading from history |
| 🌐 Live Share | Real-time peer-to-peer TCP/SSH/Relay server — auto-forwards UNIQUE requests to connected peers, re-issues received traffic through local proxy |
| AI Bridge | Filesystem mirror to ~/.yentra/<project>/ — every unique exported as a curl-ready case file for Claude Code |
| PortHighlighter | Injects `X-AI-Use: attacker |
Verdict system:
| Verdict | Notes Stamp | Meaning |
|---|---|---|
UNIQUE |
[YENTRA] UNIQUE |
First occurrence of this signature |
DUPE |
[YENTRA] DUPE xN |
Seen N times before |
SKIP |
[YENTRA] SKIP |
Out of scope, static asset, or disabled |
OVRF |
[YENTRA] OVRF |
Exceeded 200k tracked signature cap |
Cross-identity dedup: When traffic arrives through role-tagged ports (attacker/victim), Cookie, Authorization, and role headers are stripped before computing the signature — so identical requests from different identities share one count (first = UNIQUE, second = DUPE x2).
Body digest safety net: When body parameters are enabled, the raw body content hash (first 4 KB) is always folded into the signature, preventing false DUPEs when Montoya cannot parse the body into parameters.
The main configuration panel — "Yentra" suite tab.
| Control | Description |
|---|---|
| Stamp Notes column | Writes [YENTRA] verdicts into the Notes column of HTTP history |
| Highlight rows | Tints rows by verdict and listener port |
| Preserve existing notes | Keeps manual notes when stamping (prepends the verdict after a |) |
| Preset dropdown | Choose from 11 presets or build your own |
| Max tracked signatures | Hard cap (default 200,000; range 1,000–5,000,000); beyond this, OVRF is returned |
| Auto-stamp existing history | Retroactively stamps all proxy history on extension load |
| Stamp existing history | One-shot retroactive stamp (background thread, cancellable) |
| Apply | Commits config and resets the seen-set |
| Reset stats | Zeros all counters without changing config |
| Live unique window | Opens a pop-up live feed of [YENTRA] UNIQUE entries |
Signature fields: Method · Scheme · Host · Port · Path · Normalize numeric/UUID/hex path segments · Query param names · Query param values · Body param names · Body param values · Response status code · Response Content-Type
Filters: In-scope only · Skip static assets (.png, .svg, .jpg, .gif, .webp, .css, .scss, .js, .mjs, .woff, .ttf, .eot, .otf, .ico, .mp3, .mp4, .wav, .avi, .mov, .m3u8) · Include custom headers (comma-separated)
| Preset | Signature Components |
|---|---|
| Default | method + host + path + sorted query & body param names + status |
| Request smuggling | method + host + path only |
| IDOR / Auth | method + host + path (numeric/UUID normalized) + sorted param names |
| XSS | method + host + path + sorted query & body param names |
| SQLi | method + host + path + sorted param names |
| SSRF | method + host + path + query param names |
| Open redirect | host + path + query param names (method-insensitive) |
| SSTI | method + host + path + sorted param names |
| Path traversal | method + host + normalized path + query param names |
| Strict | full method + scheme + host + port + path + all param names & values + status + Content-Type |
| Custom | whatever you tick |
Live stats (refreshed every second): Total seen · Unique · Duplicates · Skipped · Tracked signatures (shown as N / cap)
Header overrides — inject custom headers into requests sent to Organizer:
- Paste raw header lines (
Name: value), one per line;#comments and blank lines ignored - Choose Replace if present, add if missing or Replace only
- Reserved headers (
Host,Content-Length,Transfer-Encoding) are rejected - Applied via right-click → Yentra → Send unique to Organizer
- Stamp existing history walks all proxy history entries and applies verdicts in-place (background thread, shows progress)
- Auto-stamp does this automatically on every extension load — handy for saved projects
- Revert strips
[YENTRA]notes and/or clears highlights when those options are toggled off - Seen-set is reset before stamping for consistent counts
An always-on, auto-refreshing feed of only the [YENTRA] UNIQUE requests. Opens as a Burp suite tab ("Yentra Live") on load. Also accessible via Ctrl+9 (in HTTP history / Site Map, with nothing selected) or the Live unique window button.
How it works:
- Push path: Every
UNIQUEfrom the proxy handler is pushed directly into the live feed via an in-memoryUniqueFeed - Poll path: Background timer (every 1.5s) incrementally scans proxy history for entries stamped
[YENTRA] UNIQUEthat haven't been collected yet; full rescan every ~60s catches late "Stamp history" marks - Both paths cross-dedupe by request identity so the same request never appears twice
| Button | Description |
|---|---|
| Send to Repeater | Sends selected rows to new Repeater tabs named by method + path |
| Share | Shares the selected request with connected Live Share peers |
| Save for AI | Exports selected rows to a .http file with case manifests for AI consumption |
| Magic Cookie | Reissue selected requests with swapped auth headers — ideal for same-request / different-identity IDOR/BOLA |
| Match & Replace | Swap IDs/tokens in path, body, or headers and reissue — watch for unexpected 200 responses |
| Clear | Empties the table (already-seen IDs won't reappear in live mode) |
| Live export → file | Mirrors the feed to ~/.yentra/<project>/ for AI bridge |
| Filter bar | Bambda-style prefix tokens, plain text, and filter chips |
A full Repeater-style interface embedded below the table:
- Request (left) — editable Montoya HTTP request editor
- Response (right) — read-only response viewer with prominent status bar
- Send ▶ button fires via Burp's HTTP client; lands in Logger, not Proxy history
- Safe body editing — automatically recalculates an existing
Content-Lengthfrom the raw body bytes, so spaces, Unicode, and other edits are sent correctly over HTTP/1.1 and HTTP/2 - Latest-response ownership — slow responses from older sends cannot overwrite a newer request, response, or table selection
- Keyboard shortcuts:
Cmd+Space/Ctrl+Space(primary),Ctrl+Enter(fallback) - Reset restores the request to its original state from the table
Shown above the response editor with status-code-colored text:
| Status Range | Color | Example |
|---|---|---|
| 2xx | Green | HTTP 200 OK | 1.2 KB | 156 ms |
| 3xx | Indigo | HTTP 302 Found | 0 bytes | 89 ms |
| 4xx | Amber | HTTP 404 Not Found | 234 bytes | 45 ms |
| 5xx | Red | HTTP 500 Internal Server Error | 567 bytes | 1203 ms |
| No response | Amber | No response received | 30001 ms (check Burp Logger for connection details) |
- ◀ ▶ buttons navigate through sent request history (append-style)
- Keyboard: Alt+Left / Alt+Right
- History prunes forward entries when a new request is sent after navigating back (browser-style)
A Caido-inspired filter system with prefix tokens, chips, and a command palette.
Type prefix:value tokens (case-insensitive) into the search bar. Multiple tokens combine with AND logic. Plain text becomes substring search across all columns + request body + response body.
| Prefix | Matches | Example |
|---|---|---|
m: |
HTTP method | m:GET, m:POST |
s: |
Response status code | s:200, s:404 |
h: |
Host substring | h:api.example |
url: |
URL path substring | url:/api/v1/ |
body: |
Response body content | body:token |
req: |
Request body content | req:user_id |
hdr: |
Request header name + value | hdr:Authorization |
mime: |
Response MIME type | mime:JSON |
len: |
Response body length | len:1024 |
notes: |
Notes column | notes:UNIQUE |
u: |
Only UNIQUE rows | u: |
d: |
Only DUPE rows | d: |
skip: |
Only SKIP rows | skip: |
r: / regex: |
Regex across all columns + body | r:\d{3} |
Toggle buttons in the filter bar:
| Chip | Color (Active) | Function |
|---|---|---|
.* regex |
Purple | Treat search as case-insensitive regex |
In-scope |
Green | Show only requests in Target scope |
Shared |
Amber | Show only requests from Live Share peers |
Click the search bar (or press Down arrow when focused) to open the filter command palette. Four categorized groups with 18 options, each showing a prefix badge, label, and description. Navigate with arrow keys, select with Enter or click.
Groups: HTTP · Request · Yentra · Advanced
Type standalone comparison operators for status-based filtering:
| Operator | Example | Matches |
|---|---|---|
>N |
>399 |
Status > 399 |
>=N |
>=400 |
Status ≥ 400 |
<N |
<300 |
Status < 300 |
<=N |
<=200 |
Status ≤ 200 |
Reissues selected requests with a user-supplied auth set swapped in.
- Select requests in Yentra Live
- Click Magic Cookie
- Paste auth headers — one
Name: valueper line (#comments ignored) - The auth set is remembered across sessions
- Results stream into a new window — each response lands as it arrives
Strips the request's existing Cookie and Authorization (plus any header you list), then adds only your supplied credentials. Method, path, body, and other headers are unchanged. The dialog stays open after sending so you can swap values and send again.
Swaps an ID or token in the path/query, body, headers, or any combination — then reissues.
- Select requests → Match & Replace
- Enter Match text and Replace text
- Choose Path/query, Body, Headers, or any combination
- Optionally tick regex
- Click Replace & send
Only requests containing the match are sent (others skipped). The dialog stays open — change values, select new rows, send again. Settings are remembered across sessions.
Headers rewrites every header value (Cookie, Authorization, X-User-Id, ...), so a request whose token lives only in a header is actually sent instead of being skipped. This is what you want after Magic Cookie: tick Headers to re-swap the session/token the cookie change just put in place, then reissue.
Available in HTTP history, Site Map table, and Site Map tree via the Yentra submenu:
| Action | Description |
|---|---|
| Live unique window | Opens the auto-collecting live view (same as Ctrl+9 with no selection) |
| Show only unique requests from selection — Ctrl+9 | Deduplicates selection by signature, opens in results window |
| Send unique to Organizer | Deduplicates selection, applies header overrides, sends uniques to Burp Organizer with batch label |
| Remove host from scope | Excludes selected request's host(s) from Target scope |
| Remove path from scope | Excludes selected request's path prefix(es) from Target scope |
Also available as a right-click popup on the Yentra Live table: Send to Repeater, Share, Remove host from scope, Remove path from scope.
What gets excluded:
- Remove host from scope →
scheme://host:port/(default ports 80/443 stripped) — prefix-matches all paths on that host - Remove path from scope →
scheme://host:port/path(query stripped, trailing slashes trimmed) — prefix-matches that path and sub-paths
A confirmation dialog shows exactly what will be excluded. Multi-selection deduplicates unique hosts/paths.
⚡ The only Burp extension with real-time peer-to-peer HTTP request sharing. Two testers, two Burp instances, one shared feed. No exports, no copy-paste, no waiting.
- Tester A starts a server on the Yentra Share tab (port 9999)
- Tester B connects to Tester A's address
- Tester A browses the target — every
[YENTRA] UNIQUErequest appears instantly in Tester B's Yentra Live feed, color-coded magenta - Tester B can replay received requests through their own proxy listener to add role tags (attacker/victim)
- Both testers see identical, deduplicated feeds in real time
| Mode | Setup | Best For |
|---|---|---|
| Direct TCP | Open a port, share the IP — zero config | Same LAN / VPN |
| SSH Tunnel | Tick one checkbox — auto-tunnels through serveo.net |
Behind NAT, no port forwarding needed |
| HTTP Relay | docker compose up -d in relay-server/, share the room ID |
Both peers fully firewalled |
| UPnP IGD | Automatic — tries to map a port on your router | Home/office networks |
| Feature | Description |
|---|---|
| Manual Share | Click Share on any selected request to send it to all connected peers |
| Auto-Share | Every new [YENTRA] UNIQUE is automatically forwarded — toggle on/off |
| Re-issue to Proxy | Replay received requests through a local Burp proxy listener (default 8080) so they appear in your HTTP history with role tags |
| Magenta Highlighting | Shared requests are visually distinct in Yentra Live |
| Double-click → Repeater | Any received request opens in a Burp Repeater tab with one double-click |
| 500-entry log | Scrollable list of all received requests with method + URL preview |
cd relay-server
docker compose up -dThe relay is a lightweight Java HTTP server. Two peers connect to it with the same room ID and messages are brokered in real time. No database, no auth, no accounts — just room-based pub/sub. Works behind any NAT or firewall.
- Pair testing: One tester browses as attacker, the other as victim — both see identical traffic
- Training / mentoring: Senior tester shares live traffic with a junior in real time
- Distributed testing: Two testers on different networks testing the same target simultaneously
- Demo / presentation: Share your Burp session live without screen sharing
Burp's MCP server cannot see custom extension windows, so Yentra uses the filesystem as the AI bridge:
~/.yentra/<burp-project-name>/
live-unique.http ← every unique request, as it arrives
selection.http ← current table selection
The folder is named after the current Burp project. Each entry is a ####-delimited request+response block prefixed with a case manifest — four fields the AI reads before touching payloads:
- Source request — method + URL
- Identity role —
attacker/victim(fromX-AI-Useheader or[attacker]/[victim]tag) - Why it's unique — the Yentra verdict and signature rationale
- Replay command — a ready-to-run
curl(auth + body included; body omitted if > 4 KB)
Workflow: Open Yentra Live → it fills with [YENTRA] UNIQUE requests and mirrors them → in Claude Code: "read ~/.yentra/<project>/live-unique.http". The toggle is on by default in live mode. Tick Responses: body only, pretty JSON when saving for AI to get clean JSON without headers.
For multi-account IDOR/BOLA testing where each account browses through its own proxy listener port.
Default port rules (edit PORT_RULES in PortHighlightHandler.java and rebuild):
| Listener Port | Role | Unique Color | Duplicate Color | Injected Headers |
|---|---|---|---|---|
| 8082 | attacker | Green | Yellow | X-AI-Use: attacker |
| 8083 | victim | Red | Gray | X-AI-Use: victim |
| any other | — | Yellow | Gray | — |
Row colors are per-port and per-verdict, applied after classification. The Highlight rows toggle must be on. Port rules are logged to extension output on load.
A read-only response-viewer tab available everywhere a response is shown:
- Shows only the body (no headers)
- Strips JSON XSSI guards (
)]}',for(;;);,while(1);) - Pretty-prints JSON with zero-dependency re-indenter
- Opt-in when you Save for AI: tick Responses: body only, pretty JSON
| Shortcut | Context | Action |
|---|---|---|
Cmd+Space / Ctrl+Space |
Inline Repeater | Send request |
Ctrl+Enter |
Inline Repeater | Send request (fallback) |
Alt+Left |
Inline Repeater | Navigate history back |
Alt+Right |
Inline Repeater | Navigate history forward |
Ctrl+9 |
HTTP history / Site Map | Open live unique window (snapshot if rows selected) |
Down |
Filter field (focused) | Open command palette |
Up/Down/Enter/Esc |
Command palette | Navigate / select / dismiss |
Requires JDK 21+.
./gradlew build
Output: build/libs/yentra-0.1.0-SNAPSHOT.jar
- Yentra builds on burp-dedupe by sw33tLie — the original deduplication engine. MIT-licensed.
- The per-request case manifest in the AI export was suggested by Timur Yessenov (@Timur_Yessenov) .
- The Body Only (Pretty JSON) response tab was inspired by rikeshbaniya 's Burp extension.