Skip to main content

System Architecture

High-Level Overview

Component Interaction Flow

1

Initialization

Server spawns initial Chrome instance (“empty phishbowl”) with Xvfb, navigates to target, loads broadcast page
2

Victim Connection

Victim HTTP request → Caddy → Fastify → Serves cuddlephish.html → Victim browser connects via WebSocket
3

Browser Pairing

Server pairs victim socket with available browser socket, prepares WebRTC negotiation
4

WebRTC Establishment

Browser broadcasts offer → Server relays to victim → Victim sends answer → ICE candidates exchanged
5

Video Streaming

Peer-to-peer WebRTC video stream established (Chrome → Victim), input forwarding enabled
6

Control Flow

Victim inputs → WebSocket → Server → Chrome DevTools Protocol → Browser actions

Core Components

index.js - Main Server

The primary orchestration component built on Fastify and Socket.io.

Key Data Structures

Browser Objects:
browsers Array: Extended Array with custom .get() method:

HTTP Routes

Victim Route (/*):
Admin Route (/admin):
Broadcast Route (/broadcast):

WebSocket Events

Browser Events: new_broadcast:
new_thumbnail:
video_stream_offer/answer:
Victim Events: new_phish:
mouse_event:
keydown/keyup:
Admin Events: take_over_browser:
get_cookies:
remove_instance:

Browser Lifecycle Management

Spawning Browsers: get_browser()

Browser Removal

WebRTC Implementation

Broadcast Side (broadcast.html)

Display Capture:
Peer Connection Setup:
Thumbnail Generation:

Viewer Side (cuddlephish.html)

Peer Connection Setup:
ICE Candidate Exchange:

Input Forwarding

Mouse Events

Capture:
Application:

Keyboard Events

Capture:
Application:
Keylog Processing:

Credential Extraction

Chrome DevTools Protocol Integration

Cookie Extraction:
Data Structure:

Window Resizing

The resize_window.js module dynamically resizes browser windows to match controller viewports.

Security Mechanisms

Access Control

Admin IP Whitelisting:
Socket Authentication:
Broadcast Route Protection:

Stealth Features

Puppeteer-Extra Stealth Plugin:
Stealth plugin modifies:
  • navigator.webdriver (removes automation indicator)
  • navigator.plugins (adds realistic plugin list)
  • navigator.languages (adds realistic language settings)
  • Chrome DevTools Protocol detection evasions
User-Agent Override:
Also sets navigator.platform to match user-agent OS instead of “Linux”. Automation Flags Removed:

Performance Considerations

Resource Usage Per Browser

  • Memory: 500MB - 1GB per Chrome instance
  • CPU: 10-20% per instance during active use
  • Disk: ~50MB per user_data directory
  • Network: 2-5 Mbps per WebRTC stream (bandwidth dependent on video quality)

Scaling Limits

Single Server:
  • Recommended: 5-10 concurrent victims
  • Maximum: 20-30 concurrent victims (with sufficient resources)
Bottlenecks:
  • RAM consumption by Chrome instances
  • CPU for video encoding/decoding
  • Network bandwidth for WebRTC streams
  • Xvfb overhead for multiple displays

Optimization Strategies

Reduce Thumbnail Frequency:
Lower Video Frame Rate:
Implement Browser Pool:
  • Pre-spawn browsers during low-activity periods
  • Reuse browser instances for multiple victims (clear cookies between uses)
  • Implement browser instance timeout and auto-cleanup

Next Steps