Skip to content

Demo data

just demo fills SuckerPot with synthetic attack data. Use it to try the pipeline and the dashboard, to develop against it, and to make screenshots.

The demo data is fake. The generator never contacts real attackers and never sends traffic to the internet. It publishes events to Redis the same way a sensor does, so the rest of the pipeline is tested too.

Terminal window
just demo

This runs the demo service from docker-compose.yml, which is in the tools profile. It is not started by docker compose up. It connects to Redis as its own demo user. That user can only XADD to the events:* streams, the same kind of permission a real sensor has, and it sits on its own internal network (tools) that reaches Redis and nothing else.

You can also run it without just:

Terminal window
docker compose --profile tools run --rm demo

Arguments after just demo go to the generator:

Terminal window
just demo --days 3 --sessions 200 --seed 7

Some demo droppers use a few shared hosts (documentation addresses and example domains) and carry made-up payload hashes, so the Infrastructure page has shared infrastructure to show. Every demo event carries demo: true, so the extraction keeps these documentation addresses and example (.example, .test) domains, flags them, and never sends them to an intel service. Only the source addresses of the demo sessions look like public addresses. just demo prints a note when intel keys are set.

Telnet loaders reuse a few probe words and several droppers share hosts, so with ATTACK_ENABLED=true and CAMPAIGNS_ENABLED=true in .env the Campaigns and Techniques pages fill with demo campaigns a few minutes after just demo (ingest groups finished sessions every five minutes).

The generator first creates a backfill: sessions spread over the last --days days. Then, with --live, it keeps sending new sessions. Each session is a short story made of events. The four sensors are covered:

SensorSession types in the generatorExample story
SSHPassword guessing, successful login with reconnaissance, persistence attempts, a miner installTried a list of passwords, then logged in and ran a miner
TelnetSingle logins, and botnet waves that arrive togetherPart of a coordinated wave of weak-password attempts
WebGeneric HTTP scanning, WordPress login probes, and PHP upload probesLooked for admin pages, then tried an exploit
RDPConnection probes, NTLM logins (some with a decoy password), BlueKeep-style channel probes, and standard clients (FreeRDP, mstsc, nmap and others)Tried one username, or logged in with a common password and was refused

Some SSH sessions come from one campaign: a single source tries many passwords. The mix, the timing and the source addresses aim to look realistic, with busy hours, quiet nights and a few repeat visitors.

The generator uses only the documentation address ranges (192.0.2.0/24, 198.51.100.0/24 and 203.0.113.0/24). Nothing is captured from the internet.

OptionDefaultMeaning
--days NDEMO_DAYS (30)Spread the backfill over the last N days. Must be at least 1.
--sessions NDEMO_SESSIONS (3000)Number of backfill sessions
--seed NDEMO_SEED (42)Random seed. The same seed gives the same data.
--now ISOcurrent timeThe time to treat as “now”, for reproducible output, for example 2026-10-24T12:00:00Z
--liveoffAfter the backfill, keep sending new sessions until you stop it with Ctrl+C. Use just demo-live for this.
--live-onlyoffSkip the backfill and send new sessions only
--live-min S1.0Minimum seconds between live sessions
--live-max S8.0Maximum seconds between live sessions
--live-speed X1.0Time compression for the events of one live session
--dry-runoffPrint the events as JSON lines on standard output, and send nothing to Redis

Defaults come from .env. Command-line options override them.

Terminal window
# Print 2 days of events as JSON lines, without touching Redis
docker compose --profile tools run --rm demo --days 2 --sessions 50 --dry-run

Each run adds data. To start from scratch on purpose, stop the stack and remove the database volume by name (docker volume rm suckerpot_db-data); docker compose down -v no longer deletes the data volumes, which are external. See Deployment. This deletes all data, real or fake.

Every screenshot in the README and in these docs comes from demo data. Never take a screenshot of a real capture. Real attack data contains attacker addresses, credentials and payloads, and the repository is public.