fscan/plugins/legacy/smb/smb1/connector.go
ZacharyZcR daa7fb2dcb refactor: 重构SMB和SMB2插件架构,大幅减少代码重复
- 创建通用SMB框架,包含抽象接口、凭据管理和并发扫描引擎
- SMB2插件代码量从492行减少到159行,减少68%代码量
- 统一错误分类和处理机制,提高代码可维护性
- 支持密码和哈希两种认证方式,保持向后兼容性
- 模块化设计便于单元测试和功能扩展
2025-08-12 19:11:40 +08:00

86 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}