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
- Upgrade (or pin) nuclei to a release where code templates execute normally.
- If embedding via lib/nuclei, ensure the full engine initialization (protocolstate/dialer setup) runs before executing templates.
- Report the bug with template and nuclei version — template code cannot fix a missing dialer table.
- 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
- Keep nuclei updated; this error indicates a runtime/initialization defect, not a target issue.
- When embedding via lib/nuclei, run the standard engine initialization before executing code templates.
- Don't build templates that depend solely on RpcDump — keep a 445-based enumeration path.
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
- krbroast: no executionId on goja runtime
- dialers not initialized for %s
- dialers not initialized for %s
- dialers not initialized for %s
- dialers not initialized for %s
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/3c136e4ff752cb1d.
Report an issue: GitHub.