package smb1 import ( "context" "fmt" "github.com/shadow1ng/fscan/plugins/legacy/smb/common" "github.com/stacktitan/smb/smb" ) // Smb1Connector SMB1连接器实现 type Smb1Connector struct{} // NewSmb1Connector 创建SMB1连接器 func NewSmb1Connector() *Smb1Connector { return &Smb1Connector{} } // Connect 建立SMB1连接并进行认证 func (c *Smb1Connector) Connect(ctx context.Context, target *common.TargetInfo, cred *common.Credential) (*common.ConnectionResult, error) { // SMB1不支持哈希认证 if cred.IsHash { return nil, fmt.Errorf("SMB1不支持哈希认证") } // 创建信号通道用于与原有代码兼容 signal := make(chan struct{}, 1) // 调用原有的SMB连接函数 success, err := c.smbConnect(target.Host, target.Port, target.Domain, cred.Username, cred.Password, signal) result := &common.ConnectionResult{ Success: success, Error: err, } // SMB1暂时不获取共享列表,保持原有行为 if success { result.Shares = []string{} result.HasAdminAccess = true // SMB1连接成功通常意味着有访问权限 } return result, nil } // GetProtocolName 获取协议名称 func (c *Smb1Connector) GetProtocolName() string { return "SMB" } // GetDefaultPort 获取默认端口 func (c *Smb1Connector) GetDefaultPort() int { return 445 } // smbConnect 原有的SMB连接实现(改进版本) func (c *Smb1Connector) smbConnect(host string, port int, domain, user, pass string, signal chan struct{}) (bool, error) { options := smb.Options{ Host: host, Port: port, User: user, Password: pass, Domain: domain, Workstation: "", } session, err := smb.NewSession(options, false) if err == nil { defer session.Close() if session.IsAuthenticated { return true, nil } return false, common.ErrAuthFailed } // 分类和处理错误 classifiedError := common.ClassifySmbError(err) signal <- struct{}{} return false, classifiedError }