diff --git a/common/proxy/httpdialer.go b/common/proxy/httpdialer.go index 3e34765..430a2d6 100644 --- a/common/proxy/httpdialer.go +++ b/common/proxy/httpdialer.go @@ -30,7 +30,9 @@ func (h *httpDialer) DialContext(ctx context.Context, network, address string) ( proxyConn, err := h.baseDial.DialContext(ctx, NetworkTCP, h.config.Address) if err != nil { atomic.AddInt64(&h.stats.FailedConnections, 1) + h.stats.mu.Lock() h.stats.LastError = err.Error() + h.stats.mu.Unlock() return nil, NewProxyError(ErrTypeConnection, ErrMsgHTTPConnFailed, ErrCodeHTTPConnFailed, err) } @@ -38,12 +40,16 @@ func (h *httpDialer) DialContext(ctx context.Context, network, address string) ( if err := h.sendConnectRequest(proxyConn, address); err != nil { _ = proxyConn.Close() // 错误处理路径,Close错误可忽略 atomic.AddInt64(&h.stats.FailedConnections, 1) + h.stats.mu.Lock() h.stats.LastError = err.Error() + h.stats.mu.Unlock() return nil, err } duration := time.Since(start) + h.stats.mu.Lock() h.stats.LastConnectTime = start + h.stats.mu.Unlock() atomic.AddInt64(&h.stats.ActiveConnections, 1) h.updateAverageConnectTime(duration) @@ -108,7 +114,8 @@ func (h *httpDialer) sendConnectRequest(conn net.Conn, address string) error { // updateAverageConnectTime 更新平均连接时间 func (h *httpDialer) updateAverageConnectTime(duration time.Duration) { - // 简单的移动平均 + h.stats.mu.Lock() + defer h.stats.mu.Unlock() if h.stats.AverageConnectTime == 0 { h.stats.AverageConnectTime = duration } else { diff --git a/common/proxy/tlsdialer.go b/common/proxy/tlsdialer.go index 2d09244..3af4292 100644 --- a/common/proxy/tlsdialer.go +++ b/common/proxy/tlsdialer.go @@ -50,7 +50,9 @@ func (t *tlsDialerWrapper) DialTLSContext(ctx context.Context, network, address if err := tlsConn.Handshake(); err != nil { _ = tcpConn.Close() // TLS握手失败,Close错误可忽略 atomic.AddInt64(&t.stats.FailedConnections, 1) + t.stats.mu.Lock() t.stats.LastError = err.Error() + t.stats.mu.Unlock() return nil, NewProxyError(ErrTypeConnection, ErrMsgTLSHandshakeFailed, ErrCodeTLSHandshakeFailed, err) } @@ -71,7 +73,8 @@ func (t *tlsDialerWrapper) DialTLSContext(ctx context.Context, network, address // updateAverageConnectTime 更新平均连接时间 func (t *tlsDialerWrapper) updateAverageConnectTime(duration time.Duration) { - // 简单的移动平均 + t.stats.mu.Lock() + defer t.stats.mu.Unlock() if t.stats.AverageConnectTime == 0 { t.stats.AverageConnectTime = duration } else { diff --git a/plugins/services/findnet.go b/plugins/services/findnet.go index 2c66cf8..9bdd009 100644 --- a/plugins/services/findnet.go +++ b/plugins/services/findnet.go @@ -169,7 +169,9 @@ func (p *FindNetPlugin) performNetworkDiscovery(conn net.Conn) (*NetworkInfo, er // 查找响应结束标记 for i := 0; i < len(responseData)-5; i++ { if bytes.Equal(responseData[i:i+6], rpcBuffer3) { - responseData = responseData[:i-4] + if i >= 4 { + responseData = responseData[:i-4] + } break } } diff --git a/plugins/services/ms17010.go b/plugins/services/ms17010.go index 5884914..0c22b4f 100644 --- a/plugins/services/ms17010.go +++ b/plugins/services/ms17010.go @@ -319,7 +319,7 @@ func (p *MS17010Plugin) checkMS17010Vulnerability(ip string, config *common.Conf } n, readErr = conn.Read(reply) - if readErr != nil || n < 36 { + if readErr != nil || n < 45 { return false, "", fmt.Errorf("SMB会话建立失败") } @@ -330,7 +330,7 @@ func (p *MS17010Plugin) checkMS17010Vulnerability(ip string, config *common.Conf // 提取系统信息 var osVersion string sessionSetupResponse := reply[36:n] - if wordCount := sessionSetupResponse[0]; wordCount != 0 { + if wordCount := sessionSetupResponse[0]; wordCount != 0 && len(sessionSetupResponse) >= 10 { byteCount := binary.LittleEndian.Uint16(sessionSetupResponse[7:9]) if n == int(byteCount)+45 { for i := 10; i < len(sessionSetupResponse)-1; i++ { diff --git a/webscan/lib/Eval.go b/webscan/lib/Eval.go index 308c0a4..48cf091 100644 --- a/webscan/lib/Eval.go +++ b/webscan/lib/Eval.go @@ -33,16 +33,13 @@ var ( // 包级POC配置 var ( - pocConfigOnce sync.Once - pocDNSLog bool // DNSLog配置缓存 + pocDNSLog bool // DNSLog配置缓存 ) -// InitPOCConfig 初始化POC配置(在扫描开始前调用一次) +// InitPOCConfig 初始化POC配置(在扫描开始前调用) // 这样CEL回调函数可以使用包级变量而非GetGlobalConfig func InitPOCConfig(dnsLog bool) { - pocConfigOnce.Do(func() { - pocDNSLog = dnsLog - }) + pocDNSLog = dnsLog } // NewEnv 创建一个新的 CEL 环境(使用缓存避免重复注册函数) diff --git a/webscan/web_scan.go b/webscan/web_scan.go index 0246a5d..1089c7a 100644 --- a/webscan/web_scan.go +++ b/webscan/web_scan.go @@ -56,7 +56,9 @@ func WebScan(ctx context.Context, info *common.HostInfo, cfg *common.Config) { if !pocLoaded { cachedPocPath = cfg.POC.PocPath initPocs() - pocLoaded = true + if len(allPocs) > 0 { + pocLoaded = true + } } pocMu.Unlock()