fscan/Common/config/ServiceDict.go
ZacharyZcR b436c0d546 refactor: 大规模精简代码结构,移除冗余函数和优化模块
核心优化:
- 移除大量未使用的函数和方法,显著减少代码复杂度
- 精简多个子模块的接口定义和类型声明
- 优化Bridge.go桥接层,统一API调用接口
- 简化Parse.go主解析逻辑,提高代码可读性

模块精简:
- config模块:简化配置管理接口,移除冗余配置项
- logging模块:精简日志格式化和处理逻辑
- output模块:优化输出管理和统计功能
- parsers模块:简化类型定义和解析接口

性能提升:
- 减少不必要的函数调用开销
- 优化内存分配和垃圾回收压力
- 简化模块间依赖关系
- 提升编译速度和运行效率

安全验证:
- 编译测试完全通过,无编译错误或警告
- 功能完整性验证通过,所有核心功能正常
- 静态分析确认无隐藏依赖或反射调用风险
- 运行时测试验证系统稳定性和正确性
2025-08-05 20:00:50 +08:00

258 lines
7.1 KiB
Go

package config
import (
"strings"
"sync"
)
// ServiceDictionary 服务字典管理器
type ServiceDictionary struct {
mu sync.RWMutex
userDict map[string][]string
passwords []string
initialized bool
}
// NewServiceDictionary 创建服务字典管理器
func NewServiceDictionary() *ServiceDictionary {
return &ServiceDictionary{
userDict: getDefaultUserDict(),
passwords: getDefaultPasswords(),
initialized: true,
}
}
// getDefaultUserDict 获取默认用户字典
func getDefaultUserDict() map[string][]string {
return map[string][]string{
"ftp": {"ftp", "admin", "www", "web", "root", "db", "wwwroot", "data"},
"mysql": {"root", "mysql"},
"mssql": {"sa", "sql"},
"smb": {"administrator", "admin", "guest"},
"rdp": {"administrator", "admin", "guest"},
"postgresql": {"postgres", "admin"},
"ssh": {"root", "admin"},
"mongodb": {"root", "admin"},
"oracle": {"sys", "system", "admin", "test", "web", "orcl"},
"telnet": {"root", "admin", "test"},
"elastic": {"elastic", "admin", "kibana"},
"rabbitmq": {"guest", "admin", "administrator", "rabbit", "rabbitmq", "root"},
"kafka": {"admin", "kafka", "root", "test"},
"activemq": {"admin", "root", "activemq", "system", "user"},
"ldap": {"admin", "administrator", "root", "cn=admin", "cn=administrator", "cn=manager"},
"smtp": {"admin", "root", "postmaster", "mail", "smtp", "administrator"},
"imap": {"admin", "mail", "postmaster", "root", "user", "test"},
"pop3": {"admin", "root", "mail", "user", "test", "postmaster"},
"zabbix": {"Admin", "admin", "guest", "user"},
"rsync": {"rsync", "root", "admin", "backup"},
"cassandra": {"cassandra", "admin", "root", "system"},
"neo4j": {"neo4j", "admin", "root", "test"},
}
}
// getDefaultPasswords 获取默认密码字典
func getDefaultPasswords() []string {
return []string{
"123456", "admin", "admin123", "root", "", "pass123", "pass@123",
"password", "Password", "P@ssword123", "123123", "654321", "111111",
"123", "1", "admin@123", "Admin@123", "admin123!@#", "{user}",
"{user}1", "{user}111", "{user}123", "{user}@123", "{user}_123",
"{user}#123", "{user}@111", "{user}@2019", "{user}@123#4",
"P@ssw0rd!", "P@ssw0rd", "Passw0rd", "qwe123", "12345678", "test",
"test123", "123qwe", "123qwe!@#", "123456789", "123321", "666666",
"a123456.", "123456~a", "123456!a", "000000", "1234567890", "8888888",
"!QAZ2wsx", "1qaz2wsx", "abc123", "abc123456", "1qaz@WSX", "a11111",
"a12345", "Aa1234", "Aa1234.", "Aa12345", "a123456", "a123123",
"Aa123123", "Aa123456", "Aa12345.", "sysadmin", "system", "1qaz!QAZ",
"2wsx@WSX", "qwe123!@#", "Aa123456!", "A123456s!", "sa123456",
"1q2w3e", "Charge123", "Aa123456789", "elastic123",
}
}
// GetUserDict 获取指定服务的用户字典
func (sd *ServiceDictionary) GetUserDict(service string) []string {
sd.mu.RLock()
defer sd.mu.RUnlock()
service = strings.ToLower(service)
if users, exists := sd.userDict[service]; exists {
// 返回副本,避免外部修改
result := make([]string, len(users))
copy(result, users)
return result
}
// 返回默认的通用用户名
return []string{"admin", "root", "test", "user"}
}
// SetUserDict 设置指定服务的用户字典
func (sd *ServiceDictionary) SetUserDict(service string, users []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
service = strings.ToLower(service)
if len(users) > 0 {
// 创建副本,避免外部修改影响内部数据
usersCopy := make([]string, len(users))
copy(usersCopy, users)
sd.userDict[service] = usersCopy
}
}
// AddUsersToService 向指定服务添加用户名
func (sd *ServiceDictionary) AddUsersToService(service string, users []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
service = strings.ToLower(service)
if existing, exists := sd.userDict[service]; exists {
// 合并并去重
userSet := make(map[string]struct{})
for _, user := range existing {
userSet[user] = struct{}{}
}
for _, user := range users {
if user != "" {
userSet[user] = struct{}{}
}
}
// 转换回切片
result := make([]string, 0, len(userSet))
for user := range userSet {
result = append(result, user)
}
sd.userDict[service] = result
} else {
// 新服务,直接设置
sd.SetUserDict(service, users)
}
}
// GetAllUserDicts 获取所有服务的用户字典
func (sd *ServiceDictionary) GetAllUserDicts() map[string][]string {
sd.mu.RLock()
defer sd.mu.RUnlock()
result := make(map[string][]string)
for service, users := range sd.userDict {
usersCopy := make([]string, len(users))
copy(usersCopy, users)
result[service] = usersCopy
}
return result
}
// GetPasswords 获取默认密码字典
func (sd *ServiceDictionary) GetPasswords() []string {
sd.mu.RLock()
defer sd.mu.RUnlock()
// 返回副本,避免外部修改
result := make([]string, len(sd.passwords))
copy(result, sd.passwords)
return result
}
// SetPasswords 设置密码字典
func (sd *ServiceDictionary) SetPasswords(passwords []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
if len(passwords) > 0 {
// 创建副本
passwordsCopy := make([]string, len(passwords))
copy(passwordsCopy, passwords)
sd.passwords = passwordsCopy
}
}
// AddPasswords 添加密码到字典
func (sd *ServiceDictionary) AddPasswords(passwords []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
// 使用map去重
passwordSet := make(map[string]struct{})
for _, pwd := range sd.passwords {
passwordSet[pwd] = struct{}{}
}
for _, pwd := range passwords {
if pwd != "" {
passwordSet[pwd] = struct{}{}
}
}
// 转换回切片
result := make([]string, 0, len(passwordSet))
for pwd := range passwordSet {
result = append(result, pwd)
}
sd.passwords = result
}
// GetServiceNames 获取所有支持的服务名称
func (sd *ServiceDictionary) GetServiceNames() []string {
sd.mu.RLock()
defer sd.mu.RUnlock()
services := make([]string, 0, len(sd.userDict))
for service := range sd.userDict {
services = append(services, service)
}
return services
}
// HasService 检查是否支持指定服务
func (sd *ServiceDictionary) HasService(service string) bool {
sd.mu.RLock()
defer sd.mu.RUnlock()
_, exists := sd.userDict[strings.ToLower(service)]
return exists
}
// GetUserCount 获取指定服务的用户数量
func (sd *ServiceDictionary) GetUserCount(service string) int {
sd.mu.RLock()
defer sd.mu.RUnlock()
if users, exists := sd.userDict[strings.ToLower(service)]; exists {
return len(users)
}
return 0
}
// GetPasswordCount 获取密码数量
func (sd *ServiceDictionary) GetPasswordCount() int {
sd.mu.RLock()
defer sd.mu.RUnlock()
return len(sd.passwords)
}
// ResetToDefaults 重置为默认配置
func (sd *ServiceDictionary) ResetToDefaults() {
sd.mu.Lock()
defer sd.mu.Unlock()
sd.userDict = getDefaultUserDict()
sd.passwords = getDefaultPasswords()
}
// 全局服务字典实例
var (
globalServiceDict *ServiceDictionary
serviceDictOnce sync.Once
)
// GetGlobalServiceDict 获取全局服务字典实例
func GetGlobalServiceDict() *ServiceDictionary {
serviceDictOnce.Do(func() {
globalServiceDict = NewServiceDictionary()
})
return globalServiceDict
}