Skip to content

Sensors

Sensors are the fake services that face the internet. Each one speaks just enough of a protocol to look real, records what the attacker does, and publishes it as events. A sensor never runs attacker input and never makes an outbound connection.

SuckerPot runs twelve sensors in four families. The family sets the colour in the dashboard. The sensor name and icon tell them apart.

FamilySensorFake serviceHost port (default)Stream
Remote shellsSSHOpenSSH 9.6 on Ubuntu, with an emulated shell22events:ssh
Remote shellsTelnetBusyBox-style DVR or router login23events:telnet
Remote shellsADBAndroid TV box with adbd and no authentication5555events:adb
Web and APIsWebApache 2.4 with PHP 8.3 (unpatched), WordPress and phpMyAdmin80 and 443events:web
Web and APIsDockerExposed Docker Engine API (dockerd 27.3.1)2375events:docker
Web and APIsSynologySynology NAS with unpatched DSM 7.2.1: login page and Web API, over HTTP and HTTPS5000 and 5001events:synology
DatabasesRedisRedis 7.2 with no password6379events:redis
DatabasesMySQLMySQL 8.0 with weak logins3306events:mysql
DatabasesMSSQLSQL Server 2019 or 2022 with weak logins1433events:mssql
Windows and VoIPRDPWindows Server 2022 with NLA: NTLM logins, decoy password checks, optional cleartext mode3389events:rdp
Windows and VoIPSMBWindows Server file service, observation only445events:smb
Windows and VoIPSIPAsterisk-style PBX on UDP and TCP5060 (UDP and TCP)events:sip

All twelve are wired into docker-compose.yml. The web and Synology sensors are still under security review (see the roadmap).

  • No execution. No subprocess, os.system, eval or exec on attacker input. Fake commands return canned or generated output.
  • No fetching. A download command only records the URL. Fetching, when it exists, is done by ingest and is off by default.
  • No outbound traffic. A sensor sits on sp-ingress (inbound only) and on its own internal network to reach Redis. See Architecture.
  • Bounded everything. Connection caps (total and per source IP), timeouts on every read, a size cap on every captured field, a memory budget, and bounded queues.
  • A watchdog. Docker does not restart a container that is only unhealthy. Each sensor runs a watchdog thread that exits the process when the event loop stalls, so restart: unless-stopped brings it back.
  • Drop, never block. When Redis refuses a write, the event is dropped and counted. A sensor never waits for Redis inside a connection handler.
  • Its own stream and Redis user. A sensor can only XADD to its own stream. Ingest checks that the sensor field of every event matches the stream.
  • Realistic identity. Plausible banners and host names. The words “honeypot” and “suckerpot” never appear anywhere a client could see.
  • No events from the health check. Connections from loopback (the container health check) produce no events.