Skip to content

Dashboard

The Dashboard is the first page operators see after logging in. It provides a real-time operational summary of the C2 infrastructure -- active beacons, running listeners, sessions, campaigns -- alongside charts and an activity feed that aggregate data from multiple sources.


Overview

The dashboard is composed of four sections:

  1. Stat cards -- animated counters showing active beacons, running listeners, sessions, and campaigns
  2. Charts row -- beacon status distribution (donut), OS distribution (donut), and a 24-hour check-in timeline (area chart)
  3. Activity feed -- a unified timeline merging beacon check-ins, listener state changes, and campaign updates
  4. Quick actions -- shortcut buttons for common operator tasks
graph TB
    subgraph Dashboard
        A[Stat Cards Row]
        B[Charts Row]
        C[Activity Feed]
        D[Quick Actions]
    end

    subgraph "Data Sources"
        E[Beacons API]
        F[Listeners API]
        G[Sessions API]
        H[Campaigns API]
        I[Stats API]
    end

    E --> A
    E --> B
    E --> C
    F --> A
    F --> C
    G --> A
    H --> A
    H --> C
    I --> A

Stat Cards

The top row displays four animated stat cards with live counters. Each card links to its respective management page.

Card Value Link
Active Beacons Active / Total beacons Cockpit
Listeners Running / Total listeners Listeners
Sessions Total sessions across campaigns Campaigns
Campaigns Active / Total campaigns Campaigns

Cards use staggered entrance animations on page load and animated number transitions when values change. A card turns green when its primary metric is non-zero (e.g., at least one active beacon or running listener).

Active beacon calculation

A beacon is considered "active" if its last check-in is within 1.5x its configured sleep interval. For example, a beacon with a 60-second sleep is active if it checked in within the last 90 seconds. This same threshold is used throughout the platform.


Charts

The charts row displays three visualizations side by side, each with a freshness indicator showing when the underlying data was last refreshed.

Beacon Status Distribution

A donut chart showing the count of beacons in each status category:

Status Color Meaning
ACTIVE Green Checked in within the expected interval
DORMANT Yellow Missed expected check-in but not yet dead
DEAD Red No check-in for an extended period

The center of the donut displays the total beacon count. When no beacons exist, a placeholder message is shown instead.

OS Distribution

A donut chart breaking down beacons by operating system. OS names are normalized for clarity:

  • windows (amd64) becomes Windows
  • OS strings containing server become Windows Server
  • linux variants become Linux
  • darwin / macos variants become macOS

When only a single OS is present, the chart displays a large numeric count instead of a donut.

Check-in Timeline (24h)

An area chart showing beacon check-in activity over the last 24 hours, bucketed by hour. The chart includes:

  • Hourly check-in counts along the Y axis
  • Hour labels (HH:00) along the X axis
  • A gradient fill under the area line
  • A peak count summary below the chart

Activity Feed

The activity feed merges events from three sources into a single reverse-chronological timeline (newest first), displaying the 30 most recent events.

Event Type Source Display
beacon_checkin Beacons Hostname, IP, username, OS, and beacon status badge
listener_change Listeners Listener name, status, protocol and bind address
campaign_change Campaigns Campaign name, status, beacon and credential counts

Each event shows:

  • A color-coded status dot (green for active/running, yellow for dormant/paused, red for dead/error, gray for stopped/archived)
  • An icon indicating the event type (signal for beacons, radio for listeners, target for campaigns)
  • A relative timestamp (e.g., "3 minutes ago")
  • A status badge

Interactive elements

Beacon hostnames in the activity feed display a hover card with detailed beacon information (PID, integrity level, sleep interval). IP addresses support click-to-copy for quick use in other tools.

Freshness Indicator

Both the charts and the activity feed display a freshness indicator showing when the underlying data was last fetched. This helps operators distinguish between stale data and a genuinely quiet engagement.


Quick Actions

The quick actions panel on the right side of the dashboard provides one-click navigation to common tasks:

Action Destination Description
New Listener /listeners/new Create a C2 listener
Generate Payload /payloads/generate Build a new implant
Open Cockpit /cockpit Topology and shell access
View Beacons /cockpit Active C2 implants

Stats API

The dashboard stat cards are powered by a consolidated stats endpoint that returns all sidebar badge counts in a single response. This avoids N+1 API calls when rendering the sidebar and dashboard simultaneously.

curl -s https://stentor.app/api/v1/stats/counts \
  -H "Authorization: Bearer $TOKEN" | jq
{
  "active_beacons": 3,
  "running_listeners": 2,
  "targets": 47,
  "services": 156,
  "credentials": 12,
  "downloads": 8,
  "keystrokes": 3,
  "screenshots": 5
}

Response fields:

Field Type Description
active_beacons int Beacons currently within their check-in threshold (computed from in-memory registry)
running_listeners int Listeners with status running
targets int Total discovered targets
services int Total discovered network services
credentials int Total harvested credentials
downloads int Total downloaded files
keystrokes int Total keystroke capture records
screenshots int Total captured screenshots

Active beacons are computed in real-time

The active_beacons count is not a database query -- it is computed from the in-memory BeaconRegistry by checking each beacon's last_seen against a threshold of 1.5x its sleep interval. All other counts come from database aggregation queries.


Data Refresh

Dashboard data refreshes automatically through React Query's polling mechanism:

Data Source Refresh Interval Method
Beacons 10 seconds Polling via useBeacons hook
Listeners Default (on focus) Polling via useListeners hook
Sessions Default (on focus) Polling via useSessions hook
Campaigns Default (on focus) Polling via useC2Campaigns hook

Beacon data refreshes most frequently (every 10 seconds) because check-in recency is critical for operational awareness. Other data sources refresh on window focus or navigation, which is sufficient for less volatile data.


Next Steps

  • UI Walkthrough -- learn how to navigate the full operator interface
  • Core Concepts -- understand beacons, listeners, and the C2 lifecycle