Skip to main content

VNC

Synopsis

Creates a decoy VNC server that emulates the RFB protocol handshake far enough to receive a client's authentication response. Every connection attempt is logged, along with the DES challenge/response pair needed to crack the client's password offline. Authentication always fails and no framebuffer is ever served.

Schema

- id: <numeric>
name: <string>
description: <string>
type: vnc
tags: <string[]>
pipelines: <pipeline[]>
status: <boolean>
properties:
address: <string>
port: <numeric>
timeout: <numeric>

Configuration

The following fields are used to define the device:

Device

FieldRequiredDefaultDescription
idYUnique identifier
nameYDevice name
descriptionN-Optional description
typeYMust be vnc
tagsN-Optional tags
pipelinesN-Optional pre-processor pipelines
statusNtrueEnable/disable the device

Connection

FieldRequiredDefaultDescription
addressN"0.0.0.0"Listen address
portYListen port. VNC display :0 is 5900.
timeoutN20Idle timeout in seconds

Ingest Buffer

FieldRequiredDefaultDescription
max_buffer_sizeN128MBIngest buffer admission cap. Also sets this listener's eager heap reservation
note

max_buffer_size is the ingest-buffer admission cap, and is distinct from any buffer_size field above, which sizes the network read buffer. Left unset it is 128MB, which commits 384 MiB of heap per listener worker before any data arrives — and with reuse: true a device runs one worker per listener. Size strings are binary, and 32MB and 32MiB are exact synonyms.

See Listener Memory Sizing for the arithmetic, the sizing table, and what happens when the cap is exhausted.

Details

Handshake

On connection, the honeypot announces RFB 003.008\n and reads the client's 12-byte version string, logging a connection event with the reported client_version.

The security handshake branches on the client's minor version. For version 3.7 and later, the honeypot offers a one-entry security-type list containing VNC Authentication and reads the client's chosen type. For version 3.3, the security type is not negotiated — the honeypot dictates VNC Authentication as a 4-byte big-endian value.

The honeypot then sends a cryptographically random 16-byte challenge and reads the client's 16-byte DES response, logging an auth_attempt event with the hex-encoded challenge and response. Authentication always fails: the honeypot returns a SecurityResult of 1 with the reason "Authentication failure". No framebuffer is ever served — there is no screen content behind this device.

Logged Events

Each connection produces one or both of the following event types:

event_typeEmitted when
connectionThe client sends its RFB protocol version
auth_attemptThe client answers the authentication challenge

Event Fields

Every event carries timestamp, event_type, source_ip, source_port, and local_addr. The remaining fields depend on the event type:

FieldDescription
client_versionRFB protocol version string reported by the client
auth_methodAlways vnc
challenge16-byte random challenge sent to the client, hex-encoded
response16-byte DES response returned by the client, hex-encoded
vnc_hashCrackable hash assembled from the challenge and response

Captured Hashes

vnc_hash is formatted as $vnc$*<CHALLENGE_HEX>*<RESPONSE_HEX>, directly usable with John the Ripper's vnc format.

Examples

The following are commonly used configuration types.

Basic

Minimal VNC honeypot listening on the standard display :0 port:

Creating a simple VNC honeypot...

devices:
- id: 1
name: basic_vnc
type: vnc
properties:
port: 5900

Non-Standard Port

Running the honeypot on a high port so it does not require elevated privileges:

Running VNC honeypot on an unprivileged port...

devices:
- id: 2
name: unprivileged_vnc
type: vnc
properties:
address: "0.0.0.0"
port: 15900
timeout: 30

With Pre-Processing

Routing captured events through a pipeline before they reach a target:

Attaching a pre-processing pipeline to a VNC honeypot...

devices:
- id: 3
name: monitored_vnc
type: vnc
pipelines:
- honeypot_enrichment
properties:
port: 5900
timeout: 20

A cracked login attempt produces an auth_attempt event...

{
"timestamp": "2026-08-03T14:22:07.481937204Z",
"event_type": "auth_attempt",
"source_ip": "203.0.113.44",
"source_port": "51422",
"local_addr": "10.0.4.12:5900",
"client_version": "RFB 003.008",
"auth_method": "vnc",
"challenge": "3af1c9e0d4b27a68f5e13c0a9d2b7614",
"response": "8b1e4a7c2f905d3e6a1c48b0f2e9d735",
"vnc_hash": "$vnc$*3af1c9e0d4b27a68f5e13c0a9d2b7614*8b1e4a7c2f905d3e6a1c48b0f2e9d735"
}