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

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"
}