内网Mysql代理浅析
字数 1400 2025-08-22 12:23:47

内网MySQL代理技术分析与实现

0x00 使用场景

在内网渗透测试中,常见以下场景:

  • 目标主机因防火墙限制,仅开放特定业务端口(如MySQL的3306端口)
  • 其他反连和直连端口被全部禁用
  • 虽然可以利用UDF执行命令,但操作十分不便

此时可以通过MySQL代理技术建立隧道,绕过防火墙限制,实现更灵活的访问控制。

0x01 技术原理

核心概念

  1. MySQL UDF(User Defined Function)

    • 允许用户通过C/C++编写自定义函数并加载到MySQL中执行
    • 常用于执行系统命令、文件操作等高权限操作
  2. Socket Reuse(套接字重用)

    • 防火墙绕过技术
    • 利用操作系统将套接字视为可重用或动态文件描述符的特性
    • 通过检查现有套接字连接,将shell绑定到攻击流量使用的同一套接字上
    • 避免需要开放新端口,绕过防火墙限制

技术组合

将MySQL UDF与Socket Reuse技术结合:

  1. 通过MySQL连接建立初始通信
  2. 使用UDF执行代理代码
  3. 重用现有MySQL连接套接字建立隧道
  4. 实现Socks5代理功能

0x02 实现过程与问题排查

代理工作流程

  1. 客户端(攻击端)流程

    • 连接MySQL数据库
    • 调用proxy_init函数,传入数据库连接socket的fd(通常为3)
    • 执行已加载的UDF函数
    • 读取服务端返回的特定字符串确认执行成功
    • 本地监听端口(如1337)
    • 在两个fd(数据库连接和代理连接)间循环读写数据
  2. 服务端流程

    • 通过getpeername遍历所有fd
    • 通过IP匹配客户端连接
    • fork子进程执行payload
    • 实现Socks5协议处理

Socks5协议交互

  1. 认证阶段

    • 客户端发送:05 01 00 (版本5,1种认证方式,NOAUTH)
    • 服务端响应:05 00 (版本5,选择NOAUTH方式)
  2. 命令阶段

    • 客户端发送:05 01 00 01 7f 00 00 01 00 16
      • 05:版本号
      • 01:CONNECT命令
      • 00:保留字段
      • 01:IPv4地址类型
      • 7f 00 00 01:127.0.0.1
      • 00 16:端口22

关键问题排查

  1. 问题现象

    • 服务端在命令阶段无响应(无PSH ACK)
    • 客户端最终发送FIN结束连接
  2. 根本原因

    • 服务端代码在读取Socks5命令时多读了一个00字节
    • 导致后续协议解析失败
    • 具体表现为socks5_invitation函数少读了一个字节
  3. 解决方案

    • 修正读取逻辑,正确处理协议字节
    • 确保命令解析从正确偏移开始

0x03 实际应用

代理建立步骤

  1. 加载UDF代理代码到目标MySQL服务器
  2. 执行代理初始化函数
  3. 使用proxychains等工具通过代理访问内网服务
    proxychains ssh root@127.0.0.1
    

验证方法

  1. 网络抓包分析Socks5协议交互
  2. 检查代理端口是否正常监听
  3. 测试通过代理访问目标服务

0x04 防御建议

  1. MySQL服务器防护

    • 限制UDF函数加载权限
    • 监控异常UDF执行
    • 限制MySQL用户权限
  2. 网络防护

    • 实施严格的出站连接控制
    • 监控异常隧道流量
    • 部署IDS/IPS检测代理行为
  3. 系统加固

    • 定期审计服务器进程和网络连接
    • 限制系统调用和fork操作

0x05 参考资源

  1. 腾讯红蓝对抗文章
  2. MySQL Proxy技术分析
  3. mssqlproxy项目
  4. Socks5协议详解
  5. Socket-reuse技术
内网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 16 05 :版本号 01 :CONNECT命令 00 :保留字段 01 :IPv4地址类型 7f 00 00 01 :127.0.0.1 00 16 :端口22 关键问题排查 问题现象 : 服务端在命令阶段无响应(无PSH ACK) 客户端最终发送FIN结束连接 根本原因 : 服务端代码在读取Socks5命令时多读了一个 00 字节 导致后续协议解析失败 具体表现为 socks5_invitation 函数少读了一个字节 解决方案 : 修正读取逻辑,正确处理协议字节 确保命令解析从正确偏移开始 0x03 实际应用 代理建立步骤 加载UDF代理代码到目标MySQL服务器 执行代理初始化函数 使用proxychains等工具通过代理访问内网服务 验证方法 网络抓包分析Socks5协议交互 检查代理端口是否正常监听 测试通过代理访问目标服务 0x04 防御建议 MySQL服务器防护 : 限制UDF函数加载权限 监控异常UDF执行 限制MySQL用户权限 网络防护 : 实施严格的出站连接控制 监控异常隧道流量 部署IDS/IPS检测代理行为 系统加固 : 定期审计服务器进程和网络连接 限制系统调用和fork操作 0x05 参考资源 腾讯红蓝对抗文章 MySQL Proxy技术分析 mssqlproxy项目 Socks5协议详解 Socket-reuse技术