Files
fscan/common/initialize.go
T
ZacharyZcR e504c22d82 fix: 修复-user/-pwd凭据参数不生效的问题
问题原因:
- Parse()解析凭据后更新globalConfig
- 但BuildConfigFromFlags()创建新Config时使用默认字典
- 导致解析的UserPassPairs等凭据信息被丢弃

修复内容:
1. initialize.go: 将Parse解析的凭据结果应用到新Config
2. credential.go: 单用户密码对时创建UserPassPairs
3. rdp.go: 单凭据测试时跳过指纹识别,减少连接次数
2026-01-15 00:10:50 +08:00

114 lines
2.5 KiB
Go

package common
import (
"fmt"
)
/*
initialize.go - 统一初始化入口
将分散的初始化步骤整合为单一入口,简化 main.go。
*/
// InitResult 初始化结果
type InitResult struct {
Config *Config
State *State
Info *HostInfo
}
// Initialize 统一初始化函数
// 封装 Parse → InitGlobalConfigAndState → InitOutput 流程
// 返回可直接使用的 Config 和 State 对象
func Initialize(info *HostInfo) (*InitResult, error) {
// 初始化日志系统
InitLogger()
// 解析和验证参数(会更新 globalConfig 的凭据信息)
if err := Parse(info); err != nil {
return nil, fmt.Errorf("参数解析失败: %w", err)
}
// 获取 Parse 更新过的凭据信息
parsedCreds := GetGlobalConfig().Credentials
// 从 FlagVars 构建 Config(新架构)
cfg := BuildConfigFromFlags(flagVars)
state := NewState()
// 关键修复:应用 Parse 解析的凭据结果到新 Config
// Parse 会根据 -user/-pwd/-usera/-pwda 等参数更新凭据
if len(parsedCreds.UserPassPairs) > 0 {
cfg.Credentials.UserPassPairs = parsedCreds.UserPassPairs
}
if len(parsedCreds.Userdict) > 0 {
cfg.Credentials.Userdict = parsedCreds.Userdict
}
if len(parsedCreds.Passwords) > 0 {
cfg.Credentials.Passwords = parsedCreds.Passwords
}
if len(parsedCreds.HashValues) > 0 {
cfg.Credentials.HashValues = parsedCreds.HashValues
}
if len(parsedCreds.HashBytes) > 0 {
cfg.Credentials.HashBytes = parsedCreds.HashBytes
}
// 设置全局实例
SetGlobalConfig(cfg)
SetGlobalState(state)
// 初始化输出系统
if err := InitOutput(); err != nil {
return nil, fmt.Errorf("输出初始化失败: %w", err)
}
return &InitResult{
Config: cfg,
State: state,
Info: info,
}, nil
}
// ValidateExclusiveParams 验证互斥参数
// 检查 -h、-u、-local 只能指定一个
func ValidateExclusiveParams(info *HostInfo) error {
paramCount := 0
var activeParam string
fv := GetFlagVars()
if info.Host != "" {
paramCount++
activeParam = "-h"
}
if fv.TargetURL != "" {
paramCount++
if activeParam != "" {
activeParam += " 和 -u"
} else {
activeParam = "-u"
}
}
if fv.LocalPlugin != "" {
paramCount++
if activeParam != "" {
activeParam += " 和 -local"
} else {
activeParam = "-local"
}
}
if paramCount > 1 {
return fmt.Errorf("参数 %s 互斥,请只指定一个扫描目标\n -h: 网络主机扫描\n -u: Web URL扫描\n -local: 本地信息收集", activeParam)
}
return nil
}
// Cleanup 清理资源
// 应该在程序退出前调用
func Cleanup() error {
return CloseOutput()
}