{"record":{"id":"e2aa6024cbbd468e","repo":"shadow1ng/fscan","slug":"s-e2aa60","errorCode":null,"errorMessage":"%s","messagePattern":"%s","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"info","filePath":"plugins/services/findnet.go","lineNumber":49,"sourceCode":"func NewFindNetPlugin() *FindNetPlugin {\n\treturn &FindNetPlugin{\n\t\tBasePlugin: plugins.NewBasePlugin(\"findnet\"),\n\t}\n}\n\n// GetPorts 实现Plugin接口\n\n// Scan 执行FindNet扫描 - Windows网络信息收集\nfunc (p *FindNetPlugin) Scan(ctx context.Context, info *common.HostInfo, session *common.ScanSession) *ScanResult {\n\tconfig := session.Config\n\ttarget := info.Target()\n\n\t// 检查是否为RPC端口\n\tif info.Port != 135 {\n\t\treturn &ScanResult{\n\t\t\tSuccess: false,\n\t\t\tService: \"findnet\",\n\t\t\tError:   fmt.Errorf(\"%s\", i18n.Tr(\"service_port_restriction\", \"FindNet\", \"135\")),\n\t\t}\n\t}\n\n\tconn, err := session.DialTCP(ctx, \"tcp\", target, config.ModuleTimeout())\n\tif err != nil {\n\t\treturn &ScanResult{\n\t\t\tSuccess: false,\n\t\t\tService: \"findnet\",\n\t\t\tError:   fmt.Errorf(i18n.Tr(\"service_conn_port_failed\", \"%w\"), err),\n\t\t}\n\t}\n\tdefer func() { _ = conn.Close() }()\n\n\t// 设置超时\n\t_ = conn.SetDeadline(time.Now().Add(config.ModuleTimeout()))\n\n\t// 执行RPC网络发现\n\tnetworkInfo, err := p.performNetworkDiscovery(conn)","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/shadow1ng/fscan/blob/95cc12e753bf43de7004e5aef42a9ffba3934303/plugins/services/findnet.go#L31-L67","documentation":"The FindNet plugin only operates on Windows RPC endpoint mapper port 135; Scan rejects any other port up front with i18n key service_port_restricted, naming the service and the required port. It is a deliberate input guard, not a runtime failure — the protocol cannot function on a different port.","triggerScenarios":"Calling the findnet plugin's Scan (directly or via the plugin registry) with a HostInfo whose Port is anything other than 135.","commonSituations":"Auto-discovery feeding the plugin ports found open on the host (e.g. 445, 139); a misconfigured target list that includes non-RPC ports; running the plugin against a non-Windows host where the port mapping is meaningless.","solutions":["Restrict the target list for the findnet module to port 135 hosts.","If scanning a different port is intentional, use the appropriate plugin (e.g. smb/netbios plugins for 445/139).","Filter plugin invocation by port so port-aware registration (RegisterPluginWithPorts) routes only 135 targets to findnet.","No code fix applies — the port restriction is by protocol design."],"exampleFix":"// before\nres := findnetPlugin.Scan(ctx, &common.HostInfo{Host: \"10.0.0.5\", Port: 445}, session)\n// after\nif info.Port == 135 {\n    res = findnetPlugin.Scan(ctx, info, session)\n} else {\n    res = smbPlugin.Scan(ctx, info, session)\n}","handlingStrategy":"validation","validationCode":"if info.Port != 135 {\n    return fmt.Errorf(\"findnet requires port 135, got %d; use another plugin\", info.Port)\n}","typeGuard":null,"tryCatchPattern":"res := plugin.Scan(ctx, info, session)\nif !res.Success && res.Error != nil && strings.Contains(res.Error.Error(), \"135\") {\n    log.Printf(\"wrong port %d for findnet; routing to smb plugin\", info.Port)\n    res = smbPlugin.Scan(ctx, info, session)\n}","preventionTips":["Route plugins by port using RegisterPluginWithPorts metadata","Filter target lists per module before scanning","Never force the findnet plugin onto non-RPC ports","Document the 135-only constraint in scan configs"],"tags":["go","windows","rpc","port-restriction"],"backgroundTag":"invalid-argument-value","analyzedSha":"95cc12e753bf43de7004e5aef42a9ffba3934303","analyzedAt":"2026-09-06T17:07:30.094Z","contentChangedAt":"2026-09-06T17:07:30.094Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}