复用1433端口进行内网渗透
字数 1302 2025-08-11 08:36:00
MSSQL端口复用内网渗透技术详解
一、技术背景
在高度隔离的网络环境中,当ACL(访问控制列表)严格限制只允许访问目标的MSSQL端口(默认1433)时,传统的渗透方法可能失效。本文介绍一种通过MSSQL CLR功能实现端口复用的内网渗透技术。
二、技术原理
1. 核心机制
- 利用MSSQL的CLR(Common Language Runtime)功能加载自定义程序集
- 通过CLR加载C语言编写的SOCKS5代理DLL(reciclador.dll)
- 使用文件描述符爆破技术复用现有TCP连接
2. 相关概念
- CLR集成:SQL Server允许通过.NET语言编写存储过程、函数等
- 端口复用:在已有连接上承载额外通信通道的技术
- 文件描述符爆破:尝试不同文件描述符值来寻找可复用的连接
三、工具准备
1. 项目地址
- 原始项目:https://github.com/0xdf-0xdf/mssqlproxy/
- 修复版项目:https://github.com/djhons/mssqlproxy/
2. 环境要求
- 目标SQL Server版本:2017以下版本需特殊处理
- 需要具备SQL Server管理员权限(加载CLR需要
UNSAFE权限)
四、实施步骤
1. 部署代理组件
-- 启用CLR集成
sp_configure 'clr enabled', 1
RECONFIGURE
-- 设置数据库为可信任(加载非签名程序集需要)
ALTER DATABASE [当前数据库] SET TRUSTWORTHY ON
-- 创建程序集
CREATE ASSEMBLY [Reciclador] FROM 'C:\path\to\reciclador.dll' WITH PERMISSION_SET = UNSAFE
-- 创建存储过程
CREATE PROCEDURE [dbo].[sp_socks5]
@port int
AS EXTERNAL NAME [Reciclador].[StoredProcedures].[sp_socks5]
2. 启动SOCKS5代理
-- 启动代理监听指定端口
EXEC sp_socks5 1080
3. 客户端连接
使用任意SOCKS5客户端连接目标SQL Server的1433端口,通过建立的代理通道进行内网渗透。
五、常见问题与修复
1. 文件下载问题
现象:下载文件大小为0,但下载时间随文件大小增加
修复:修改代码中的文件写入方式为:
f.write(bytes.fromhex(data.decode()))
2. SQL Server版本兼容性
问题:SQL Server 2017+使用TRIM()函数,旧版本不支持
解决方案:将代码中的TRIM()替换为LTRIM(RTRIM())
3. CPU占用100%
原因:reciclador.dll在网络异常时进入死循环
修复方法:
- 将错误处理中的
return 1改为return -1 - 增加发送成功判断逻辑
4. 文件描述符不可用问题
现象:爆破出的文件描述符可能不可用
解决方案:多次尝试运行脚本,直到找到可用的文件描述符
六、技术限制与注意事项
- 稳定性问题:由于采用文件描述符爆破技术,连接可能不稳定
- 权限要求:需要足够权限加载非签名CLR程序集
- 性能影响:可能导致SQL Server性能下降
- 检测风险:异常CLR加载可能触发安全告警
- 版本兼容性:不同SQL Server版本可能需要调整代码
七、防御建议
- 限制CLR集成功能的使用
- 监控非标准程序集的加载行为
- 实施最小权限原则,避免不必要的数据库权限
- 定期审计数据库中的可疑存储过程和程序集
- 启用SQL Server的登录审计功能
八、扩展思考
- 类似技术可应用于其他支持自定义代码执行的数据库系统(如MySQL的UDT功能)
- 端口复用技术可绕过严格的网络隔离策略
- 文件描述符爆破技术在其他场景下的应用可能性
通过以上技术,可以在高度受限的网络环境中建立隐蔽的通信通道,为后续内网渗透提供可能。