From 653f11295a8705b43bba2ef2a0df5c002e80c577 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Mon, 27 Apr 2026 21:34:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A1=A5=E5=85=A8=20HTTP/TLS=20proxy=20?= =?UTF-8?q?stats=20=E5=8A=A0=E9=94=81=EF=BC=8C=E4=BF=AE=E5=A4=8D=20RPC/SMB?= =?UTF-8?q?=20=E8=A7=A3=E6=9E=90=E8=B6=8A=E7=95=8C=E5=92=8C=20POC=20?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - httpdialer.go/tlsdialer.go: LastError/LastConnectTime/AverageConnectTime 加 mutex - findnet.go: RPC 响应结束标记位置 < 4 时跳过截断,防止负数切片 panic - ms17010.go: SMB 会话响应最小长度改为 45,sessionSetupResponse 加长度校验 - web_scan.go: POC 加载失败时不标记 pocLoaded,允许后续重试 - Eval.go: DNSLog 配置去掉 sync.Once,允许多次扫描更新配置 --- common/proxy/httpdialer.go | 9 ++++++++- common/proxy/tlsdialer.go | 5 ++++- plugins/services/findnet.go | 4 +++- plugins/services/ms17010.go | 4 ++-- webscan/lib/Eval.go | 9 +++------ webscan/web_scan.go | 4 +++- 6 files changed, 23 insertions(+), 12 deletions(-) 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()