projectdiscovery/nuclei · error

dialers not initialized for execution %s

Error message

dialers not initialized for execution %s

What it means

Internal guard in Client.RpcDump: protocolstate.GetDialersWithId(executionId) returned nil before dialing tcp/135. The per-execution fastdialer bundle (network policy, DNS cache, proxying) was never registered for this JS execution id. This is a nuclei runtime initialization/ordering defect or an unsupported embedding path — not a property of the target.

Source

Thrown at pkg/js/libs/dcerpc/dcerpc.go:212

}

// RpcDump enumerates every RPC endpoint registered with the EPMAPPER over
// ncacn_ip_tcp/135 (impacket: rpcdump.py).
//
// @example
// ```javascript
// const dcerpc = require('nuclei/dcerpc');
// const c = new dcerpc.Client('dc01', 'acme.local', 'admin', 'P@ss');
// const eps = c.RpcDump();
// for (const e of eps) { log(e.UUID + ' ' + e.Annotation); }
// ```
func (c *Client) RpcDump(ctx context.Context) ([]Endpoint, error) {
	if !protocolstate.IsHostAllowed(c.nj.ExecutionId(), c.Host) {
		return nil, protocolstate.ErrHostDenied.Msgf(c.Host)
	}
	dialer := protocolstate.GetDialersWithId(c.nj.ExecutionId())
	if dialer == nil {
		return nil, fmt.Errorf("dialers not initialized for execution %s", c.nj.ExecutionId())
	}
	conn, err := dialer.Fastdialer.Dial(ctx, "tcp", net.JoinHostPort(c.Host, strconv.Itoa(135)))
	if err != nil {
		return nil, fmt.Errorf("dial epmapper: %w", err)
	}
	defer func() { _ = conn.Close() }()

	rpc := gprpc.NewClientTCP(gprpc.NewTCPTransport(conn))
	if err := rpc.Bind(gpepm.UUID, gpepm.MajorVersion, gpepm.MinorVersion); err != nil {
		return nil, fmt.Errorf("epmapper bind: %w", err)
	}
	epm := gpepm.NewEpmClient(rpc)
	return epm.Lookup()
}

// SamrEnumerateUsers connects to SAMR and returns every domain user record
// (impacket: samrdump.py).
//

View on GitHub (pinned to 265b3a3dec)

Solutions

  1. Upgrade (or pin) nuclei to a release where code templates execute normally.
  2. If embedding via lib/nuclei, ensure the full engine initialization (protocolstate/dialer setup) runs before executing templates.
  3. Report the bug with template and nuclei version — template code cannot fix a missing dialer table.
  4. Meanwhile use named-pipe methods (SamrEnumerateUsers, EnumServices) which dial through the per-client exec dialer path instead.
Defensive patterns

Strategy: fallback

Try / catch

let endpoints;
try {
  endpoints = c.RpcDump();
} catch (e) {
  if (String(e).includes('dialers not initialized')) {
    // runtime defect: fall back to named-pipe methods that use the exec dialer
    log('RpcDump unavailable in this execution; using pipe-based enumeration');
    endpoints = [];
  } else throw e;
}

Prevention

When it happens

Trigger: Calling c.RpcDump() in an execution context whose protocolstate dialers were never initialized: running code-protocol templates through lib/nuclei without the standard engine setup, a custom runner that skips dialer init, or a nuclei version regression in protocolstate wiring.

Common situations: Embedding nuclei as a library and invoking JS templates outside the normal runner; upgrading across a protocolstate refactor; test harnesses that construct the goja runtime manually.

Related errors


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/3c136e4ff752cb1d. Report an issue: GitHub.