Evasion techniques (integrated & field-verified)

Every technique below is implemented in this fork and has been verified in the field (not theory). They are organized by the defense layer they defeat — think in layers: a scanner, a browser, the identity provider and the blue team each see a different, benign story.

Defense layer What they see Techniques
Scanners / crawlers / link previews a boring “It works!” page or a benign redirect Lure token-gate, Botguard decoy
TLS inspection (corporate SWG) a Chrome-shaped TLS session JA4 allowlist, uTLS fingerprint
Chrome client-side phishing detection (CSPD) a page with no password field and no brand until you interact CSD hardening
Provider anti-bot (Google botguard) a genuine Chromium on the genuine origin Real-browser relay
Network/infra observers a wildcard cert, no per-host CT noise, unremarkable egress Wildcard certs, residential routing
Anyone reading lure URLs opaque AES blobs AES lure params, JS obfuscation
Security products scanning the clickfix gate a blank page with a spinner — no keywords, no payload, no brand ClickFix hardening

1. Lure token-gate

Defeats: Safe Browsing classification, crawlers, chat link previews, URL scanners — anything that arrives without the token.

Lures carry a secret ?t=<token> (created as "auto" via the API). A request missing it gets a 302 to a benign redirect_url (product marketing page). The login page is never rendered to a classifier, which extends domain life dramatically. The gate marker also survives reverse-redirect rewriting (X-Eg-Gate).

2. Botguard (anti-bot)

Defeats: scripted clients (curl/python), scanners, bulk URL fetchers — including the Palo Alto / Umbrella URL-filtering crawlers that auto-fetch every link users click.

Layered scoring on every request: JA4 TLS fingerprint allowlist (+ UA heuristics + TLS GREASE + JS telemetry endpoint), trusted CIDRs skip scoring. Any non-browser gets the 141-byte decoy (“It works! This page is intentionally boring.”) — a benign classification that actually helps the domain look dead-boring to security appliances.

3. uTLS Chrome fingerprint

Defeats: upstream TLS fingerprinting by the origin (JA3S-side heuristics, datacenter-TLS blocklists).

Upstream fetches are dialed with a uTLS Chrome ClientHello (HelloChrome_106 shuffle family) so the identity provider sees a Chrome-shaped TLS handshake even though the proxy is Go. Implemented in applyTransport() (src/core/transport.go) with an ALPN-overridden custom preset.

4. CSD hardening (client-side detection)

Defeats: Chrome’s on-device phishing classifier (CSPD) — the “Dangerous site” interstitial triggered by client-side analysis, independent of Safe Browsing blocklists.

Two js_inject layers, both field-verified (SB-enabled Chrome, full login flow, no flag):

  1. Password DOM disguise — input[type=password] is swapped to type=text + -webkit-text-security:disc, held in place by a MutationObserver; submit value unchanged. The DOM literally contains no password field to classify.
  2. Brand lazy-reveal — logo/brand assets are hidden behind a style class at load and restored on the first real gesture (pointermove/keydown/ touchstart). The visual model has nothing to classify before interaction.

5. Real-browser relay (origin-bound botguard)

Defeats: Google’s origin-bound botguard — which no MITM, proxy, IP or TLS trick can pass (verified exhaustively: datacenter/hosting/residential exits × Go/Chrome TLS stacks; headless browsers are blocked even without MITM).

The Google phishlet doesn’t MITM at all: victims interact with a pixel-faithful mirror of a real sign-in session running in a real (patchright) Chromium on the genuine accounts.google.com origin, through a residential exit. Every keystroke and click is relayed into that browser. Botguard always sees exactly what it wants to see.

6. Infrastructure visibility

Defeats: passive infrastructure analysis, CT-log monitoring, port scanning of the management plane.

7. Upstream egress routing

Defeats: IP-reputation blocklists at the provider (datacenter ASN blocklists) — and avoids creating suspicion (Entra flags residential logins on work accounts).

Per-domain-suffix egress routing (feature #17): google.com,gstatic.com,… → residential SOCKS5 exit; everything else (ms365) → node IP direct. Hot-applied via console/API. See proxy.

8. AES lure params

Defeats: URL analysis — tracking params in lure URLs are AES-256-GCM encrypted with a server-side key (no key material in the URL, unlike upstream’s RC4-key-in-URL scheme).

9. JS obfuscation

Defeats: static analysis of injected JavaScript.

-jsobf off/low/medium/high — string-array + rotation, a new variant per response. Never ultra (field-verified to break Microsoft login JS).


10. ClickFix gate hardening

Defeats: content-based phishing/SE classification of the fake-captcha gate (Safe Browsing page analysis, sandbox detonation, DLP content rules).

The clickfix templates follow the same CSD doctrine as the credential phishing pages:

  1. Zero sensitive content at load — instruction text, brand elements and the clipboard payload are all absent from the initial DOM. The page shows only a spinner. Content classifiers have nothing to match.
  2. Base64-encoded payload — the command is never cleartext in the source; decoded at runtime via atob().
  3. Lazy text injection — all SE keywords (“Win+R”, “Ctrl+V”) are base64 strings in the source, decoded and injected into the DOM only when the state machine advances after a user gesture.
  4. Brand lazy-reveal — logo and domain hidden until the first pointermove/keydown (same as ms365 CSD v2).
  5. Randomized fingerprint — no byte-identical page across loads.
  6. Generic title + inline SVG favicon + noindex — no brand impersonation in metadata; Cache-Control: no-store.

Detection hygiene (operational doctrine)

These are the operational evasions — they matter as much as the code: