优雅地降落在目标 Microsoft SQL Server (MS SQL) DBMS 上,就像手持香槟杯乘坐商务航班一样。🥂

MSSQLand 是一个 C# Microsoft SQL Server (MSSQL / MS SQL) 后渗透工具,专为红队操作人员设计。它旨在通过你的 Beacon 直接在目标环境内运行(例如,在 Cobalt Strike 或 Havoc 中使用 execute-assembly,或任何 dotnet 命令),让你能够遍历链接服务器链,模拟沿途遇到的任何登录账户,并从最后一跳执行任何期望的操作。所有操作均具有最小的 OPSEC 足迹,且无需外部依赖。
OPENQUERY / EXEC ATEXECUTE AS LOGIN,支持级联多用户模拟cm-* 操作用于 Microsoft Configuration Manager 数据库的侦察与利用[!TIP] MSSQLand 使用 .NET Framework 4.8 构建,考虑程序集执行,并使用当前上下文。如果需要使用 NT/LM 哈希或 Kerberos 票据进行连接,请参阅哈希传递。
[!NOTE] 不要忘记基础。在安全评估期间,有时使用 SQL Server Management Studio (SSMS) 会更简单。
MSSQLand.exe [options] <host> [options] <action> [action-options]
MSSQLand.exe <host> --probe
全局标志(-c、-l、--debug 等)可放在任何位置,包括操作名称之后;操作后无法识别的标记将原样传递给操作。
[!NOTE] 省略
<action>仅执行连接测试。它会进行身份验证然后退出,不运行任何查询。非常适合在最小 OPSEC 足迹下验证凭据。
[!TIP] 避免手动输入所有 RPC Out 或 OPENQUERY 调用。让工具通过
-l参数处理任何链接服务器链,让你专注于大局。
格式:server:port/user@database 或任意组合 server/user@database:port。
server(必需)- SQL Server 主机名或 IP:port(可选)- 端口号(默认:1433,也常见:1434、14333、2433)/user(可选)- 在此服务器上要模拟的用户("execute as login")
/user1/user2/user3 执行 EXECUTE AS LOGIN = 'user1'; EXECUTE AS LOGIN = 'user2'; EXECUTE AS LOGIN = 'user3';/user 将一个新的模拟上下文推入安全栈@database(可选)- 数据库上下文# 连接探测:检查服务器是否存活,无需身份验证
MSSQLand.exe localhost --probe
# 仅连接测试(不执行操作,进行身份验证后退出)
MSSQLand.exe localhost -c token
# 执行特定操作
MSSQLand.exe localhost -c token info
MSSQLand.exe localhost:1434@db03 -c token info
MSSQLand.exe LAB-SQL01@AdventureWorks -c token tables -n Customer
使用 -l 标志并通过分号 (;) 作为分隔符来链接多个 SQL 服务器:
-l SQL01;SQL02/user;SQL03@database
语法:
;) - 分隔链中的服务器/) - 指定要模拟的用户("execute as login")
/user1/user2 执行连续模拟@) - 指定数据库上下文[...]) - 用于保护服务器名称不被分隔符分割示例:
# 简单链
-l SQL01;SQL02;SQL03
# 带模拟和数据库
-l SQL01/admin;SQL02;SQL03/manager@clients
# 级联模拟(在 SQL01 上先模拟 user1,再模拟 user2)
-l SQL01/user1/user2;SQL02;SQL03
# 混合级联(SQL01:user1→user2,SQL03:user3→user4→user5)
-l SQL01/user1/user2;SQL02;SQL03/user3/user4/user5@database
# 服务器名可包含连字符、点号(无需括号)
-l SQL-01;SERVER.001;HOST.DOMAIN.COM
# 仅当服务器名包含分隔符字符时才需要括号
-l [SERVER;PROD];SQL02;[SQL03@clients]@clientdb
[!NOTE] 端口规范(
:port)仅适用于初始主机连接。链接服务器链(-l)使用在sys.servers中配置的链接服务器名称,而不是hostname:port组合。
这些模式无需身份验证,可在获得凭据之前使用。
SQL Server 浏览器服务监听 UDP 1434,并响应发现请求,返回主机上运行的 SQL Server 实例列表,包括其名称、版本和 TCP 端口。当目标在动态端口上运行命名实例时,这非常有用,无需猜测或扫描。
# 查询特定主机上的 SQL Browser 服务(UDP 1434)
MSSQLand.exe LAB-SQL03 --browse
Active Directory 通过存储在计算机和服务帐户上的服务主体名称 (SPN) 公开 SQL Server 注册。MSSQLand 通过 LDAP 查询 AD 中的 MSSQLSvc/* SPN,以枚举域内的 SQL Server 实例,或通过全局编录枚举整个林。
# 通过 LDAP 在 Active Directory 中查找 SQL Server(当前域)
MSSQLand.exe --findsql
# 针对特定域
MSSQLand.exe --findsql pgd.lab
# 通过全局编录(端口 3268)进行林范围搜索
MSSQLand.exe --findsql pgd.lab --gc
发现是多层的。详情请参阅 FindSqlServers.cs。
SQL Server 浏览器也响应 UDP 广播数据包(UDP 1434),允许发现本地子网上所有自我广告的 SQL Server 实例。
# 本地网络上的广播发现(UDP 1434)
MSSQLand.exe --broadcast
MSSQLand.exe --broadcast --timeout 5
[!TIP] 当 SQL Server 运行在未加入域的机器上,因此不会出现在任何 LDAP 或 SPN 查询中时,这尤其有用。考虑独立服务器、开发机器或在内部 VLAN 上启动的 rogue 实例。
使用 TDS 协议握手(不仅仅是 TCP SYN)验证开放端口是否对应活着的 SQL Server 实例。仅当端口响应 TDS 预登录数据包时才报告。
MSSQLand.exe LAB-SQL03 --portscan
MSSQLand.exe LAB-SQL03 --portscan --all # 查找所有实例(完整临时范围)
MSSQLand.exe LAB-SQL03 --portscan 65184 # 单个端口
MSSQLand.exe LAB-SQL03 --portscan 65180-65190 # 端口范围
MSSQLand.exe LAB-SQL03 --portscan 1433,5000,65184 # 逗号分隔列表
MSSQLand 作为 .NET 程序集在 Beacon 内运行,并且始终使用当前执行上下文进行身份验证(-c token)。当你拥有哈希时,正确的方法是先在 Beacon 级别伪造一个令牌,然后正常运行 MSSQLand。System.Data.SqlClient 会透明地继承该令牌,无需自定义 TDS 实现。
在 MSSQLand 内部从头实现 NTLMv2 意味着:
System.Data.SqlClient(涉及大量套接字、TLS 和 NTLM 代码)。如果你需要从外部位置使用 Kerberos 票据或 NT/LM 哈希进行身份验证,mssqlclient-ng 是正确的工具。这是一个为 Unix 端访问构建的 Python 3 客户端,可以轻松与从 Beacon 建立的 SOCKS5 代理配对。
如果你在 Windows 主机上运行 MSSQLand,但需要通过 Linux 环境(Hyper-V VM、VMware 或 WSL)访问 SQL Server 目标,你可以使用 socat 轻松转发连接:
sudo socat TCP4-LISTEN:1433,fork,reuseaddr TCP:10.10.11.90:1433
此命令在你的 Linux 机器上监听端口 1433,并将所有流量转发到目标 SQL Server 10.10.11.90:1433。然后你可以从 Windows 主机将 MSSQLand 连接到你的 Linux VM 的 IP。
-h 或 --help - 显示所有可用操作-h search_term - 过滤操作(例如,-h adsi 显示所有 ADSI 相关操作)localhost -c token createuser -h - 显示特定操作的详细帮助MSSQLand 包含对 Microsoft Configuration Manager(原 SCCM / MECM)利用和侦察的全面支持。当你能够访问 ConfigMgr 数据库服务器时,可以利用专门的操作进行设备智能(例如,cm-devices)或基础设施映射。
所有 ConfigMgr 操作使用 cm- 前缀(例如,cm-scripts、cm-package),以与微软的官方 PowerShell cmdlet 命名约定(Get-CM*、Set-CM* 等)保持一致。
该工具的输出带有时间戳和有价值的上下文信息,旨在产生美观且专业的结果,非常适合为你任何报告(例如,客户交付物、内部报告、红队评估)捕获高质量的截图。
所有输出表格都兼容 Markdown,可以直接复制粘贴到你的笔记中,无需任何格式麻烦。
[!TIP] 你也可以使用
--format csv选项获得.csv兼容输出:MSSQLand.exe localhost -c token --format csv --silent procedures > procedures.csv
欢迎并感谢任何贡献!无论是修复错误、添加新功能、改进文档还是分享反馈,你的努力都很有价值且能带来改变。 开源依赖于协作和认可。无论是大是小,贡献都有助于改进工具及其社区。你的时间和努力真正受到重视。
在这里,没有人会从 Git 历史中被抹去。这里无需害怕。没有人会不遵守开源协作精神而复制粘贴你的代码。
请参阅 CONTRIBUTING.md 以获取详细的入门指南。
如果你想知道为什么存在这个工具,而不是作为其他 SQL Server 项目的贡献,请参阅 ORIGIN.md。
本工具严格仅用于防御性安全研究、教育和授权的渗透测试。 在针对任何你不拥有的系统运行此软件之前,你必须拥有明确的书面授权。
本工具仅用于教育目的,旨在帮助安全专业人员在授权参与中理解和测试 SQL Server 环境的安全性。
可接受的环境包括:
滥用本项目可能导致法律诉讼。
在现实环境或未获得系统所有者明确许可的情况下,未经授权使用本工具的任何行为均被严格禁止,并可能违反法律和道德标准。本工具的创建者和贡献者不对任何误用或造成的损害负责。
请负责任且合乎道德地使用。始终遵守法律并获得适当的授权。