内网Mysql代理浅析
字数 1400 2025-08-22 12:23:47
内网MySQL代理技术分析与实现
0x00 使用场景
在内网渗透测试中,常见以下场景:
- 目标主机因防火墙限制,仅开放特定业务端口(如MySQL的3306端口)
- 其他反连和直连端口被全部禁用
- 虽然可以利用UDF执行命令,但操作十分不便
此时可以通过MySQL代理技术建立隧道,绕过防火墙限制,实现更灵活的访问控制。
0x01 技术原理
核心概念
-
MySQL UDF(User Defined Function)
- 允许用户通过C/C++编写自定义函数并加载到MySQL中执行
- 常用于执行系统命令、文件操作等高权限操作
-
Socket Reuse(套接字重用)
- 防火墙绕过技术
- 利用操作系统将套接字视为可重用或动态文件描述符的特性
- 通过检查现有套接字连接,将shell绑定到攻击流量使用的同一套接字上
- 避免需要开放新端口,绕过防火墙限制
技术组合
将MySQL UDF与Socket Reuse技术结合:
- 通过MySQL连接建立初始通信
- 使用UDF执行代理代码
- 重用现有MySQL连接套接字建立隧道
- 实现Socks5代理功能
0x02 实现过程与问题排查
代理工作流程
-
客户端(攻击端)流程:
- 连接MySQL数据库
- 调用
proxy_init函数,传入数据库连接socket的fd(通常为3) - 执行已加载的UDF函数
- 读取服务端返回的特定字符串确认执行成功
- 本地监听端口(如1337)
- 在两个fd(数据库连接和代理连接)间循环读写数据
-
服务端流程:
- 通过
getpeername遍历所有fd - 通过IP匹配客户端连接
- fork子进程执行payload
- 实现Socks5协议处理
- 通过
Socks5协议交互
-
认证阶段:
- 客户端发送:
05 01 00(版本5,1种认证方式,NOAUTH) - 服务端响应:
05 00(版本5,选择NOAUTH方式)
- 客户端发送:
-
命令阶段:
- 客户端发送:
05 01 00 01 7f 00 00 01 00 1605:版本号01:CONNECT命令00:保留字段01:IPv4地址类型7f 00 00 01:127.0.0.100 16:端口22
- 客户端发送:
关键问题排查
-
问题现象:
- 服务端在命令阶段无响应(无PSH ACK)
- 客户端最终发送FIN结束连接
-
根本原因:
- 服务端代码在读取Socks5命令时多读了一个
00字节 - 导致后续协议解析失败
- 具体表现为
socks5_invitation函数少读了一个字节
- 服务端代码在读取Socks5命令时多读了一个
-
解决方案:
- 修正读取逻辑,正确处理协议字节
- 确保命令解析从正确偏移开始
0x03 实际应用
代理建立步骤
- 加载UDF代理代码到目标MySQL服务器
- 执行代理初始化函数
- 使用proxychains等工具通过代理访问内网服务
proxychains ssh root@127.0.0.1
验证方法
- 网络抓包分析Socks5协议交互
- 检查代理端口是否正常监听
- 测试通过代理访问目标服务
0x04 防御建议
-
MySQL服务器防护:
- 限制UDF函数加载权限
- 监控异常UDF执行
- 限制MySQL用户权限
-
网络防护:
- 实施严格的出站连接控制
- 监控异常隧道流量
- 部署IDS/IPS检测代理行为
-
系统加固:
- 定期审计服务器进程和网络连接
- 限制系统调用和fork操作