mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

- 创建通用SMB框架,包含抽象接口、凭据管理和并发扫描引擎 - SMB2插件代码量从492行减少到159行,减少68%代码量 - 统一错误分类和处理机制,提高代码可维护性 - 支持密码和哈希两种认证方式,保持向后兼容性 - 模块化设计便于单元测试和功能扩展
86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
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
|
||
} |