RedPhish
A full-featured reverse-proxy phishing framework for authorized red teams — an extended fork of evilginx2 CE 3.3.0 (GPL-3.0), cleanly re-implementing Evilginx Pro-class features for internal / air-gapped environments.
⚠️ Authorized use only. This tool is for education and red-team campaigns explicitly authorized by the system owner. Not affiliated with BreakDev/Evilginx Pro — no binaries or code from the commercial product are used. Upstream GPL-3.0 applies.
Documentation map
| Document | Contents |
|---|---|
| Architecture | Request lifecycle, module map, deploy topology — the maintainer’s map |
| Getting started | Build, deploy to a VPS, DNS + wildcard cert, first lure — the shortest path to a working node |
| Evasion | Every integrated evasion technique by defense layer — token-gate, botguard, CSD, uTLS, relay, infra — all field-verified |
| Operations guide | Day-2 operations: the egconsole command reference, phishlet switching, lure lifecycle, session & cookie export, mailbox reuse |
| Phishlet authoring | Writing phishlets: structure, auth-token capture, sub-filters, multi-domain rules, CSD hardening, token-gate |
| Real-browser relay (any target) | The bgrelay sidecar defeats origin-bound botguard (Google) and domain-locked Turnstile (Cloudflare) for ANY phishlet via declarative profiles + a one-flag lure switch |
| ClickFix gate | Fake-captcha social engineering — clipboard payload with before/after position, detection-hardened templates |
| Upstream proxy | Feature #17 — per-phishlet egress routing (residential exits, datacenter blocks) |
| egconsole | The remote operator interface — full command reference, workflows, quirks |
| mTLS API reference | The hidden HTTPS API: phishlets, lures, sessions, proxy, relay |
| Troubleshooting | Field-proven gotchas: botguard decoys, DNS wildcard rules, cookie import, zombie chromium, IP reputation |
| Phishlet status & features | The full Pro-parity feature matrix |
| Blue-team IOC notes | What defenders can detect — honest detection notes |
Phishlet status
| Phishlet | Status | Notes |
|---|---|---|
ms365 |
✅ production-ready | Work flow (ESTSAUTHPERSISTENT) + consumer MSA (WLSSC) capture, mailbox reuse, token-gate, CSD hardening (Chrome Safe Browsing bypass verified), JA4 allowlist |
google |
✅ production-ready via real-browser relay | Classic MITM is impossible (Google botguard is origin-bound); solved with the bgrelay sidecar — victims sign in on a mirrored real accounts.google.com session, credentials + .google.com cookies captured, cookie replay into Gmail verified |
github |
✅ production-ready | Real-account E2E verified — password + GitHub-Mobile push 2FA through the MITM, tokens intercepted. Session cookie is host-only __Host-user_session_same_site (modern GitHub dropped domain-wide user_session); TOTP-entry capture in place |
gitlab |
⚠️ unverified | Cloudflare Turnstile in front of the login (renders on the phishing host); fields user[login]/user[password]/user[otp_attempt] |
atlassian |
⚠️ unverified | SPA proxied (id-frontend…atl-paas.net); JSON credentials username/password; AWS WAF SDK cross-origin not yet proxied |
zimbra |
⚠️ unverified (template) | On-prem target — required {domain} param; classic username/password, token ZM_AUTH_TOKEN; instantiate per target |
yandex |
⚠️ unverified | Landing /auth/ currently bounces to 360.yandex.com; React login fields need re-checking with an account |
aws |
⚠️ unverified | AWS WAF 403s datacenter IPs at /signin; fields username/password/mfaCode |
claude |
✅ verified E2E | Login-code flow (email + 6-digit code, no password), JSON creds; sessionKey captured and replayed into a logged-in session; CF-protected — requires proxy: true + residential + tlsfp: chrome |
chatgpt |
✅ verified E2E | Password + OTP captured as JSON; chunked session-token .0/.1 replayed into the victim’s logged-in ChatGPT; CF + auth-cdn CORS trap documented |
cloudflare |
🅿️ parked | MITM structurally blocked (domain-locked Turnstile on the login button); the generalized real-browser relay covers it (profile + relay: true) and passed the fake-credential loop — deferred pending a real-account E2E |
discord |
⚠️ unverified | SPA proxied (login renders); JSON creds login/password + TOTP code; bearer token in localStorage — credentials capture only |
akamai |
⚠️ unverified | Control Center auth renders through the proxy; session cookie set needs an account test |
The one-paragraph architecture
Victim ──► evilginx2 :443 (reverse proxy, wildcard cert, botguard JA4 filter,
lure token-gate) ──► upstream identity provider
│
├─ ms365: transparent MITM — session cookies captured, replayed
│
└─ google: /__relay/* + relay-lure ──► bgrelay sidecar :9445
(patchright headful Chromium under Xvfb, real accounts.google.com
via residential SOCKS exit) ──► mirror stream + input/click relay
──► capture {email, password, cookies} to bgrelay-store/
Repository layout
src/ Go source (fork core + API + botguard + relay routes)
src/phishlets/ campaign phishlets — GITIGNORED by design, never published
deploy/ deploy scripts, systemd templates, wildcard cert script
tools/ egconsole.py (operator console), relay/ (bgrelay sidecar),
kit generators, offline deploy tooling
docs/ this documentation (also the GitHub Pages site)
Links
- Source: github.com/dn9uy3n/RedPhish
- Vietnamese README: README.vi.md