Rogue Mysql Server源码解析:main函数工作流程与关键处理逻辑
【免费下载链接】rogue_mysql_serverA rouge mysql server supports reading files from most mysql libraries of multiple programming languages.项目地址: https://gitcode.com/gh_mirrors/ro/rogue_mysql_server
Rogue Mysql Server是一款支持从多种编程语言的mysql库中读取文件的伪装服务器工具。本文将深入解析其main函数的工作流程与核心处理逻辑,帮助开发者理解这款工具的底层实现机制。
一、程序初始化与配置加载
程序启动首先进入main函数,位于项目根目录的main.go文件中。初始化阶段主要完成三项核心任务:日志配置、命令行参数解析和配置文件加载。
日志系统采用logrus框架实现,设置了完整的时间戳格式和标准输出方向:
formatter := new(log.TextFormatter) formatter.FullTimestamp = true formatter.TimestampFormat = "2006-01-02 15:04:05" log.SetFormatter(formatter) log.SetOutput(os.Stdout)命令行参数解析支持两种模式:
-config:指定配置文件路径(默认使用当前目录下的config.yaml)-generate:生成默认配置文件模板到指定路径
配置文件采用YAML格式,定义了服务器核心参数,包括网络设置、文件读取规则、认证配置和JDBC漏洞利用选项等。配置加载失败会直接导致程序退出。
二、数据库对象初始化
配置加载完成后,程序创建DB结构体实例并初始化关键成员:
db := &DB{} db.fileIndex = make(map[uint32]int) db.Handler = db db.config = config db.YsoserialOutput = map[string][]byte{}如果启用了JDBC漏洞利用功能,程序会预先生成攻击载荷:
if config.JdbcExploit { for index, command := range config.YsoserialCommand { db.YsoserialOutput[index] = CmdExec(command) } }三、认证服务器配置
根据配置决定使用哪种认证方式:
- 启用认证时:使用
AuthServerStatic创建静态认证服务器,加载用户列表并对密码进行SHA1哈希处理 - 禁用认证时:使用
AuthServerNone允许匿名登录
认证服务器实现位于mysql/auth_server_static.go和mysql/auth_server_none.go文件中,通过接口抽象实现不同认证策略的灵活切换。
四、服务器启动流程
服务器启动的核心函数是mysql.NewListener,该函数位于mysql/server.go文件中,实现如下:
func NewListener(protocol, address string, authServer AuthServer, handler Handler, versionString string, connReadTimeout time.Duration, connWriteTimeout time.Duration) (*Listener, error) { listener, err := net.Listen(protocol, address) if err != nil { return nil, err } return NewFromListener(listener, authServer, handler, versionString, connReadTimeout, connWriteTimeout) }该函数创建TCP监听器并返回Listener实例,然后调用Accept()方法开始接受客户端连接:
db.listener, err = mysql.NewListener("tcp", fmt.Sprintf("%s:%s", config.Host, config.Port), authServer, db, config.VersionString, 0, 0) db.listener.Accept()五、连接处理与核心业务逻辑
DB结构体实现了mysql.Handler接口,主要处理三类事件:
1. 新连接建立(NewConnection)
记录客户端连接信息,包括地址、用户名和数据库名,并初始化文件索引计数器。同时检测客户端类型,如果是JDBC客户端则特殊标记。
2. 连接关闭(ConnectionClosed)
清理客户端相关资源,从文件索引映射中删除连接ID。
3. 查询处理(ComQuery)
这是最核心的业务逻辑实现,主要处理两种情况:
- JDBC漏洞利用:检测特定查询(如"SHOW SESSION STATUS"),返回预生成的攻击载荷
- 文件读取:根据配置规则确定目标文件路径,调用
RequestAndSaveFile方法读取客户端本地文件并保存
文件读取路径的确定逻辑支持两种模式:
- 从配置文件的FileList按顺序循环读取
- 从数据库名解析文件路径(需启用FromDatabaseName选项)
六、关键工具函数解析
1. 密码哈希(NativePassword)
实现MySQL原生密码哈希算法,使用SHA1进行两次哈希处理:
func NativePassword(password string) string { hash := sha1.New() hash.Write([]byte(password)) s1 := hash.Sum(nil) hash.Reset() hash.Write(s1) s2 := hash.Sum(nil) return fmt.Sprintf("*%s", strings.ToUpper(hex.EncodeToString(s2))) }2. 命令执行(CmdExec)
用于执行外部命令生成攻击载荷,支持ysoserial等工具的集成调用。
3. 文件名清理(sanitizeFilename)
过滤文件名中的特殊字符,防止路径遍历攻击,确保文件保存安全。
七、总结
Rogue Mysql Server的main函数通过清晰的模块化设计,实现了配置加载、认证管理、连接处理和核心业务逻辑的完整流程。其架构特点包括:
- 使用接口抽象(mysql.Handler)实现业务逻辑与网络层解耦
- 通过配置驱动不同功能模式,提高工具灵活性
- 针对不同客户端类型实施差异化处理策略
- 严格的错误处理和日志记录,便于问题排查
核心代码集中在main.go和mysql/server.go文件中,通过深入阅读这些源码,可以全面理解这款工具的工作原理和实现细节。
【免费下载链接】rogue_mysql_serverA rouge mysql server supports reading files from most mysql libraries of multiple programming languages.项目地址: https://gitcode.com/gh_mirrors/ro/rogue_mysql_server
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考